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:
| Register | Ukuran | Bit | Kapan digunakan |
|---|---|---|---|
rax | 8 byte | 64 bit | Angka penuh, alamat, nomor syscall |
eax | 4 byte | 32 bit | Setengah bagian bawah rax |
ax | 2 byte | 16 bit | Setengah bagian bawah eax |
al | 1 byte | 8 bit | Setengah bagian bawah ax (bit 0-7) |
ah | 1 byte | 8 bit | Setengah bagian atas ax (bit 8-15) |
Pola yang sama berlaku untuk register lainnya:
| 64-bit | 32-bit | 16-bit | 8-bit (rendah) |
|---|---|---|---|
rbx | ebx | bx | bl |
rcx | ecx | cx | cl |
rdx | edx | dx | dl |
rsi | esi | si | sil |
rdi | edi | di | dil |
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 berubahSaat 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.
Tantangan
Alamat data ini sudah dibuat:
source: berisi nilai 1 byte (5)destination: ruang kosong (1 byte)
Tulis dua baris assembly untuk:
- Memuat nilai dari
sourceke dalamal - Menyimpan nilai dari
alke dalamdestination
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
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