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