تدريب: تبديل السجلات
جزء من قسم الأساسيات في رحلة 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)خطوة بخطوة:
| الخطوة | التعليمة | rax | rbx | rcx |
|---|---|---|---|---|
| البداية | (قبل أي كود) | 5 | 10 | ? |
| 1 | mov rcx, rax | 5 | 10 | 5 |
| 2 | mov rax, rbx | 10 | 10 | 5 |
| 3 | mov rbx, rcx | 10 | 5 | 5 |
بعد هذه التعليمات الثلاث، يتم تبديل القيم. لا يزال السجل المؤقت rcx يحتوي على القيمة الأصلية (5)، ولكن هذا لا بأس به.
يمكن أن يكون السجل المؤقت أي سجل لا تستخدمه:
- يمكنك استخدام
rcx، أوrdx، أوr8، أو أي سجل متاح - فقط تأكد من أنك لست بحاجة إلى القيمة الأصلية في ذلك السجل
لماذا يهم هذا:
تبديل القيم هو عملية شائعة في خوارزميات الفرز ومعالجة البيانات. فهو يعلمك التفكير بعناية في ترتيب تعليمات MOV.
التحدي
اكتب ثلاثة أسطر من لغة التجميع (assembly) لتبديل القيم بين r8 و r9.
القيم الأولية (مقدمة من بيئة الاختبار):
r8يبدأ بـ 6r9يبدأ بـ 2
بعد الكود الخاص بك:
r8يجب أن يكون 2r9يجب أن يكون 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يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
2أنظمة العد
لماذا النظام الثنائي؟الأعداد الثنائيةمن العشري إلى الثنائيلماذا النظام الست عشري؟من الست عشري إلى العشريمن العشري إلى الست عشريASCII والست عشري5استدعاء النظام Exit Syscall
ما هو الـ Syscall؟استدعاء النظام Exit Syscall (60)رموز الخروج (Exit Codes)ملخص: الخروج النظيف (Clean Exit)3التعليمة الأولى - MOV
ما هي MOV؟MOV المباشرةMOV من سجل إلى سجلMOV من الذاكرة إلى السجلMOV من السجل إلى الذاكرةLEA - تحميل العنوانMOV بأحجام مختلفةتدريب: تبديل السجلاتملخص: تحدي MOV