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