Menu
CoddyTech

MOV dengan Ukuran Berbeda

Termasuk bagian Dasar-Dasar dalam perjalanan Assembly di Coddy. Pelajaran 20 dari 45.

Kamu sudah menggunakan al (8 bit) dan rax (64 bit). Namun, ada ukuran lainnya juga. Register yang berbeda menampung jumlah data yang berbeda.

Keluarga register x86-64:

RegisterUkuranBitKapan digunakan
rax8 byte64 bitAngka penuh, alamat, nomor syscall
eax4 byte32 bitSetengah bagian bawah rax
ax2 byte16 bitSetengah bagian bawah eax
al1 byte8 bitSetengah bagian bawah ax (bit 0-7)
ah1 byte8 bitSetengah bagian atas ax (bit 8-15)

Pola yang sama berlaku untuk register lainnya:

64-bit32-bit16-bit8-bit (rendah)
rbxebxbxbl
rcxecxcxcl
rdxedxdxdl
rsiesisisil
rdiedididil

Mengapa ukuran penting:

Saat kamu memindahkan data, ukuran sumber dan tujuan harus sama. Jika tidak sama, CPU mungkin:

  • Hanya menyalin sebagian data
  • Menyalin byte tambahan dari memori yang tidak diketahui
  • Menyebabkan error

Contoh ukuran yang cocok:

mov rax, 1000        ; 64-bit ke 64-bit (sesuai)
mov eax, 1000        ; 32-bit ke 32-bit (sesuai)
mov ax, 1000         ; 16-bit ke 16-bit (sesuai)
mov al, 5            ; 8-bit ke 8-bit (sesuai)

Apa yang terjadi jika ukurannya tidak cocok:

mov rax, 0x123456789ABC   ; nilai 64-bit
mov al, 0xFF              ; al mendapat 0xFF, bit lain pada rax tetap tidak berubah

Saat kamu memindahkan nilai yang lebih kecil ke register yang lebih besar, bit bagian atas tetap sama. Hal ini dapat menyebabkan hasil yang tidak terduga.

Aturan yang aman:

Sejauh ini dalam kursus ini, semua data di memori berukuran 1 byte. Itulah sebabnya kamu menggunakan al (bukan rax).

Saat memindahkan data, ukuran register harus sesuai dengan ukuran memori:

  • 1 byte memori → gunakan al, bl, cl, dan sebagainya.
  • 8 byte memori → gunakan rax, rbx, rcx, dan sebagainya.

Kamu akan mempelajari berbagai ukuran memori di Bab 3.

challenge icon

Tantangan

Alamat data ini sudah dibuat:

  • source: berisi nilai 1 byte (5)
  • destination: ruang kosong (1 byte)

Tulis dua baris assembly untuk:

  1. Memuat nilai dari source ke dalam al
  2. Menyimpan nilai dari al ke dalam destination

Coba sendiri

section .data
    msg db 'destination = '
    msg_len equ $ - msg

section .bss
    digit resb 1

section .text
    global _start

_start:
    ; Kodemu berjalan lebih dulu (memuat dari source, menyimpan ke destination)
    
    %include "solution.asm"
    
    ; Muat nilai yang tersimpan di destination
    mov al, [destination]
    
    ; Simpan nilainya
    mov r12, rax
    
    ; Cetak "destination = "
    mov rax, 1
    mov rdi, 1
    mov rsi, msg
    mov rdx, msg_len
    syscall
    
    ; Cetak nilainya
    mov rax, r12
    add rax, 48
    mov [digit], al
    mov rax, 1
    mov rdi, 1
    mov rsi, digit
    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