Latihan: Tukar Register
Termasuk bagian Dasar-Dasar dalam perjalanan Assembly di Coddy. Pelajaran 21 dari 45.
Terkadang kamu perlu menukar nilai antara dua register. Misalnya, jika rax berisi 5 dan rbx berisi 10, setelah ditukar, rax seharusnya berisi 10 dan rbx seharusnya berisi 5.
Kamu tidak bisa melakukan ini dengan satu atau dua instruksi MOV. Kamu memerlukan register ketiga sebagai penyimpanan sementara.
Mengapa kamu tidak bisa melakukannya secara langsung:
; Ini TIDAK berhasil
mov rax, rbx ; Sekarang rax = 10, tetapi nilai awal 5 hilang selamanya
mov rbx, rax ; Sekarang rbx juga = 10 (bukan 5)Method yang benar: menggunakan register sementara:
mov rcx, rax ; Langkah 1: Simpan nilai awal rax ke rcx (rcx = 5)
mov rax, rbx ; Langkah 2: Salin rbx ke rax (rax = 10)
mov rbx, rcx ; Langkah 3: Salin nilai yang disimpan di rcx ke rbx (rbx = 5)Langkah demi langkah:
| Langkah | Instruksi | rax | rbx | rcx |
|---|---|---|---|---|
| Mulai | (sebelum kode apa pun) | 5 | 10 | ? |
| 1 | mov rcx, rax | 5 | 10 | 5 |
| 2 | mov rax, rbx | 10 | 10 | 5 |
| 3 | mov rbx, rcx | 10 | 5 | 5 |
Setelah tiga instruksi ini, nilainya bertukar. Register sementara rcx masih berisi nilai asli (5), tetapi itu tidak masalah.
Register sementara bisa berupa register apa pun yang tidak sedang kamu gunakan:
- Kamu bisa menggunakan
rcx,rdx,r8, atau register apa pun yang tersedia - Pastikan saja kamu tidak membutuhkan nilai asli dalam register tersebut
Mengapa ini penting:
Menukar nilai adalah operasi umum dalam algoritma pengurutan dan manipulasi data. Hal ini mengajarkan kamu untuk memikirkan urutan instruksi MOV dengan cermat.
Tantangan
Tulis tiga baris assembly untuk menukar nilai antara r8 dan r9.
Nilai awal (disediakan oleh test harness):
r8dimulai dengan 6r9dimulai dengan 2
Setelah kodemu dijalankan:
r8seharusnya bernilai 2r9seharusnya bernilai 6
Gunakan r10 sebagai register sementara.
Coba sendiri
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:
; Tetapkan nilai awal
mov r8, 6
mov r9, 2
%include "solution.asm" ; Letakkan kode penukar nilai milikmu di sini
; Simpan nilai untuk dicetak
mov r12, r8
mov r13, r9
; Cetak "r8 = "
mov rax, 1
mov rdi, 1
mov rsi, msg_r8
mov rdx, msg_r8_len
syscall
; Cetak nilai r8
mov rax, r12
add rax, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 1
syscall
; Cetak baris baru
mov rax, 1
mov rdi, 1
mov rsi, newline
mov rdx, 1
syscall
; Cetak "r9 = "
mov rax, 1
mov rdi, 1
mov rsi, msg_r9
mov rdx, msg_r9_len
syscall
; Cetak nilai r9
mov rax, r13
add rax, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 1
syscall
; Cetak baris baru
mov rax, 1
mov rdi, 1
mov rsi, newline
mov rdx, 1
syscall
; Keluar
mov rax, 60
mov rdi, 0
syscallPelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Dasar-Dasar
3Instruksi Pertama: MOV
Apa Itu MOV?MOV dengan Nilai LangsungMOV dari Register ke RegisterMOV dari Memori ke RegisterMOV dari Register ke MemoriLEA: Muat AlamatMOV dengan Ukuran BerbedaLatihan: Tukar RegisterUlasan: Tantangan MOVLatihan sendiri: Playground Assembly