MOV بأحجام مختلفة
جزء من قسم الأساسيات في رحلة Assembly على Coddy. الدرس 20 من 45.
لقد استخدمت بالفعل al (8 بتات) وrax (64 بتًا). لكن توجد أحجام أخرى أيضًا. تستوعب السجلات المختلفة كميات مختلفة من data.
عائلات السجلات في x86-64:
| السجل | الحجم | البتات | متى تُستخدم |
|---|---|---|---|
rax | 8 بايت | 64 بت | الأرقام الكاملة، والعناوين، وأرقام syscall |
eax | 4 بايت | 32 بت | النصف السفلي من rax |
ax | 2 بايت | 16 بت | النصف السفلي من eax |
al | 1 بايت | 8 بت | النصف السفلي من ax (bits 0-7) |
ah | 1 بايت | 8 بت | النصف العلوي من ax (bits 8-15) |
ينطبق النمط نفسه على السجلات الأخرى:
| 64 بت | 32 بت | 16 بت | 8 بت (الجزء low) |
|---|---|---|---|
rbx | ebx | bx | bl |
rcx | ecx | cx | cl |
rdx | edx | dx | dl |
rsi | esi | si | sil |
rdi | edi | di | dil |
لماذا يهم الحجم:
عندما تنقل data، يجب أن يتطابق حجما source وdestination. وإذا لم يتطابقا، فقد تقوم وحدة المعالجة المركزية بما يلي:
- نسخ جزء فقط من data
- نسخ وحدات بايت إضافية من ذاكرة غير معروفة
- التسبب في حدوث خطأ
أمثلة على الأحجام المتطابقة:
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 الأخرى تبقى دون تغييرعندما تنقل قيمة أصغر إلى مسجل أكبر، فإن upper bits stay كما هي. قد يسبب هذا نتائج غير متوقعة.
القاعدة الآمنة:
حتى الآن في هذه الدورة، جميع البيانات الموجودة في الذاكرة حجمها 1 بايت. ولهذا السبب تستخدم al (وليس rax).
عند نقل data، يجب أن يتطابق حجم السجل مع حجم الذاكرة:
- 1 byte من الذاكرة → استخدم
al،bl،cl، إلخ. - 8 bytes من الذاكرة → استخدم
rax،rbx،rcx، إلخ.
ستتعرّف على أحجام الذاكرة المختلفة في الفصل 3.
التحدي
لديك عناوين البيانات التالية التي تم إنشاؤها مسبقًا:
source: تحتوي على قيمة بحجم 1 بايت (5)destination: مساحة فارغة (1 بايت)
اكتب سطرين من لغة التجميع من أجل:
- Load القيمة من
sourceإلىal - Store القيمة من
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يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
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