Menu
Coddy logo textTech

Pratik: Yazmaçları Takas Etme

Coddy'nin Assembly Journey'sinin Temeller bölümünün bir parçası. Ders 21 / 45.

Bazen iki register arasındaki values değerlerini swap etmeniz gerekir. Örneğin, rax 5 ve rbx 10 içeriyorsa, swap işleminden sonra rax 10 ve rbx 5 olmalıdır.

Bunu bir veya iki MOV komutuyla yapamazsın. temporary storage olarak üçüncü bir register gerekir.

Neden bunu doğrudan yapamazsınız:

; Bu ÇALIŞMAZ
mov rax, rbx   ; Şimdi rax = 10, ama orijinal 5 sonsuza kadar gitti
mov rbx, rax   ; Şimdi rbx de = 10 (5 değil)

Doğru yöntem: geçici register kullanmak:

mov rcx, rax   ; Adım 1: Orijinal rax'ı rcx'e kaydet (rcx = 5)
mov rax, rbx   ; Adım 2: rbx'i rax'e kopyala (rax = 10)
mov rbx, rcx   ; Adım 3: Kaydedilen değeri rcx'ten rbx'e kopyala (rbx = 5)

Step adım adım:

StepTalimatraxrbxrcx
Başlangıç(herhangi bir koddan önce)510?
1mov rcx, rax5105
2mov rax, rbx10105
3mov rbx, rcx1055

Bu üç talimattan sonra values değiştirilir. temporary register rcx hâlâ original değeri (5) içerir, ancak bu sorun değil.

temporary register, using olmadığınız herhangi bir register olabilir:

  • rcx, rdx, r8 veya kullanılabilir herhangi bir register kullanabilirsiniz
  • Sadece o register içindeki original value değerine ihtiyaç duymadığınızdan emin olun

Bu neden önemli:

values değiştirmek, sıralama algoritmalarında ve veri işlemelerinde yaygın bir işlemdir. Bu, MOV talimatlarının sırasını dikkatlice düşünmeyi öğretir.

challenge icon

Görev

r8 ve r9 arasındaki değerleri değiştirmek için üç assembly satırı yaz.

Initial değerler (test harness tarafından sağlanır):

  • r8 6 ile başlar
  • r9 2 ile başlar

Kodundan sonra:

  • r8 2 olmalı
  • r9 6 olmalı

Geçici register olarak r10 kullan.

Kendin dene

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:
    ; Başlangıç değerlerini ayarla
    mov r8, 6
    mov r9, 2
    
    %include "solution.asm"       ; Öğrencinin swap kodu buraya gelir
    
    ; Yazdırma için değerleri kaydet
    mov r12, r8
    mov r13, r9
    
    ; "r8 = " yazdır
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_r8
    mov rdx, msg_r8_len
    syscall
    
    ; r8 değerini yazdır
    mov rax, r12
    add rax, 48
    mov [digit], al
    mov rax, 1
    mov rdi, 1
    mov rsi, digit
    mov rdx, 1
    syscall
    
    ; Yeni satır yazdır
    mov rax, 1
    mov rdi, 1
    mov rsi, newline
    mov rdx, 1
    syscall
    
    ; "r9 = " yazdır
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_r9
    mov rdx, msg_r9_len
    syscall
    
    ; r9 değerini yazdır
    mov rax, r13
    add rax, 48
    mov [digit], al
    mov rax, 1
    mov rdi, 1
    mov rsi, digit
    mov rdx, 1
    syscall
    
    ; Yeni satır yazdır
    mov rax, 1
    mov rdi, 1
    mov rsi, newline
    mov rdx, 1
    syscall
    
    ; Çıkış
    mov rax, 60
    mov rdi, 0
    syscall
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Temeller bölümündeki tüm dersler

Kendi başına pratik yap: Assembly playground