Kompilasi oleh : Reza Ervani bin Asmanu
Pengetahuan tentang Register adalah hal yang wajib bagi seorang Low-Level Programmer. Berikut ini kami sajkan tabel register untuk arsitektur x86 secara lengkap sebagai cheat sheet bagi mereka yang sedang belajar programming di level sistem
📚 TABEL REGISTER x86 16-bit LENGKAP (Real Mode)
| No | Register | Size | Sub-register | Category | Purpose | Bisa Diubah? |
|---|---|---|---|---|---|---|
| 1 | AX | 16-bit | AH (8-bit high) AL (8-bit low) | General | Accumulator (Aritmatika utama) | ✅ |
| 2 | BX | 16-bit | BH (8-bit high) BL (8-bit low) | General | Base (Pointer ke data/memory) | ✅ |
| 3 | CX | 16-bit | CH (8-bit high) CL (8-bit low) | General | Counter (Loop, shift count) | ✅ |
| 4 | DX | 16-bit | DH (8-bit high) DL (8-bit low) | General | Data (I/O, multiply/divide) | ✅ |
| 5 | SI | 16-bit | – | Pointer | Source Index | ✅ |
| 6 | DI | 16-bit | – | Pointer | Destination Index | ✅ |
| 7 | BP | 16-bit | – | Pointer | Base Pointer (stack frame) | ✅ |
| 8 | SP | 16-bit | – | Pointer | Stack Pointer | ✅ |
| 9 | CS | 16-bit | – | Segment | Code Segment | ❌ (hanya via far jump) |
| 10 | DS | 16-bit | – | Segment | Data Segment | ✅ |
| 11 | ES | 16-bit | – | Segment | Extra Segment | ✅ |
| 12 | SS | 16-bit | – | Segment | Stack Segment | ✅ |
| 13 | IP | 16-bit | – | Special | Instruction Pointer | ❌ (hanya via control flow) |
| 14 | FLAGS | 16-bit | – | Special | Status Flags | ❌ (hanya via operations) |
🎯 TOTAL COUNT:
- 14 Register Utama (16-bit)
- +8 Sub-register 8-bit (AH/AL, BH/BL, CH/CL, DH/DL)
- = 22 “nama” yang bisa Anda akses dalam kode
🔍 DETAIL SUB-REGISTER:
1. AX dan kawan-kawan:
HIGH BYTE LOW BYTE
AX (16-bit): [ AH | AL ]
BX (16-bit): [ BH | BL ]
CX (16-bit): [ CH | CL ]
DX (16-bit): [ DH | DL ]
2. Cara kerjanya:
mov ax, 0x1234 ; Set AX = 0x1234
; Otomatis: AH = 0x12, AL = 0x34
mov al, 0x56 ; Ubah AL saja → AX = 0x1256
mov ah, 0x78 ; Ubah AH saja → AX = 0x7856
3. Sub-register tidak independen!
mov ax, 0x1234 ; AX = 0x1234, AH=0x12, AL=0x34
mov al, 0xFF ; AX sekarang = 0x12FF
; AH tetap 0x12, AL jadi 0xFF
; JADI: Mengubah AL/AH mengubah AX, dan sebaliknya!
📊 TABEL FLAGS REGISTER (16-bit) DETAIL:
| Bit | Nama | Arti jika = 1 | Penting untuk |
|---|---|---|---|
| 0 | CF | Carry Flag | Arithmetic overflow/borrow |
| 1 | (reserved) | – | – |
| 2 | PF | Parity Flag | Hasil punya bit 1 genap |
| 3 | (reserved) | – | – |
| 4 | AF | Auxiliary Carry | BCD arithmetic |
| 5 | (reserved) | – | – |
| 6 | ZF | Zero Flag | Hasil = 0 |
| 7 | SF | Sign Flag | Hasil negatif (bit tertinggi = 1) |
| 8 | TF | Trap Flag | Single-step mode (debugging) |
| 9 | IF | Interrupt Flag | Interrupt enabled |
| 10 | DF | Direction Flag | String ops: 0=inc, 1=dec |
| 11 | OF | Overflow Flag | Signed arithmetic overflow |
| 12-15 | (reserved) | – | – |
🎮 CONTOH PENGGUNAAN SEMUA REGISTER:
[org 0x7c00]
start:
; 1. General Registers (AX/BX/CX/DX)
mov ax, 0x1234 ; AX = 0x1234
mov bh, 0xAB ; BH = 0xAB → BX = ??AB (BL tidak disentuh)
mov cl, 10 ; CL = 10 (counter untuk loop)
mov dl, 0x80 ; DL = 0x80 (drive number untuk disk)
; 2. Sub-register untuk BIOS
mov ah, 0x0E ; AH = BIOS function
mov al, 'A' ; AL = karakter
; 3. Pointer Registers
mov si, pesan ; SI = source pointer
mov di, 0x1000 ; DI = destination pointer
mov bp, sp ; BP = frame pointer
; SP diatur otomatis
; 4. Segment Registers
xor ax, ax
mov ds, ax ; DS = 0
mov es, ax ; ES = 0
mov ss, ax ; SS = 0
mov sp, 0x7C00 ; SP = stack pointer
; 5. CS:IP sudah diatur BIOS
; CS = 0x0000 (atau 0x07C0), IP = 0x7C00 (atau 0x0000)
; 6. Flags diatur oleh operasi
cmp ax, bx ; Set ZF, CF, SF, OF, etc
je equal ; Jump jika ZF = 1
; String operation dengan DI/SI
movsb ; [ES:DI] = [DS:SI], SI++, DI++
equal:
hlt
pesan db 'Hello', 0
times 510-($-$$) db 0
dw 0xAA55
⚠️ CATATAN PENTING:
1. Sub-register hanya untuk AX/BX/CX/DX
mov si, data ; ✅
; mov sh, 0x12 ; ❌ TIDAK ADA! SI tidak punya sub-register
; mov sl, 0x34 ; ❌ TIDAK ADA!
2. 32-bit mode punya EAX/EBX/ECX/EDX
Di Protected Mode 32-bit:
- EAX = 32-bit (extended AX)
- AX = lower 16-bit of EAX
- AH/AL = tetap sama
3. Special behavior:
; CL khusus untuk shift/rotate count
mov cl, 3
shl ax, cl ; Shift AX left 3 bits
; DX khusus untuk I/O ports
mov dx, 0x3F8 ; COM1 port
in al, dx ; Read from port
✨ TABEL SUPER LENGKAP (VISUAL):
REGISTER HIERARCHY:
16-bit REAL MODE:
┌─────────────────────────────────────────────────────┐
│ AX BX CX DX │
│ [AH][AL] [BH][BL] [CH][CL] [DH][DL] │
│ 8 8 8 8 8 8 8 8 bits │
├─────────────────────────────────────────────────────┤
│ SI DI BP SP │
│ (no sub) (no sub) (no sub) (no sub) │
├─────────────────────────────────────────────────────┤
│ CS DS ES SS │
│ (segment) (segment) (segment) (segment) │
├─────────────────────────────────────────────────────┤
│ IP FLAGS │
│ (instr ptr) (status) │
└─────────────────────────────────────────────────────┘
32-bit PROTECTED MODE (nanti):
EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, EIP, EFLAGS
Jadi tabel sebelumnya kurang lengkap karena tidak menyertakan AH/AL dkk. Sekarang sudah lengkap! 🎯
Kesimpulan: x86 punya 14 register utama + 8 sub-register 8-bit = total 22 “nama” yang bisa Anda gunakan dalam kode assembly!
