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

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

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

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

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

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

; هذا لا يعمل
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)

Step بخطوة:

Stepالتعليماتraxrbxrcx
البداية(قبل أي تعليمات برمجية)510?
1mov rcx, rax5105
2mov rax, rbx10105
3mov rbx, rcx1055

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

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

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

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

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

challenge icon

التحدي

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

القيم initial (يوفرها إطار الاختبار):

  • r8 يبدأ بالقيمة 6
  • r9 يبدأ بالقيمة 2

بعد تنفيذ التعليمات البرمجية:

  • r8 يجب أن تكون قيمته 2
  • r9 يجب أن تكون قيمته 6

استخدم r10 كسجل temporary.

جرّب بنفسك

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اختبر نفسك

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

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

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