MOV بأحجام مختلفة
جزء من قسم الأساسيات في رحلة Assembly على Coddy — الدرس 20 من 45.
لقد استخدمت بالفعل al (8 بت) و rax (64 بت). ولكن هناك أحجام أخرى أيضًا. تحتوي السجلات المختلفة على كميات مختلفة من البيانات.
عائلات سجلات x86-64:
| السجل | الحجم | البتات | متى يُستخدم |
|---|---|---|---|
rax | 8 بايت | 64 بت | الأرقام الكاملة، العناوين، أرقام استدعاءات النظام (syscall) |
eax | 4 بايت | 32 بت | النصف السفلي من rax |
ax | 2 بايت | 16 بت | النصف السفلي من eax |
al | 1 بايت | 8 بت | النصف السفلي من ax (البتات 0-7) |
ah | 1 بايت | 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 الأخرى دون تغييرعندما تقوم بنقل قيمة أصغر إلى مسجل (register) أكبر، تظل البتات العلوية كما هي. قد يتسبب هذا في نتائج غير متوقعة.
القاعدة الآمنة:
في هذه الدورة حتى الآن، جميع البيانات في الذاكرة هي 1 بايت. لهذا السبب تستخدم al (ليس rax).
عندما تقوم بنقل البيانات، يجب أن يتطابق حجم السجل مع حجم الذاكرة:
- 1 بايت من الذاكرة ← استخدم
al،bl،cl، إلخ. - 8 بايت من الذاكرة ← استخدم
rax،rbx،rcx، إلخ.
ستتعلم عن أحجام الذاكرة المختلفة في الفصل 3.
التحدي
لديك عناوين البيانات هذه التي تم إنشاؤها بالفعل:
source— يحتوي على قيمة بحجم 1-byte (5)destination— مساحة فارغة (1 byte)
اكتب سطرين من لغة التجميع (assembly) للقيام بما يلي:
- تحميل القيمة من
sourceإلىal - تخزين القيمة من
alفيdestination
جرّب بنفسك
section .data
msg db 'destination = '
msg_len equ $ - msg
section .bss
digit resb 1
section .text
global _start
_start:
; كود الطالب يعمل أولاً (يُحمل من المصدر، ويُخزن في الوجهة)
%include "solution.asm"
; تحميل القيمة المخزنة من الوجهة
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يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
2أنظمة العد
لماذا النظام الثنائي؟الأعداد الثنائيةمن العشري إلى الثنائيلماذا النظام الست عشري؟من الست عشري إلى العشريمن العشري إلى الست عشريASCII والست عشري5استدعاء النظام Exit Syscall
ما هو الـ Syscall؟استدعاء النظام Exit Syscall (60)رموز الخروج (Exit Codes)ملخص: الخروج النظيف (Clean Exit)3التعليمة الأولى - MOV
ما هي MOV؟MOV المباشرةMOV من سجل إلى سجلMOV من الذاكرة إلى السجلMOV من السجل إلى الذاكرةLEA - تحميل العنوانMOV بأحجام مختلفةتدريب: تبديل السجلاتملخص: تحدي MOV