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

تدريب: تبديل السجلات

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

في بعض الأحيان تحتاج إلى تبديل القيم بين سجلين. على سبيل المثال، إذا كان rax يحتوي على 5 و rbx يحتوي على 10، فبعد التبديل يجب أن يكون rax هو 10 و rbx هو 5.

لا يمكنك القيام بذلك باستخدام تعليمة MOV واحدة أو تعليمتين. أنت بحاجة إلى سجل ثالث كمخزن مؤقت.

لماذا لا يمكنك القيام بذلك مباشرة:

; هذا لا يعمل
mov rax, rbx   ; الآن rax = 10، لكن الـ 5 الأصلية فُقدت للأبد
mov rbx, rax   ; الآن rbx أيضاً = 10 (وليس 5)

الطريقة الصحيحة — استخدام سجل مؤقت:

mov rcx, rax   ; الخطوة 1: حفظ قيمة rax الأصلية في rcx (rcx = 5)
mov rax, rbx   ; الخطوة 2: نسخ rbx إلى rax (rax = 10)
mov rbx, rcx   ; الخطوة 3: نسخ القيمة المحفوظة من rcx إلى rbx (rbx = 5)

خطوة بخطوة:

الخطوةالتعليمةraxrbxrcx
البداية(قبل أي كود)510?
1mov rcx, rax5105
2mov rax, rbx10105
3mov rbx, rcx1055

بعد هذه التعليمات الثلاث، يتم تبديل القيم. لا يزال السجل المؤقت rcx يحتوي على القيمة الأصلية (5)، ولكن هذا لا بأس به.

يمكن أن يكون السجل المؤقت أي سجل لا تستخدمه:

  • يمكنك استخدام rcx، أو rdx، أو r8، أو أي سجل متاح
  • فقط تأكد من أنك لست بحاجة إلى القيمة الأصلية في ذلك السجل

لماذا يهم هذا:

تبديل القيم هو عملية شائعة في خوارزميات الفرز ومعالجة البيانات. فهو يعلمك التفكير بعناية في ترتيب تعليمات MOV.

challenge icon

التحدي

اكتب ثلاثة أسطر من لغة التجميع (assembly) لتبديل القيم بين r8 و r9.

القيم الأولية (مقدمة من بيئة الاختبار):

  • r8 يبدأ بـ 6
  • r9 يبدأ بـ 2

بعد الكود الخاص بك:

  • r8 يجب أن يكون 2
  • r9 يجب أن يكون 6

استخدم r10 كمسجل مؤقت خاص بك.

جرّب بنفسك

section .data
    msg_r8 db 'r8 = '
    msg_r8_len equ $ - msg_r8
    msg_r9 db 'r9 = '
    msg_r9_len equ $ - msg_r9
    newline db 0xa

section .bss
    digit resb 1

section .text
    global _start

_start:
    ; تعيين القيم الأولية
    mov r8, 6
    mov r9, 2
    
    %include "solution.asm"       ; كود التبديل الخاص بالطالب يوضع هنا
    
    ; حفظ القيم للطباعة
    mov r12, r8
    mov r13, r9
    
    ; طباعة "r8 = "
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_r8
    mov rdx, msg_r8_len
    syscall
    
    ; طباعة قيمة r8
    mov rax, r12
    add rax, 48
    mov [digit], al
    mov rax, 1
    mov rdi, 1
    mov rsi, digit
    mov rdx, 1
    syscall
    
    ; طباعة سطر جديد
    mov rax, 1
    mov rdi, 1
    mov rsi, newline
    mov rdx, 1
    syscall
    
    ; طباعة "r9 = "
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_r9
    mov rdx, msg_r9_len
    syscall
    
    ; طباعة قيمة r9
    mov rax, r13
    add rax, 48
    mov [digit], al
    mov rax, 1
    mov rdi, 1
    mov rsi, digit
    mov rdx, 1
    syscall
    
    ; طباعة سطر جديد
    mov rax, 1
    mov rdi, 1
    mov rsi, newline
    mov rdx, 1
    syscall
    
    ; خروج
    mov rax, 60
    mov rdi, 0
    syscall
quiz iconاختبر نفسك

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

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