Menu
CoddyTech

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:

LangkahInstruksiraxrbxrcx
Mulai(sebelum kode apa pun)510?
1mov rcx, rax5105
2mov rax, rbx10105
3mov rbx, rcx1055

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.

challenge icon

Tantangan

Tulis tiga baris assembly untuk menukar nilai antara r8 dan r9.

Nilai awal (disediakan oleh test harness):

  • r8 dimulai dengan 6
  • r9 dimulai dengan 2

Setelah kodemu dijalankan:

  • r8 seharusnya bernilai 2
  • r9 seharusnya 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
    syscall
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Dasar-Dasar

Latihan sendiri: Playground Assembly