Menu
CoddyTech

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

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

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

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

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

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 נשארים ללא שינוי

כתיבה לאוגר של 8 או 16 סיביות (al, ah, ax) משנה רק את הסיביות האלה, ושאר הסיביות של האוגר המלא נשארות ללא שינוי. כתיבה לאוגר של 32 סיביות שונה: mov eax, 0xFF מאפסת את הסיביות 32-63, ולכן rax הופך ל-0xFF. הדבר עלול לגרום לתוצאות בלתי צפויות.

הכלל הבטוח:

עד כה בקורס הזה, כל הנתונים בזיכרון הם בגודל בית אחד. לכן משתמשים ב־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 אונליין