MOV בגדלים שונים
חלק מהיחידה יסודות במסלול ה-Assembly של Coddy. שיעור 20 מתוך 45.
כבר השתמשת ב־al (8 סיביות) וב־rax (64 סיביות). אבל יש גם גדלים אחרים. אוגרים שונים יכולים להכיל כמויות שונות של נתונים.
משפחות האוגרים של x86-64:
| אוגר | גודל | סיביות | מתי להשתמש |
|---|---|---|---|
rax | 8 בתים | 64 סיביות | מספרים מלאים, כתובות, מספרי קריאות מערכת |
eax | 4 בתים | 32 סיביות | החצי התחתון של rax |
ax | 2 בתים | 16 סיביות | החצי התחתון של eax |
al | בית אחד | 8 סיביות | החצי התחתון של ax (סיביות 0-7) |
ah | בית אחד | 8 סיביות | החצי העליון של ax (סיביות 8-15) |
אותה תבנית חלה גם על אוגרים אחרים:
| 64 סיביות | 32 סיביות | 16 סיביות | 8 סיביות (נמוכות) |
|---|---|---|---|
rbx | ebx | bx | bl |
rcx | ecx | cx | cl |
rdx | edx | dx | dl |
rsi | esi | si | sil |
rdi | edi | di | dil |
למה הגודל חשוב:
כשמעבירים נתונים, הגדלים של המקור והיעד צריכים להתאים. אם הם אינם תואמים, ה-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.
אתגר
כתובות הנתונים האלה כבר נוצרו:
source: מכיל ערך בגודל בית אחד (5)destination: שטח ריק (בית אחד)
כתוב שתי שורות באסמבלי כדי:
- לטעון את הערך מ־
sourceאלal - לאחסן את הערך מ־
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השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה יסודות
3ההוראה הראשונה – MOV
מהו MOV?MOV מיידיMOV מאוגר לאוגרMOV מזיכרון לאוגרMOV מאוגר לזיכרוןLEA – טעינת כתובתMOV בגדלים שוניםתרגול: החלפת אוגריםסיכום: אתגר MOVתרגלו בעצמכם: Assembly אונליין