Menu
Coddy logo textTech

תרגול: החלפת אוגרים

חלק מהיחידה יסודות במסלול ה-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

אתגר

כתבו שלוש שורות באסמבלי כדי להחליף את הערכים בין 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בחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה יסודות

תרגלו בעצמכם: Assembly אונליין