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 yazmaç arasındaki değerleri takas etmeniz gerekir. Örneğin, eğer rax 5 ve rbx 10 değerini içeriyorsa, takas işleminden sonra rax 10 ve rbx 5 olmalıdır.

Bunu bir veya iki MOV talimatı ile yapamazsınız. Geçici depolama olarak üçüncü bir register'a ihtiyacınız var.

Bunu neden doğrudan yapamazsınız:

; Bu yöntem işe yaramaz
mov rax, rbx   ; Şimdi rax = 10, ancak orijinal 5 değeri sonsuza dek kayboldu
mov rbx, rax   ; Şimdi rbx de = 10 (5 değil)

Doğru yöntem — geçici bir yazmaç kullanarak:

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

Adım adım:

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

Bu üç talimattan sonra değerler yer değiştirir. Geçici yazmaç rcx hala orijinal değeri (5) içeriyor, ancak bu sorun değil.

Geçici yazmaç, kullanmadığınız herhangi bir yazmaç olabilir:

  • rcx, rdx, r8 veya mevcut herhangi bir yazmacı kullanabilirsiniz
  • Sadece o yazmaçtaki orijinal değere ihtiyacınız olmadığından emin olun

Bunun önemi:

Değerlerin yerini değiştirmek, sıralama algoritmalarında ve veri manipülasyonunda yaygın bir işlemdir. Size MOV talimatlarının sırası hakkında dikkatlice düşünmeyi öğretir.

challenge icon

Görev

r8 ve r9 arasındaki değerleri takas etmek için üç satır assembly kodu yazın.

Başlangıç değerleri (test donanımı tarafından sağlanır):

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

Kodunuzdan sonra:

  • r8 2 olmalıdır
  • r9 6 olmalıdır

Geçici kaydediciniz olarak r10 kullanın.

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 ata
    mov r8, 6
    mov r9, 2
    
    %include "solution.asm"       ; Öğrencinin yer değiştirme (swap) kodu buraya gelir
    
    ; Yazdırmak 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