Minggu 4 Arsitektur

Bab 4: Organisasi Memori 8086

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.

4.1 Konsep Segmentasi 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.

FFFFH (Hex) = 65.535 (Desimal) = 64 Kilobytes (KB)

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.

Alamat AwalAlamat AkhirUkuranFungsi / Isi
00000H 003FFH 1 KB Interrupt Vector Table (IVT). Menyimpan 256 vektor interupsi.
00400H 004FFH 256 B BIOS Data Area. Menyimpan informasi perangkat keras yang diisi oleh POST.
00500H 9FFFFH 640 KB Conventional Memory. Area utama tempat program DOS/APLIKASI dimuat.
A0000H BFFFFH 128 KB Video RAM (VGA). Menyimpan data grafis yang ditampilkan di layar.
C0000H FFFFFH 256 KB ROM / BIOS Area. Berisi kode BIOS sistem dan bootstrap loader.
FFFF0H FFFFFH 16 B Reset Vector. Alamat pertama yang dieksekusi saat PC dinyalakan.

Contoh Detail: Membaca Interrupt Vector Table (IVT)

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.

Contoh 1: Menyimpan Word (16-bit)

Instruksi: MOV [1000H], AX (dengan asumsi AX = 1234H)

1000H
34H
← LSB (AL)
1001H
12H
← MSB (AH)

Contoh 2: Menyimpan Double Word (32-bit)

Menyimpan nilai 12345678H di alamat 5000H

5000H
78H
← Byte 0 (LSB)
5001H
56H
← Byte 1
5002H
34H
← Byte 2
5003H
12H
← Byte 3 (MSB)

Little-Endian (Intel x86)

Alamat 5000H: 78H
Alamat 5001H: 56H
Alamat 5002H: 34H
Alamat 5003H: 12H
Dibaca manusia: 78 56 34 12

Big-Endian (Motorola/Network)

Alamat 5000H: 12H
Alamat 5001H: 34H
Alamat 5002H: 56H
Alamat 5003H: 78H
Dibaca manusia: 12 34 56 78

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.

Even Bank (Bank Bawah)

  • • Terhubung ke jalur data D0 - D7
  • • Berisi seluruh alamat genap (A0 = 0)
  • • Diaktifkan jika sinyal A0 = 0

Odd Bank (Bank Atas)

  • • Terhubung ke jalur data D8 - D15
  • • Berisi seluruh alamat ganjil (A0 = 1)
  • • Diaktifkan jika sinyal BHE = 0
OperasiBHEA0Yang DiaksesSiklus Bus
Baca Byte dari Alamat Genap 1 0 Even Bank saja (D0-D7) 1 siklus
Baca Byte dari Alamat Ganjil 0 1 Odd Bank saja (D8-D15) 1 siklus
Baca Word dari Alamat Genap 0 0 Even & Odd Bank bersamaan (D0-D15) 1 siklus (Cepat!)
Baca Word dari Alamat Ganjil 0 1 Siklus 1: Odd Bank. Siklus 2: Even Bank. 2 siklus (Lambat!)

Detail Teknis: Mengapa Alamat Ganjil Butuh 2 Siklus?

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?

2. Berapa ukuran maksimal satu segmen memori pada 8086 dan mengapa?

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?

5. Apa fungsi dari sinyal BHE (Bus High Enable) pada 8086?

6. Di alamat mana prosesor 8086 mulai mengeksekusi instruksi saat pertama kali dinyalakan (reset)?

7. Jika kita ingin membaca data Word (16-bit) secepat mungkin, di alamat memori bagaimana kita harus menyusun datanya?