תרגול: החלפת אוגרים
חלק מהיחידה יסודות במסלול ה-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.
אתגר
כתבו שלוש שורות באסמבלי כדי להחליף את הערכים בין 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השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה יסודות
3ההוראה הראשונה – MOV
מהו MOV?MOV מיידיMOV מאוגר לאוגרMOV מזיכרון לאוגרMOV מאוגר לזיכרוןLEA – טעינת כתובתMOV בגדלים שוניםתרגול: החלפת אוגריםסיכום: אתגר MOVתרגלו בעצמכם: Assembly אונליין