LEA - تحميل العنوان
جزء من قسم الأساسيات في رحلة Assembly على Coddy. الدرس 19 من 45.
حتى الآن، استخدمت mov لتحميل القيم من الذاكرة إلى السجلات. لكن في بعض الأحيان لا تريد القيمة. بل تريد address نفسها.
تشير LEA إلى Load العنوان الفعّال. فهي تحسب عنوانًا في الذاكرة وتضع ذلك العنوان في register، من دون الوصول إلى الذاكرة.
البنية النحوية:
lea register, [address]MOV مقابل LEA:
| التعليمة | ما الذي تفعله |
|---|---|
mov al, [number] | تذهب إلى الذاكرة، وتحصل على القيمة الموجودة بداخلها، وتضعها في al |
lea rsi, [number] | لا تذهب إلى الذاكرة. تحسب العنوان الخاص بـ number وتضعه في rsi |
فكّر فيها بهذه الطريقة:
mov= افتح الصندوق وخذ ما بداخلهlea= دوّن رقم الصندوق (address) على قطعة من الورق
مثال:
number db 42 ; القيمة 42 مخزّنة في عنوان ما
mov al, [number] ; al = 42 (القيمة)
lea rsi, [number] ; rsi = عنوان number (مثلاً، 0x402000)لماذا تحتاج إلى LEA؟
في لغة التجميع، عندما تريد طباعة سلسلة نصية أو تمرير موقع في الذاكرة إلى دالة، فأنت تحتاج إلى address، وليس القيمة. يتوقع استدعاء النظام write (الذي ستتعلّمه في الفصل 5) وجود address في 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يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
2أنظمة العد
لماذا النظام الثنائي؟الأعداد الثنائيةمن العشري إلى الثنائيلماذا النظام الست عشري؟من الست عشري إلى العشريمن العشري إلى الست عشريASCII والست عشري5استدعاء النظام Exit Syscall
ما هو الـ Syscall؟استدعاء النظام Exit Syscall (60)رموز الخروج (Exit Codes)ملخص: الخروج النظيف (Clean Exit)3التعليمة الأولى - MOV
ما هي MOV؟MOV المباشرةMOV من سجل إلى سجلMOV من الذاكرة إلى السجلMOV من السجل إلى الذاكرةLEA - تحميل العنوانMOV بأحجام مختلفةتدريب: تبديل السجلاتملخص: تحدي MOVتدرّب بنفسك: Playground لـ Assembly