Mengenal blok diagram internal 8086, memahami fungsi setiap register, dan konsep pipeline sederhana.
Capaian Pembelajaran Bab Ini
Setelah mempelajari bab ini, mahasiswa mampu menggambar blok diagram internal 8086 (EU & BIU), menjelaskan fungsi setiap register (umum, indeks, pointer, segmen, flag), serta memahami konsep pipeline sederhana pada 8086.
Intel 8086 memiliki arsitektur internal yang dibagi menjadi dua unit fungsional yang bekerja secara paralel. Ini adalah inovasi penting yang memungkinkan overlapped processing (pipeline), sehingga meningkatkan kecepatan dibandingkan prosesor generasi sebelumnya.
Bus Interface Unit (BIU)
Address Adder
Segment Registers (CS, DS, SS, ES)
Instruction Pointer (IP)
Instruction Queue (6 Bytes)
Bus Control Logic
External Address Bus (20-bit)
External Data Bus (16-bit)
Control Bus
Execution Unit (EU)
ALU (16-bit)
General Registers AX, BX, CX, DX
Pointer & Index SP, BP, SI, DI
Flag Register (16-bit)
EU Control System
Internal Communication Bus
Menghubungkan EU dan BIU. EU menerima instruksi dari Queue, BIU menerima permintaan alamat/data dari EU.
Gambar 2.1: Blok Diagram Arsitektur Internal Intel 8086.
Execution Unit (EU)
• Mengeksekusi instruksi (decode + execute)
• Mengandung ALU, register, flag, EU control
• Menerima instruksi dari queue BIU
• Tidak pernah akses memori langsung
Bus Interface Unit (BIU)
• Fetch instruksi dan isi queue
• Hitung alamat fisik (segment + offset)
• Kendalikan bus alamat, data, kontrol
• Menyimpan CS, DS, SS, ES, IP
2.2 Execution Unit (EU)
EU bertanggung jawab atas seluruh proses eksekusi. Komponen-komponennya:
ALU
Arithmetic Logic Unit
Melakukan semua operasi aritmatika (penjumlahan, pengurangan, perkalian, pembagian) dan logika (AND, OR, XOR, NOT, shift, rotate). Menerima input dari register, menghasilkan output ke register, dan memperbarui bit-bit flag sesuai hasil operasi.
REG
Register-Register (8 buah, 16-bit)
Menyimpan data sementara, alamat, dan hasil operasi. Detail lengkapnya di sub-bab 2.5 dan 2.6.
FLG
Flag Register (16-bit)
Menyimpan status hasil operasi. Detail per-bit di sub-bab 2.8.
CTL
EU Control System
Menerima instruksi dari queue, melakukan decode, lalu menghasilkan sinyal kendali internal yang mengarahkan ALU, register, dan data path untuk menjalankan instruksi tersebut.
Perhatian penting: EU tidak pernah berkomunikasi langsung dengan memori eksternal. EU selalu menerima instruksi dari queue BIU dan mengirim permintaan baca/tulis melalui BIU. Inilah yang memungkinkan keduanya bekerja paralel.
2.3 Bus Interface Unit (BIU)
BIU bertanggung jawab atas seluruh komunikasi dengan memori eksternal dan perangkat I/O.
IQ
Instruction Queue (6 byte FIFO)
Buffer FIFO yang menyimpan instruksi yang sudah di-fetch. BIU secara otomatis mengisi queue selama EU sibuk. Ketika EU butuh instruksi, diambil dari queue tanpa menunggu akses memori. Jika queue penuh (6 byte terisi), BIU menunggu EU mengosongkan sebelum melanjutkan fetch.
SEG
Segment Registers (4 buah)
CS (Code), DS (Data), SS (Stack), ES (Extra). Detail di sub-bab 2.7.
IP
Instruction Pointer (16-bit)
Menyimpan offset instruksi berikutnya dalam segmen kode. Dipasangkan dengan CS untuk membentuk alamat fisik CS:IP. Bertambah otomatis saat BIU mengambil instruksi. Tidak bisa diakses langsung oleh programmer.
ADD
Address Adder
Melakukan perhitungan alamat fisik 20-bit: Fisik = Segment × 16 + Offset. Operasi ×16 dilakukan dengan menggeser register segmen 4 bit ke kiri.
BUS
Bus Control Logic
Menghasilkan sinyal kendali untuk bus alamat (20 bit), bus data (16 bit), dan bus kontrol (READ, WRITE, ALE, DEN, DT/R, M/IO, dll).
2.4 Perhitungan Alamat Fisik
Ini adalah konsep paling kritis pada 8086 — bagaimana prosesor 16-bit bisa mengakses 1 MB memori (20-bit).
Rumus
Alamat Fisik=Segment×16+Offset
Contoh
Segment
Offset
Perhitungan
Alamat Fisik
1
1234H
5678H
12340H + 5678H
179B8H
2
2000H
0010H
20000H + 0010H
20010H
3
0A000H
FFFFH
0A0000H + FFFFH
19FFFH
Kenapa × 16?
Mengalikan dengan 16 desimal (bukan 16 bit) sama saja dengan menggeser register 4 bit ke kiri, atau menambahkan satu digit nol heksadesimal di belakang. Contoh: 1234H × 16 = 12340H.
Berapa memori yang bisa diakses?
Bus alamat 20-bit menghasilkan 220 = 1.048.576 alamat unik = 1 MB. Dari 00000H sampai FFFFFH.
2.5 Register Umum: AX, BX, CX, DX
Keempat register ini bisa diakses sebagai 16-bit penuh atau dua register 8-bit terpisah.
AH
AL
AX
Accumulator
BH
BL
BX
Base
CH
CL
CX
Count
DH
DL
DX
Data
Gambar 2.2: Empat register umum dengan akses 8-bit dan 16-bit.
Register
16-bit
8-bit
Fungsi Khusus
AX
AX
AH, AL
I/O (IN/OUT), MUL, DIV. Instruksi dengan AX sering lebih pendek dan cepat.
BX
BX
BH, BL
Satu-satunya register umum yang bisa jadi base register. Digunakan XLAT.
CX
CX
CH, CL
Counter otomatis untuk LOOP/REP. CL = jumlah shift/rotate.
DX
DX
DH, DL
Alamat port 16-bit untuk IN/OUT. Sisa hasil MUL/DIV.
2.6 Register Pointer & Indeks
Empat register ini tidak bisa diakses per 8-bit — hanya 16-bit penuh.
Register
Nama
Fungsi Utama
Segmen Default
SP
Stack Pointer
Menunjuk elemen teratas stack. Berkurang 2 saat PUSH, bertambah 2 saat POP.
SS:SP
BP
Base Pointer
Akses parameter di stack. Default ke SS (bukan DS).
SS:BP
SI
Source Index
Pointer sumber data pada instruksi string (MOVSB, CMPSB).
DS:SI
DI
Destination Index
Pointer tujuan data pada instruksi string (STOSB, MOVSB).
ES:DI
2.7 Register Segmen
Empat register segmen menyimpan alamat dasar dari masing-masing segmen memori. Digunakan bersama offset untuk menghasilkan alamat fisik 20-bit.
Register
Nama
Fungsi
Digunakan Bersama
CS
Code Segment
Menunjuk ke segmen yang berisi kode program.
CS:IP
DS
Data Segment
Menunjuk ke segmen data (default untuk akses memori).
DS:offset
SS
Stack Segment
Menunjuk ke segmen stack.
SS:SP / SS:BP
ES
Extra Segment
Segmen tambahan. Default untuk DI pada instruksi string.
ES:DI
Aturan penting: Tidak bisa langsung memindahkan nilai antar register segmen. Harus melalui register umum. Contoh: MOV AX, 2000H; MOV DS, AX. Jika menulis MOV DS, ES → ERROR.
2.8 Register Flag (Detail Lengkap)
Register flag 16-bit. Hanya 9 bit yang aktif (digunakan), sisanya tidak terdefinisi (selalu 0 atau 1 tergantung prosesor).
Bit
Flag
Nama
Kapan Aktif
0
CF
Carry Flag
Operasi aritmatika menghasilkan carry/borrow dari bit paling tinggi (ADD, SUB, CMP, ROL, RCL)
1
Reservasi (selalu 1)
2
PF
Parity Flag
Jumlah bit 1 di hasil operasi adalah ganjil (LOGIC, aritmatika 8-bit)
3
AF
Auxiliary Carry
Carry dari bit 3 ke bit 4 (operasi BCD: DAA, DAS, AAA, AAS)
4
ZF
Zero Flag
Hasil operasi bernilai nol (CMP, AND, OR, XOR, TEST, INC, DEC)
5
SF
Sign Flag
Bit tertinggi dari hasil = 1 (operasi aritmatika, NEG, CMP)
6
TF
Trap Flag
Digunakan oleh debugger. Jika TF=1, CPU berhenti setelah tiap instruksi (single-step).
7
IF
Interrupt Flag
Mengizinkan (1) atau memblokir (0) interupsi hardware eksternal. STI=izinkan, CLI=blokir.
8
DF
Direction Flag
Arah instruksi string. CLD=maju (SI/DI increment), STD=mundur (SI/DI decrement).
9
OF
Overflow Flag
Overflow aritmatika signed. Hasil di luar jangkauan signed (ADD, SUB, CMP).
Flag untuk Conditional Jump Unsigned
JA/JNBE — Above / Not Below (CF=0 dan ZF=0)
JAE/JNB — Above or Equal (CF=0)
JB/JNAE — Below / Not Above (CF=1)
JBE/JNA — Below or Equal (CF=1 atau ZF=1)
Flag untuk Conditional Jump Signed
JG/JNLE — Greater / Not Less (ZF=0 dan SF=OF)
JGE/JNL — Greater or Equal (SF=OF)
JL/JNGE — Less / Not Greater (SF != OF)
JLE/JNG — Less or Equal (ZF=1 atau SF != OF)
2.9 Konsep Pipeline pada 8086
Pipeline adalah teknik di mana fetch instruksi berikutnya dilakukan bersamaan dengan eksekusi instruksi saat ini. Ini dimungkinkan oleh pemisahan EU dan BIU.
Waktu
BIU
EU
Hasil
T1
Fetch I1
Idle
—
T2
Fetch I2
Execute I1
I1 done
T3
Fetch I3
Execute I2
I2 done
T4
Fetch I4
Execute I3
I3 done
Gambar 2.3: Timeline pipeline — BIU dan EU bekerja paralel. Tanpa pipeline, EU harus idle saat BIU fetch.
Keuntungan Pipeline
✓Mengurangi waktu tunggu EU (T1 tidak ada, tanpa pipeline EU harus idle)
✓Throughput instruksi meningkat
✓Tidak memerlukan arsitektur yang lebih kompleks
Keterbatasan Pipeline 8086
✗Queue hanya 6 byte — jika instruksi panjang (jump far), queue bisa penuh dan BIU harus menunggu
✗Tidak ada branch prediction (jump bersyarat selalu mengosongkan queue)
✗Hanya 1 level pipeline (prosesor modern punya 5-15 level)
Kapan Pipeline Terputus?
1. JMP jauh (short/near) → queue di-flush, BIU fetch dari alamat tujuan baru
2. CALL → queue di-flush, BIU fetch dari alamat prosedur
3. Conditional jump yang "salah ambil" → BIU sudah fetch instruksi yang salah, harus di-flush
4. Queue penuh → BIU menunggu EU mengosongkan sebelum lanjut fetch
Pada kasus 1-3, ini disebut pipeline flush. Tidak fatal, tapi membuang beberapa siklus clock.
2.10 Soal Latihan
Kerjakan soal-soal berikut. Klik "Lihat jawaban" setelah mencoba menjawab sendiri.
Soal 1. Jelaskan perbedaan fungsi EU dan BIU pada arsitektur 8086. Mengapa keduanya dipisahkan?
▶ Lihat jawaban
EU (Execution Unit) bertugas mengeksekusi instruksi: decode instruksi dari queue, operasikan ALU, akses register dan flag. BIU (Bus Interface Unit) bertugas mengelola komunikasi dengan memori/I/O: fetch instruksi ke queue, hitung alamat fisik, kendalikan bus. Dipisahkan agar keduanya bisa bekerja paralel — EU mengeksekusi sementara BIU meng-fetch instruksi berikutnya, sehingga meningkatkan performa (pipeline).
Soal 2. Apa fungsi Instruction Queue pada BIU? Berapa ukurannya dan mengapa tidak lebih besar?
▶ Lihat jawaban
Instruction Queue adalah buffer FIFO 6 byte di dalam BIU yang menyimpan instruksi yang sudah di-fetch dari memori. Fungsinya memberikan instruksi siap pakai ke EU tanpa harus menunggu akses memori setiap kali. Ukurannya 6 byte karena sebagian besar instruksi 8086 panjangnya 1-6 byte, sehingga cukup untuk menampung setidaknya satu instruksi penuh. Ukuran lebih besar akan memerlukan lebih banyak transistor dan meningkatkan kompleksitas tanpa peningkatan performa signifikan.
Soal 3. Register CX memiliki fungsi khusus sebagai counter. Sebutkan instruksi yang secara otomatis menggunakan CX.
▶ Lihat jawaban
Instruksi yang menggunakan CX secara otomatis: LOOP (CX--, jump jika CX != 0), LOOPE/LOOPZ (CX--, jump jika CX != 0 dan ZF=1), LOOPNE/LOOPNZ (CX--, jump jika CX != 0 dan ZF=0), serta REP/REPE/REPNE untuk instruksi string. Selain itu, CL (byte rendah CX) digunakan sebagai jumlah shift/rotate pada instruksi SHL, SHR, dll.
Soal 4. Mengapa register segmen tidak bisa diakses langsung dengan instruksi MOV? Berikan contoh cara mengubah nilai DS.
▶ Lihat jawaban
Karena arsitektur 8086 tidak mendukung operasi langsung antar register segmen. Ini adalah batasan desain hardware. Cara yang benar: MOV AX, 2000H; MOV DS, AX. Data harus melewati register umum sebagai perantara. Hal ini berlaku juga untuk CS, SS, dan ES.
Soal 5. Apa yang terjadi jika SP di-inisialisasi dengan nilai 0000H dan kemudian dilakukan PUSH AX?
▶ Lihat jawaban
SP = 0000H berarti stack berada di ujung atas segmen stack (SS:0000). Saat PUSH AX: (1) SP dikurangi 2 menjadi FFFEH, (2) byte tinggi AX disimpan di SS:FFFE, (3) byte rendah AX di SS:FFFF. Jika dilakukan PUSH lagi, SP menjadi FFFCH, dan seterusnya ke bawah. Jika SP sudah 0000H dan dilakukan PUSH lagi, SP menjadi FFFEH (wrap-around) dan akan menimpa data sebelumnya — ini menyebabkan stack overflow.
Soal 6. Jelaskan perbedaan CF (Carry Flag) dan OF (Overflow Flag). Keduanya berubah saat ADD 7FH + 01H. Berapa nilainya masing-masing?
▶ Lihat jawaban
CF (Carry Flag) menandakan carry/borrow keluar dari bit paling tinggi. OF (Overflow Flag) menandakan overflow aritmatika signed (hasil di luar jangkauan). Untuk ADD 7FH + 01H = 80H: CF = 0 (tidak ada carry dari bit 7), namun jika 80H ditafsirkan signed = -128, padahal +127 + 1 seharusnya +128 yang tidak muat di 8-bit signed, sehingga OF = 1.
2.11 Kuis Bab 2
Pilih satu jawaban yang paling tepat.
1. Berapa jumlah register 16-bit yang tersedia di EU 8086?
Terdapat 8 register 16-bit: AX, BX, CX, DX (register umum) + SP, BP (pointer) + SI, DI (indeks).
2. Instruction Queue pada BIU 8086 berukuran berapa byte?
Instruction Queue berukuran 6 byte. Cukup untuk menampung sebagian besar instruksi 8086 yang panjangnya 1-6 byte.
3. Register manakah yang TIDAK bisa diakses sebagai 8-bit terpisah?
Hanya keempat register umum (AX/AH/AL, BX/BH/BL, CX/CH/CL, DX/DH/DL) yang bisa diakses 8-bit. SP, BP, SI, DI hanya bisa diakses sebagai 16-bit penuh.
4. Register segmen mana yang secara default digunakan untuk mengakses data di memori?
DS (Data Segment) adalah register segmen default untuk akses data. Saat kita menulis MOV AX, [BX], prosesor mengasumsikan alamat fisik = DS × 16 + BX.
5. Apa fungsi register IP (Instruction Pointer)?
IP menyimpan offset instruksi berikutnya yang akan dieksekusi. Pasangan CS:IP menunjuk ke alamat fisik instruksi berikutnya. IP tidak bisa diakses langsung oleh programmer.
6. Flag apa yang diubah oleh instruksi CMP AX, BX?
CMP melakukan subtraction (AX - BX) tanpa menyimpan hasilnya, namun mengubah CF, ZF, SF, OF, PF, dan AF sesuai hasil pengurangan tersebut.
7. Bagaimana cara menghitung alamat fisik dari CS=1234H dan IP=5678H?
Alamat fisik = Segment × 16 + Offset = 12340H + 5678H = 179B8H. Mengalikan dengan 16 sama dengan menggeser 4 bit ke kiri (menambahkan satu digit hex nol di belakang).
8. Apa keuntungan arsitektur pipeline pada 8086?
Karena EU dan BIU bekerja paralel: EU mengeksekusi instruksi sementara BIU mengambil instruksi berikutnya ke queue. Ini mengurangi waktu tunggu (idle time) karena EU tidak perlu menunggu fetch dari memori setiap kali.
9. Register BP (Base Pointer) secara default menggunakan segmen mana?
BP secara default menggunakan SS (Stack Segment), bukan DS. Ini memudahkan akses parameter yang dikirim melalui stack dalam prosedur tanpa perlu mengubah segmen secara manual.