Pemrograman Assembly dengan emu8086
Panduan lengkap struktur arsitektur mikroprosesor Intel 8086, instruksi tingkat rendah, dan tutorial penggunaan emulator emu8086 secara langkah demi langkah.
π― Tujuan Pembelajaran
Setelah mempelajari modul ini, mahasiswa mampu:
- Menjelaskan fungsi register utama 8086 (AX, BX, CX, DX, SP, segmen).
- Menulis, merakit, dan menjalankan program sederhana di emu8086.
- Menggunakan LOOP dan lompatan bersyarat (CMP + Jcc) untuk kontrol alur.
- Menggunakan INT 21h untuk input dan output.
π― 1. Konsep Dasar & Pengenalan
Bahasa Assembly adalah bahasa pemrograman tingkat rendah (*low-level programming*) yang memiliki keterkaitan 1:1 dengan kode biner mesin yang dijalankan langsung oleh CPU. Di bahasa ini, Anda tidak bekerja dengan variabel abstrak melainkan langsung mengatur register dan alamat memori fisik.
Mempelajari Assembly memberikan pemahaman konkret mengenai siklus eksekusi instruksi CPU (Fetch-Decode-Execute), alokasi memori fisik, dan interaksi mendasar antara sistem operasi (DOS/BIOS) dengan perangkat keras.
βοΈ 2. Struktur Register Mikroprosesor Intel 8086
Prosesor Intel 8086 memiliki arsitektur internal 16-bit. Setiap instruksi memproses data melalui sejumlah register penyimpanan super cepat di dalam CPU.
2.1 General Purpose Registers (Register Serbaguna)
Register ini berukuran 16-bit dan masing-masing dapat dipecah menjadi dua register 8-bit independen (*High byte* dan *Low byte*):
AH (High) dan AL (Low). Digunakan untuk operasi aritmetika, logika, perkalian/pembagian, serta nomor layanan interupsi DOS.
BH dan BL. Sering digunakan memegang alamat dasar (base address) saat mengakses array atau alamat memori tak langsung.
CH dan CL. Digunakan sebagai penghitung perulangan (*loop counter*) dan shift/rotate bit secara otomatis.
DH dan DL. Menampung data I/O port, hasil perkalian 32-bit, dan penunjuk alamat pesan string untuk DOS interrupt.
2.2 Pointer, Index & Segment Registers
- Pointer & Index Registers:
SP(Stack Pointer): Menunjuk ke puncak tumpukan (*stack*).BP(Base Pointer): Menunjuk ke data di stack frame fungsi.SI(Source Index): Indeks sumber pemindahan blok memori.DI(Destination Index): Indeks tujuan pemindahan blok memori.
- Segment Registers:
CS(Code Segment): Tempat instruksi kode program disimpan.DS(Data Segment): Tempat variabel dan konstanta program disimpan.SS(Stack Segment): Segmen khusus untuk operasi push/pop memori tumpukan.ES(Extra Segment): Segmen tambahan untuk operasi string atau array.
π οΈ 3. Mengenal Perangkat Lunak emu8086
Software emu8086 menggabungkan text editor, assembler, dan emulator CPU 8086 virtual dalam satu paket terpadu:
| Komponen emu8086 | Fungsi Utama |
|---|---|
| Source Editor | Menulis kode sumber program Assembly dengan format ekstensi berkas .asm. |
| Assembler / Emulate | Menerjemahkan kode Assembly ke kode biner mesin dan membuka emulator virtual. |
| Single Step (Step Into) | Mengeksekusi program baris demi baris secara manual agar mahasiswa bisa melihat perubahan register di setiap instruksi. |
| Register & Flags Viewer | Memantau nilai heksadesimal dalam register (AX, BX, CX, DX) serta status flag (ZF, CF, SF) secara real-time. |
| Virtual Screen | Layar monitor DOS virtual untuk menampilkan keluaran grafis atau teks karakter. |
π» 4. Praktik & Contoh Kode Program
4.1 Aritmetika Sederhana (Format .COM)
Program mengisi register dengan nilai dan melakukan operasi penambahan nilai:
ORG 100h ; Titik awal segmen program format .COM (offset 100h)
MOV AX, 5 ; Masukkan angka desimal 5 ke register AX (AX = 0005h)
MOV BX, 10 ; Masukkan angka desimal 10 ke register BX (BX = 000Ah)
ADD AX, BX ; AX = AX + BX (Hasil AX sekarang bernilai 15 desimal / 000Fh)
RET ; Selesai, kembalikan kontrol ke sistem DOS
4.2 Mencetak Satu Karakter ke Layar (DOS Interrupt INT 21h)
Menggunakan service interupsi DOS nomor 02h untuk mencetak satu karakter ASCII:
ORG 100h
MOV AH, 02h ; Layanan DOS nomor 02h: Menampilkan satu karakter
MOV DL, 'A' ; Karakter yang akan dicetak ('A' = kode ASCII 41h) disimpan di DL
INT 21h ; Panggil interupsi 21h (DOS Interrupt Service)
RET ; Program selesai
4.3 Mencetak Kalimat / String
Menggunakan service interupsi DOS nomor 09h untuk mencetak teks yang diakhiri tanda dolar ($):
ORG 100h
MOV DX, OFFSET pesan ; Masukkan alamat memori awal kalimat ke register DX
MOV AH, 09h ; Layanan DOS nomor 09h: Cetak string berakhiran simbol '$'
INT 21h ; Jalankan interupsi sistem DOS
RET ; Selesai
; Variabel Teks di Memori
pesan DB 'Halo Informatika UAD!$'
π 5. Cheat Sheet Instruksi Cepat
| Instruksi | Format Sintaks | Penjelasan |
|---|---|---|
MOV |
MOV dest, src |
Menyalin data dari sumber (*src*) ke register/memori tujuan (*dest*). |
ADD |
ADD dest, src |
Menjumlahkan isi dest = dest + src. |
SUB |
SUB dest, src |
Mengurangkan isi dest = dest - src. |
INC / DEC |
INC reg / DEC reg |
Menambah atau mengurangi nilai register sebesar 1 (+1 / -1). |
INT 21h (AH=01h) |
MOV AH, 01h; INT 21h |
Membaca input 1 karakter dari keyboard (karakter disimpan ke register AL). |
INT 21h (AH=02h) |
MOV AH, 02h; INT 21h |
Mencetak 1 karakter yang berada di register DL ke layar konsol. |
INT 21h (AH=09h) |
MOV AH, 09h; INT 21h |
Mencetak seluruh teks string yang ditunjuk oleh register DX (diakhiri $). |
π§ͺ Praktik Lanjutan
4.4 Perulangan dengan LOOP (jumlahkan 5+4+3+2+1)
ORG 100h
MOV CX, 5 ; jumlah iterasi
MOV AX, 0 ; akumulator
ulang:
ADD AX, CX ; AX = AX + CX
LOOP ulang ; CX = CX - 1, lompat ke 'ulang' jika CX != 0
RET ; akhir: AX = 000Fh (15)Pakai Single Step dan amati CX turun dari 5 ke 0 sementara AX bertambah.
4.5 Percabangan dengan CMP dan JG
ORG 100h
MOV AX, 7
CMP AX, 5 ; bandingkan AX dengan 5 (atur flag)
JG besar ; lompat jika AX > 5 (signed)
MOV DX, OFFSET msg_kecil
JMP cetak
besar:
MOV DX, OFFSET msg_besar
cetak:
MOV AH, 09h
INT 21h
RET
msg_besar DB 'Lebih dari 5$'
msg_kecil DB 'Tidak lebih dari 5$'
Catatan sumber: bagian 1–4.3 dirangkum dari video kuliah kanal Prodi Teknik Informatika UAD (ID video K5TTCNchwVU); bagian 4.4–5 dan latihan merupakan tambahan penyusun.
π Latihan Mandiri
Coba jawab dulu, lalu buka pembahasan.
Soal 1. Setelah MOV AX,1234h, berapa isi AH dan AL?
Pembahasan: AH = 12h (byte tinggi), AL = 34h (byte rendah).
Soal 2. Ubah program 4.4 agar menjumlahkan 1 sampai 10. Berapa hasil akhir AX?
Pembahasan: Ganti MOV CX,5 menjadi MOV CX,10. Hasil 55 desimal = 0037h.
Soal 3. Ubah program 4.5 agar mencetak pesan berbeda untuk AX = 5 tepat. Instruksi apa yang perlu ditambahkan?
Pembahasan: Gunakan CMP AX,5 lalu JE (jump if equal) ke label pesan khusus sebelum JG.
Soal 4. Mengapa string pada INT 21h AH=09h harus diakhiri tanda $?
Pembahasan: Layanan 09h tidak mengenal panjang string; ia berhenti mencetak ketika menemukan karakter $.
π Referensi
- Irvine, K. R. Assembly Language for x86 Processors. Pearson.
- Hall, D. V. Microprocessors and Interfacing: Programming and Hardware. McGraw-Hill.
- Dokumentasi emu8086 (bawaan aplikasi).