LEA – טעינת כתובת
חלק מהיחידה יסודות במסלול ה-Assembly של Coddy. שיעור 19 מתוך 45.
עד כה השתמשת ב־mov כדי לטעון ערכים מהזיכרון לאוגרים. אבל לפעמים אינך רוצה את הערך. אתה רוצה את הכתובת עצמה.
LEA הוא קיצור של Load Effective Address. הוא מחשב כתובת זיכרון ומכניס אותה לאוגר, מבלי לגשת לזיכרון.
תחביר:
lea register, [address]MOV לעומת LEA:
| הוראה | מה היא עושה |
|---|---|
mov al, [number] | ניגשת לזיכרון, מקבלת את הערך שבתוכו ומכניסה אותו ל־al |
lea rsi, [number] | לא ניגשת לזיכרון. מחשבת את הכתובת של number ומכניסה אותה ל־rsi |
חשוב על זה כך:
mov= פותחים את הקופסה ולוקחים את מה שבתוכהlea= רושמים את מספר הקופסה (הכתובת) על פיסת נייר
דוגמה:
number db 42 ; הערך 42 מאוחסן בכתובת כלשהי
mov al, [number] ; al = 42 (הערך)
lea rsi, [number] ; rsi = הכתובת של number (למשל, 0x402000)למה צריך את LEA?
באסמבלי, כשאתה רוצה להדפיס מחרוזת או להעביר מיקום בזיכרון לפונקציה, דרושה לך הכתובת, ולא הערך. קריאת המערכת write (שתלמד בפרק 5) מצפה לכתובת בתוך rsi.
מה LEA יכולה לעשות (מעבר לכתובות פשוטות):
LEA יכולה גם לבצע חשבון בסיסי עם כתובות. לדוגמה:
lea rsi, [number + 5] ; rsi = הכתובת של number + 5 בתיםזה שימושי לעבודה עם מערכים ומבני נתונים.
אתגר
כתוב שורת אסמבלי אחת כדי לטעון את הכתובת של message לאוגר rsi.
נסו בעצמכם
section .data
msg_prefix db 'message = '
prefix_len equ $ - msg_prefix
section .text
global _start
_start:
; הפקודה lea של התלמיד מתבצעת ראשונה
; rsi אמור כעת להכיל את הכתובת של message
; הדפס את הקידומת
mov rax, 1
mov rdi, 1
mov rsi, msg_prefix
mov rdx, prefix_len
syscall
%include "solution.asm"
; הדפס את המחרוזת באמצעות הכתובת שהתלמיד טען
mov rax, 1
mov rdi, 1
; rsi כבר מכיל את הכתובת (מהקוד של התלמיד)
mov rdx, 6 ; "Hello" + ירידת שורה = 6 בתים
syscall
; יציאה
mov rax, 60
mov rdi, 0
syscallהשיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה יסודות
3ההוראה הראשונה – MOV
מהו MOV?MOV מיידיMOV מאוגר לאוגרMOV מזיכרון לאוגרMOV מאוגר לזיכרוןLEA – טעינת כתובתMOV בגדלים שוניםתרגול: החלפת אוגריםסיכום: אתגר MOVתרגלו בעצמכם: Assembly אונליין