Memahami cara 8086 memetakan 1 MB memori, konsep segmentasi, arsitektur Little-Endian, dan pengelompokan bank memori.
Capaian Pembelajaran Bab Ini
Setelah mempelajari bab ini, mahasiswa mampu menjelaskan peta memori (memory map) 8086, menghitung alamat fisik, memahami penyimpanan data Little-Endian, serta menjelaskan mekanisme Even dan Odd bank memori.
Meskipun 8086 memiliki register 16-bit yang hanya bisa mengalamati hingga 64 KB, bus alamatnya berukuran 20-bit sehingga mampu mengakses 1 MB memori. Untuk menjembatani hal ini, 8086 menggunakan sistem Memory Segmentation.
Mengapa Batas Segmen 64 KB?
Ukuran satu segmen ditentukan oleh lebar register offset (IP, SP, BX, SI, dll) yang berukuran 16-bit. Nilai maksimum 16-bit adalah FFFFH.
Jadi, tidak peduli berapa pun nilai register segmen Anda, satu segmen hanya bisa membentang dari offset 0000H sampai FFFFH (64 KB).
Analogi Segmentasi
Bayangkan memori 1 MB sebagai sebuah buku teks yang sangat tebal (1 juta alamat). Mencari kata dengan nomor halaman absolut dari 0 sampai 1 juta sangat merepotkan. Segmentasi membagi buku menjadi beberapa bab (Segment). Di dalam bab tersebut, Anda menggunakan nomor baris (Offset) mulai dari 0 sampai 65535. Dengan kombinasi Bab dan Baris, Anda bisa menemukan kata tersebut dengan cepat.
Pada 8086, memori 1 MB dibagi menjadi beberapa segmen logis, masing-masing berukuran maksimal 64 KB. Sebuah program biasanya mendefinisikan setidaknya 4 segmen utama: Code Segment (CS), Data Segment (DS), Stack Segment (SS), dan Extra Segment (ES).
Memori Fisik 1 MB
CODE SEGMENT (CS)
Menyimpan instruksi program (Maks 64KB)
DATA SEGMENT (DS)
Menyimpan variabel dan data (Maks 64KB)
STACK SEGMENT (SS)
Menyimpan return address, parameter (Maks 64KB)
Gambar 4.1: Ilustrasi pemisahan memori logis (Segmen) di dalam memori fisik 1 MB.
4.2 Peta Memori (Memory Map)
Tidak seluruh 1 MB memori digunakan oleh program pengguna. Beberapa area sudah dialokasikan secara ketat oleh arsitektur 8086 untuk keperluan sistem, interupsi, dan ROM BIOS.
Setiap entri di IVT memiliki ukuran 4 byte (2 byte IP diikuti 2 byte CS). Jika terjadi error pembagian dengan nol (Interupsi Tipe 0), CPU menghitung alamat tabelnya: Tipe 0 × 4 = 0000H.
Isi Memori di alamat 00000H - 00003H:
00000H
A5 04
← IP Baru
00002H
F0 00
← CS Baru
CPU akan melompat ke alamat fisik: 000F0H × 16 + 04A5H = 00F4A5H untuk menjalankan rutin error.
4.3 Tumpang Tindih Segmen (Overlapping)
Karena tidak ada batasan hardware yang mencegahnya, beberapa segmen boleh saling tumpang tindih (overlap) di dalam memori fisik. Bahkan, dua pasangan Segment:Offset yang berbeda bisa mengarah ke alamat fisik yang persis sama.
Contoh Perhitungan Alamat Sama
Logika 1
Segment: 1234H
Offset : 5678H
12340H + 5678H
179B8H
Logika 2
Segment: 1790H
Offset : 00B8H
17900H + 00B8H
179B8H
Kedua kombinasi di atas mengakses alamat fisik yang sama persis!
Ilustrasi Tumpang Tindih Fisik
1500H
1FFFFH
2000H
SEGMENT A (1000H - 1FFFFH)
SEGMENT B (1500H - 24FFFH)
OVERLAP
Apa Dampaknya bagi Programmer?
• Keuntungan (Relokasi): Memudahkan perpindahan kode. Jika Anda memindahkan seluruh program ke memori yang lebih tinggi, Anda cukup mengubah nilai register segmennya saja (misal DS dari 1000H menjadi 2000H), tanpa mengubah semua nilai offset di dalam kode assembly.
• Kerugian (Bug Memori): Jika Anda salah menginisialisasi nilai segmen, program bisa menulis data (DS) menimpa kode program (CS) atau menghapus data Stack (SS) karena mereka tumpang tindih, menyebabkan sistem crash.
4.4 Penyimpanan Data: Little-Endian
Arsitektur keluarga x86 (termasuk 8086) menggunakan format penyimpanan yang disebut Little-Endian. Aturan utamanya: Byte terendah (Least Significant Byte / LSB) selalu disimpan di alamat memori yang paling rendah, sedangkan byte tertinggi (MSB) di alamat berikutnya.
Kesalahan Umum Mahasiswa: Saat menggunakan debugger (seperti DOSBox DEBUG) dan melihat memori dengan perintah -d 1000 1003, data akan terlihat terbalik (misal: 34 12). Jangan panik, itu bukan error! Itu memang cara kerja x86. Protokol jaringan TCP/IP menggunakan Big-Endian, itulah mengapa ada fungsi seperti hton() saat membuat program socket di C.
4.5 Even dan Odd Memory Bank
Memori fisik sebenarnya diatur dalam satuan byte (8-bit). Namun, 8086 adalah prosesor 16-bit yang ingin memindahkan 2 byte (1 Word) sekaligus dalam 1 siklus clock. Bagaimana caranya? Memori dibagi menjadi dua bank paralel.
Misalkan kita menjalankan MOV AX, [1001H]. Prosesor tidak bisa mengambil D0-D15 sekaligus karena alamat 1001H ada di Odd Bank.
SIKLUS 1 (BHE=0, A0=1)
Aktifkan Odd Bank. Ambil 1 byte dari 1001H. Data masuk ke bus D8-D15. Prosesor secara internal memindahkan data ini ke bagian bawah register sementara.
SIKLUS 2 (BHE=1, A0=0)
Aktifkan Even Bank. Ambil 1 byte dari 1002H. Data masuk ke bus D0-D7. Baru setelah ini kedua byte digabungkan menjadi AX yang utuh.
Best Practice Pemrograman
Karena akses Word di alamat ganjil membutuhkan 2 siklus bus (lebih lambat), seorang programmer Assembly yang baik selalu menyusun (align) data Word di alamat yang genap. Ini bisa dilakukan dengan direktif assembler EVEN atau ALIGN 2 sebelum mendeklarasikan variabel data Word.
4.6 Soal Latihan
Kerjakan soal-soal berikut. Klik "Lihat jawaban" setelah mencoba menjawab sendiri.
Soal 1. Jelaskan apa yang dimaksud dengan arsitektur Little-Endian pada 8086. Jika AX = 1234H disimpan di alamat 1000H, berapa nilai yang ada di alamat 1000H dan 1001H?
▶ Lihat jawaban
Little-Endian adalah metode penyimpanan data di mana byte terendah (LSB) disimpan di alamat memori terendah, dan byte tertinggi (MSB) di alamat berikutnya. Jika AX = 1234H disimpan di 1000H, maka di alamat 1000H berisi 34H (AL/LSB), dan di alamat 1001H berisi 12H (AH/MSB).
Soal 2. Jika terjadi interupsi tipe 0 (Divide by Error), prosesor akan membaca alamat prosedur penanganannya dari alamat memori berapa? Jelaskan prosesnya.
▶ Lihat jawaban
Prosesor membacanya dari alamat 00000H. Setiap vektor interupsi membutuhkan 4 byte (2 byte untuk IP, 2 byte untuk CS). Untuk interupsi tipe 0, perhitungannya: Tipe 0 × 4 = 0. Jadi, alamat 00000H-00001H berisi IP baru, dan alamat 00002H-00003H berisi CS baru. Prosesor lalu melompat ke alamat CS:IP tersebut.
Soal 3. Mengapa 8086 membagi memori fisik menjadi 'Even Bank' dan 'Odd Bank'?
▶ Lihat jawaban
Karena 8086 memiliki bus data 16-bit, tetapi memori fisik diatur dalam kelompok 8-bit (1 byte). Untuk mentransfer data 16-bit dalam 1 siklus clock, 8086 membagi memori menjadi dua bank: Even Bank (alamat genap, terhubung ke D0-D7) dan Odd Bank (alamat ganjil, terhubung ke D8-D15). Pin BHE dan A0 digunakan untuk memilih bank mana yang aktif.
Soal 4. Apa yang terjadi jika kita menulis instruksi MOV AX, [1001H] (mengambil data 16-bit dari alamat ganjil)?
▶ Lihat jawaban
Prosesor membutuhkan 2 siklus bus. Siklus pertama mengambil byte dari alamat 1001H (Odd Bank) dan menyimpannya sementara di register internal. Siklus kedua mengambil byte dari alamat 1002H (Even Bank). Keduanya baru digabungkan menjadi 16-bit di dalam register AX. Ini lebih lambat dibandingkan menulis MOV AX, [1000H] yang hanya butuh 1 siklus bus.
Kuis Bab 4
Pilih satu jawaban yang paling tepat.
1. Berapa ukuran total memori yang dapat diakses oleh prosesor 8086?
8086 memiliki bus alamat 20-bit. 2^20 byte = 1.048.576 byte = 1 Megabyte (1 MB), mulai dari 00000H hingga FFFFFH.
2. Berapa ukuran maksimal satu segmen memori pada 8086 dan mengapa?
Ukuran segmen ditentukan oleh register offset yang berukuran 16-bit. Nilai maksimum 16-bit adalah FFFFH (65.535 desimal), yang sama dengan 64 KB.
3. Jika register DS = 2000H dan offset = 0050H, berapa alamat fisik yang diakses?
4. Pada arsitektur Little-Endian, jika kita menyimpan kata (word) 5678H di alamat 2000H, berapa nilai hex yang tersimpan di alamat 2001H?
Byte rendah (LSB = 78H) disimpan di alamat 2000H. Byte tinggi (MSB = 56H) disimpan di alamat 2001H.
5. Apa fungsi dari sinyal BHE (Bus High Enable) pada 8086?
BHE digunakan bersamaan dengan pin A0 untuk menentukan apakah transfer data melibatkan byte tinggi (Odd Bank/D8-D15), byte rendah (Even Bank/D0-D7), atau keduanya (Word).
6. Di alamat mana prosesor 8086 mulai mengeksekusi instruksi saat pertama kali dinyalakan (reset)?
Saat reset, CS = FFFFH dan IP = 0000H, sehingga alamat fisiknya adalah FFFF0H. Di alamat ini selalu terdapat instruksi JMP jauh yang mengarahkan eksekusi ke BIOS.
7. Jika kita ingin membaca data Word (16-bit) secepat mungkin, di alamat memori bagaimana kita harus menyusun datanya?
Membaca Word dari alamat genap memungkinkan prosesor mengakses Even dan Odd Bank secara bersamaan dalam 1 siklus bus. Jika di alamat ganjil, prosesor membutuhkan 2 siklus bus yang memperlambat eksekusi.