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ım | Komut | rax | rbx | rcx |
|---|---|---|---|---|
| Başlangıç | (herhangi bir koddan önce) | 5 | 10 | ? |
| 1 | mov rcx, rax | 5 | 10 | 5 |
| 2 | mov rax, rbx | 10 | 10 | 5 |
| 3 | mov rbx, rcx | 10 | 5 | 5 |
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,r8veya 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.
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):
r86 ile başlarr92 ile başlar
Kodunuzdan sonra:
r82 olmalıdırr96 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
syscallBu 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
3İlk komut - MOV
MOV nedir?MOV Anlık DeğerMOV Yazmaçtan YazmacaMOV Bellekten YazmacaMOV Yazmaçtan BelleğeLEA - Adres YüklemeFarklı Boyutlarla MOVPratik: Yazmaçları Takas EtmeÖzet: MOV Meydan Okuması