Menu
Coddy logo textTech

MOV בגדלים שונים

חלק מהיחידה יסודות במסלול ה-Assembly של Coddy. שיעור 20 מתוך 45.

כבר השתמשת ב־al (8 סיביות) וב־rax (64 סיביות). אבל יש גם גדלים אחרים. אוגרים שונים יכולים להכיל כמויות שונות של נתונים.

משפחות האוגרים של x86-64:

אוגרגודלסיביותמתי להשתמש
rax8 בתים64 סיביותמספרים מלאים, כתובות, מספרי קריאות מערכת
eax4 בתים32 סיביותהחצי התחתון של rax
ax2 בתים16 סיביותהחצי התחתון של eax
alבית אחד8 סיביותהחצי התחתון של ax (סיביות 0-7)
ahבית אחד8 סיביותהחצי העליון של ax (סיביות 8-15)

אותה תבנית חלה גם על אוגרים אחרים:

64 סיביות32 סיביות16 סיביות8 סיביות (נמוכות)
rbxebxbxbl
rcxecxcxcl
rdxedxdxdl
rsiesisisil
rdiedididil

למה הגודל חשוב:

כשמעבירים נתונים, הגדלים של המקור והיעד צריכים להתאים. אם הם אינם תואמים, ה-CPU עשוי:

  • להעתיק רק חלק מהנתונים
  • להעתיק בתים נוספים מזיכרון לא ידוע
  • לגרום לשגיאה

דוגמאות לגדלים תואמים:

mov rax, 1000        ; מ-64 ביט ל-64 ביט (תקין)
mov eax, 1000        ; מ-32 ביט ל-32 ביט (תקין)
mov ax, 1000         ; מ-16 ביט ל-16 ביט (תקין)
mov al, 5            ; מ-8 ביט ל-8 ביט (תקין)

מה קורה כשגדלי הערכים אינם תואמים:

mov rax, 0x123456789ABC   ; ערך של 64 ביט
mov al, 0xFF              ; al מקבל את 0xFF, שאר הביטים של rax נשארים ללא שינוי

כשמעבירים ערך קטן יותר לאוגר גדול יותר, הביטים העליונים נשארים ללא שינוי. הדבר עלול לגרום לתוצאות בלתי צפויות.

הכלל הבטוח:

עד כה בקורס הזה, כל הנתונים בזיכרון הם בגודל בית אחד. לכן משתמשים ב־al (ולא ב־rax).

כשמעבירים נתונים, גודל האוגר חייב להתאים לגודל הזיכרון:

  • בית אחד של זיכרון → יש להשתמש ב־al, bl, cl וכו׳.
  • 8 בתים של זיכרון → יש להשתמש ב־rax, rbx, rcx וכו׳.

תלמדו על גדלים שונים של זיכרון בפרק 3.

challenge icon

אתגר

כתובות הנתונים האלה כבר נוצרו:

  • source: מכיל ערך בגודל בית אחד (5)
  • destination: שטח ריק (בית אחד)

כתוב שתי שורות באסמבלי כדי:

  1. לטעון את הערך מ־source אל al
  2. לאחסן את הערך מ־al אל destination

נסו בעצמכם

section .data
    msg db 'destination = '
    msg_len equ $ - msg

section .bss
    digit resb 1

section .text
    global _start

_start:
    ; הקוד של התלמיד רץ ראשון (טוען מ-source, שומר ב-destination)
    
    %include "solution.asm"
    
    ; טען את הערך השמור מ-destination
    mov al, [destination]
    
    ; שמור אותו
    mov r12, rax
    
    ; הדפס "destination = "
    mov rax, 1
    mov rdi, 1
    mov rsi, msg
    mov rdx, msg_len
    syscall
    
    ; הדפס את הערך
    mov rax, r12
    add rax, 48
    mov [digit], al
    mov rax, 1
    mov rdi, 1
    mov rsi, digit
    mov rdx, 1
    syscall
    
    ; צא
    mov rax, 60
    mov rdi, 0
    syscall
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה יסודות

תרגלו בעצמכם: Assembly אונליין