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

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

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

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

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

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

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

64 بت32 بت16 بت8 بت (الجزء low)
rbxebxbxbl
rcxecxcxcl
rdxedxdxdl
rsiesisisil
rdiedididil

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

عندما تنقل 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.

challenge icon

التحدي

لديك عناوين البيانات التالية التي تم إنشاؤها مسبقًا:

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

اكتب سطرين من لغة التجميع من أجل:

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

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

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

تدرّب بنفسك: Playground لـ Assembly