Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

MOV بأحجام مختلفة

جزء من قسم الأساسيات في رحلة Assembly على Coddy — الدرس 20 من 45.

لقد استخدمت بالفعل al (8 بت) و rax (64 بت). ولكن هناك أحجام أخرى أيضًا. تحتوي السجلات المختلفة على كميات مختلفة من البيانات.

عائلات سجلات x86-64:

السجلالحجمالبتاتمتى يُستخدم
rax8 بايت64 بتالأرقام الكاملة، العناوين، أرقام استدعاءات النظام (syscall)
eax4 بايت32 بتالنصف السفلي من rax
ax2 بايت16 بتالنصف السفلي من eax
al1 بايت8 بتالنصف السفلي من ax (البتات 0-7)
ah1 بايت8 بتالنصف العلوي من ax (البتات 8-15)

ينطبق النمط نفسه على السجلات الأخرى:

64-بت32-بت16-بت8-بت (منخفض)
rbxebxbxbl
rcxecxcxcl
rdxedxdxdl
rsiesisisil
rdiedididil

لماذا يهم الحجم:

عندما تقوم بنقل البيانات، يجب أن يتطابق حجم المصدر والوجهة. إذا لم يتطابقا، فقد يقوم المعالج (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.

challenge icon

التحدي

لديك عناوين البيانات هذه التي تم إنشاؤها بالفعل:

  • source — يحتوي على قيمة بحجم 1-byte (5)
  • destination — مساحة فارغة (1 byte)

اكتب سطرين من لغة التجميع (assembly) للقيام بما يلي:

  1. تحميل القيمة من source إلى al
  2. تخزين القيمة من 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
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس الأساسيات