Minggu 12 Pemrograman

Bab 12: Interupsi (Interrupt)

Mempelajari mekanisme interupsi pada 8086: bagaimana CPU menangani kejadian eksternal dan internal, Interrupt Vector Table (IVT), instruksi INT, serta layanan interupsi DOS dan BIOS yang paling sering digunakan.

Capaian Pembelajaran Bab Ini

Setelah mempelajari bab ini, mahasiswa mampu menjelaskan konsep interupsi dan jenis-jenisnya; mendeskripsikan alur proses interupsi dari deteksi hingga kembali; memahami organisasi Interrupt Vector Table (IVT); menggunakan instruksi INT untuk memanggil layanan DOS (INT 21h) dan BIOS (INT 10h, INT 16h); serta memahami peran flag IF dan instruksi CLI/STI.

12.1 Apa Itu Interupsi?

Interupsi adalah mekanisme whereby CPU menghentikan eksekusi program secara sementara untuk menangani suatu kejadian (event), lalu kembali ke program semula setelah kejadian tersebut ditangani. Interupsi memungkinkan CPU merespons kejadian eksternal (misalnya penekanan tombol keyboard) tanpa harus memeriksa secara terus-menerus (polling).

"Interupsi adalah jembatan antara dunia eksekusi sekuensial CPU dan dunia event-driven perangkat keras dan sistem operasi."

— Konsep fundamental arsitektur komputer

Pada bab-bab sebelumnya, kita sudah menggunakan interupsi secara langsung — setiap kali kita menulis INT 21h untuk mencetak teks atau mengakhiri program, kita sebenarnya sedang memicu interupsi perangkat lunak. Bab ini akan mengungkap apa yang sebenarnya terjadi di balik instruksi tersebut.

12.2 Analogi Kehidupan Sehari-hari

Bayangkan Anda sedang mengerjakan tugas di meja kerja:

Tanpa Interupsi (Polling)

Setiap 5 menit, Anda berhenti mengerjakan tugas dan berjalan ke pintu untuk mengecek apakah ada tamu. Jika tidak ada, kembali mengerjakan tugas. Sangat tidak efisien — waktu terbuang untuk mengecek berkali-kali padahal tamu mungkin tidak datang.

Dengan Interupsi (Interrupt-driven)

Anda fokus mengerjakan tugas. Ketika bel berbunyi, Anda berhenti sejenak, membuka pintu, melayani tamu, lalu kembali melanjutkan tugas persis di halaman yang sama. Jauh lebih efisien.

Pemetaan Analogi ke 8086

Anda mengerjakan tugas
← CPU mengeksekusi program utama
Bel berbunyi
← Sinyal interupsi diterima CPU
Menandai halaman terakhir
← CPU push Flags, CS, IP ke stack
Membuka pintu, melayani tamu
← CPU menjalankan Interrupt Service Routine (ISR)
Kembali ke halaman tadi
← CPU mengeksekusi IRET (pop Flags, CS, IP)

12.3 Jenis-Jenis Interupsi

Interupsi pada 8086 diklasifikasikan menjadi tiga kelompok besar:

1

Interupsi Perangkat Lunak (Software Interrupt)

Dipicu oleh instruksi INT n di dalam program. Bersifat sinkron — terjadi pada titik yang ditentukan programmer.

INT 21h (DOS) INT 10h (BIOS Video) INT 16h (BIOS Keyboard) INT 20h (Keluar program)
2

Interupsi Perangkat Keras — Maskable (Hardware Interrupt Maskable)

Dipicu oleh sinyal di pin INTR CPU, biasanya dari chip Programmable Interrupt Controller (PIC) yaitu 8259A. Bersifat asinkron dan bisa dinonaktifkan dengan IF=0 (CLI).

Keyboard (IRQ1) Timer (IRQ0) Serial Port (IRQ4) Disk Drive (IRQ14)
3

Interupsi Perangkat Keras — Non-Maskable (NMI)

Dipicu oleh sinyal di pin NMI CPU. Tidak bisa dinonaktifkan oleh IF — selalu dilayani. Digunakan untuk kejadian kritis yang tidak boleh diabaikan.

Memory parity error Power failure Watchdog timer
AspekSoftware (INT n)Hardware Maskable (INTR)Non-Maskable (NMI)
SumberInstruksi programPin INTR (dari PIC 8259A)Pin NMI
WaktuSinkron (dapat diprediksi)Asinkron (kapan saja)Asinkron (kapan saja)
Bisa dinonaktifkan?Tidak relevanYa (IF=0 via CLI)TIDAK
Nomor interupsiDitentukan programmer (n)Diberikan PIC (0-7 untuk master)Selalu 2 (tetap)
Vektor di IVT00h–FFh (bebas)08h–0Fh (PIC master)02h (tetap)

12.4 Alur Proses Interupsi

Berikut adalah langkah-langkah yang dilakukan CPU 8086 secara berurutan ketika menerima interupsi:

1

Selesaikan Instruksi

CPU menyelesaikan instruksi yang sedang dieksekusi. Interupsi TIDAK memotong instruksi di tengah jalan.

2

Deteksi & Validasi

CPU memeriksa apakah interupsi diizinkan. Untuk INTR: cek apakah IF=1. Untuk NMI dan INT n: selalu diizinkan.

3

Push Flags Register

CPU mendekrement SP dua kali, lalu mendorong seluruh Flags Register (2 byte) ke stack. IF otomatis dinolkan (kecuali NMI).

4

Push CS

CPU mendekrement SP dua kali, lalu mendorong CS (segmen kode saat ini) ke stack.

5

Push IP

CPU mendekrement SP dua kali, lalu mendorong IP (alamat instruksi berikutnya) ke stack. Total stack yang dipakai: 6 byte.

6

Baca Vektor Interupsi

CPU menghitung alamat vektor: alamat = 0000h + (nomor_interupsi × 4). Membaca 2 byte IP baru dari alamat tersebut, lalu 2 byte CS baru dari alamat+2.

7

Lompat ke ISR

CPU mengisi CS dan IP dengan nilai yang dibaca dari IVT. Eksekusi berpindah ke Interrupt Service Routine (ISR).

8

Eksekusi ISR

ISR menjalankan kode penanganan interupsi. Pada akhir ISR, instruksi IRET dieksekusi.

9

IRET — Kembali

IRET melakukan: POP IP → POP CS → POP Flags. Eksekusi dilanjutkan tepat di instruksi setelah titik interupsi.

Program Utama (eksekusi normal)
↓ Interupsi terjadi!
Push Flags Push CS Push IP
↓ Baca vektor dari IVT
Interrupt Service Routine (ISR) dieksekusi
↓ IRET
Pop IP Pop CS Pop Flags
Program Utama (dilanjutkan)

Gambar 12.1: Alur lengkap proses interupsi dari deteksi hingga kembali ke program utama.

12.5 Interrupt Vector Table (IVT)

Interrupt Vector Table (IVT) adalah tabel di 1024 byte pertama memori (alamat 0000h:0000h sampai 0000h:03FFh) yang berisi alamat-alamat Interrupt Service Routine (ISR) untuk setiap nomor interupsi.

PropertiNilai
Lokasi di memori0000h:0000h – 0000h:03FFh
Ukuran total1024 byte (1 KB)
Jumlah entri256 entri (nomor 00h – FFh)
Ukuran per entri4 byte (2 byte IP offset + 2 byte CS segmen)
Rumus alamat entriAlamat = 0000h + (nomor_int × 4)
Alamat Isi (IP:CS)
0000h INT 00h: Divide Error
0004h INT 01h: Single Step
0008h INT 02h: NMI
000Ch INT 03h: Breakpoint
0010h INT 04h: Overflow
0014h – 003Fh INT 05h – 0Fh: Reserved
0040h INT 10h: BIOS Video
0058h INT 16h: BIOS Keyboard
005Ch – 007Fh INT 17h – 1Fh: BIOS lainnya
0080h INT 20h: DOS — Program Terminate
0084h INT 21h: DOS — Function Calls
0088h – 03FFh INT 22h – FFh: Lainnya / User

Gambar 12.2: Peta Interrupt Vector Table (IVT) 8086. Entri yang di-highlight adalah yang paling sering digunakan dalam pemrograman.

Contoh Perhitungan Alamat Vektor

INT 10h: 10h × 4 = 40h → alamat 0040h (IP di 0040h-0041h, CS di 0042h-0043h)

INT 21h: 21h × 4 = 84h → alamat 0084h (IP di 0084h-0085h, CS di 0086h-0087h)

INT FFh: FFh × 4 = 3FCh → alamat 03FCh (entri terakhir di IVT)

12.6 Instruksi INT dan IRET

INT n

Memicu interupsi nomor n (0–255).

Operasi internal:

1. PUSH Flags

2. IF ← 0, TF ← 0

3. PUSH CS

4. PUSH IP

5. IP ← [0000h + n×4]

6. CS ← [0000h + n×4 + 2]

INT  21h     ; panggil layanan DOS
INT  10h     ; panggil layanan BIOS video
INT  20h     ; akhiri program (DOS)

IRET

Kembali dari ISR. Kebalikan dari INT.

Operasi internal:

1. POP IP

2. POP CS

3. POP Flags (memulihkan IF, TF, dll.)

my_isr PROC FAR
    ; ... kode penanganan ...
    IRET              ; kembali ke program
my_isr ENDP

INT vs IRET vs RET

InstruksiPush ke StackPop dari StackFlag Dipulihkan?
INT nFlags, CS, IP (6 byte)Tidak (push saja)
IRETIP, CS, Flags (6 byte)YA
RET (near)IP (2 byte)TIDAK
RET (far)IP, CS (4 byte)TIDAK

Inilah mengapa ISR harus diakhiri dengan IRET, bukan RET — karena hanya IRET yang memulihkan Flags Register.

12.7 Apa Itu ISR?

Interrupt Service Routine (ISR) adalah rutin (blok kode) yang dieksekusi oleh CPU ketika interupsi terjadi. ISR bertugas menangani kejadian yang memicu interupsi, lalu mengembalikan kontrol ke program yang terinterupsi melalui IRET.

Struktur Umum ISR
nama_isr PROC FAR          ; ISR harus FAR (karena CS di-push oleh CPU)
    PUSH AX                ; ① Simpan register yang akan dipakai
    PUSH BX
    PUSH DS                

    ; ② --- Kode penanganan interupsi ---
    ;     Baca data, proses, kirim respons, dll.

    POP  DS                ; ③ Kembalikan register (urutan terbalik)
    POP  BX
    POP  AX
    IRET                      ; ④ Kembali (pop IP, CS, Flags)
nama_isr ENDP

Kode 12.1: Pola umum penulisan ISR. Perhatikan: harus FAR, harus diakhiri IRET, dan register yang dipakai harus di-save/restore.

Mengapa ISR harus dideklarasikan FAR? Karena saat interupsi terjadi, CPU mendorong baik CS maupun IP ke stack (seolah-olah ini far call). Jika ISR dideklarasikan NEAR, IRET hanya akan pop IP dan Flags tetapi tidak pop CS dengan benar, menyebabkan program melompat ke segmen yang salah.

12.8 Klasifikasi Nomor Interupsi

NomorJenisFungsi
00hInternal CPUDivide Error — pembagian dengan nol
01hInternal CPUSingle Step — debugging (TF=1)
02hHardware (NMI)Non-Maskable Interrupt
03hInternal CPUBreakpoint — instruksi INT 3 (1 byte)
04hInternal CPUOverflow — INTO instruction
05h–07hReservedTidak digunakan pada 8086
08h–0FhHardware (PIC)IRQ0–IRQ7 dari PIC 8259A
10hBIOSVideo Display — layar, kursor, warna
11hBIOSEquipment Check
12hBIOSMemory Size
13hBIOSDisk I/O (level rendah)
14hBIOSSerial Communication
15hBIOSCassette I/O / System
16hBIOSKeyboard — baca tombol, status
17hBIOSPrinter
18h–1FhBIOSROM BASIC, Reload, Clock, dll.
20hDOSProgram Terminate
21hDOSFunction Calls — I/O, file, memori
22h–24hDOSTerminate Address (internal DOS)
25h–26hDOSAbsolute Disk Read/Write
27hDOSTerminate but Stay Resident (TSR)
28h–FFhUser / ReservedTersedia untuk penggunaan khusus

12.9 INT 21h — Layanan DOS (Bagian 1: Input/Output Karakter)

INT 21h adalah interupsi DOS yang paling penting. Register AH menentukan fungsi layanan mana yang dipanggil. Berikut fungsi-fungsi input/output karakter yang paling dasar:

AHFungsiInputOutputKeterangan
01h Baca karakter (dengan echo) AL = kode ASCII Menunggu tombol ditekan, menampilkan karakter ke layar
02h Cetak karakter DL = karakter Mencetak satu karakter di posisi kursor
06h Direct Console I/O DL=FFh(baca) / DL≠FFh(tulis) AL = karakter (jika baca) Tidak menunggu; ZF=1 jika tidak ada karakter
07h Baca karakter (tanpa echo) AL = kode ASCII Seperti AH=01h tapi tidak menampilkan ke layar
08h Baca karakter tanpa echo (ctrl-break check) AL = kode ASCII Seperti 07h tapi memeriksa Ctrl+C/Ctrl+Break
Contoh: Baca lalu cetak karakter
    ; Tampilkan pesan
    MOV  AH, 09h
    LEA  DX, msg_tanya
    INT  21h

    ; Baca satu karakter dari keyboard
    MOV  AH, 01h
    INT  21h                 ; AL = kode ASCII karakter yang ditekan

    ; Pindahkan ke DL dan cetak
    MOV  DL, AL
    MOV  AH, 02h
    INT  21h                 

Kode 12.2: Menggunakan AH=01h (baca) dan AH=02h (cetak) untuk echo karakter.

12.10 INT 21h — Layanan DOS (Bagian 2: String dan Lainnya)

AHFungsiInputKeterangan
09h Cetak string DS:DX = offset string (diakhiri '$') Fungsi yang paling sering kita gunakan sejauh ini
0Ah Baca string (buffered input) DS:DX = offset buffer Buffer: byte 1=max panjang, byte 2=aktual panjang, byte 3+=data
4Ch Akhiri program AL = return code (0=normal) Cara yang direkomendasikan untuk mengakhiri program
4Ch Dapatkan tanggal CX:DX = tanggal (tahun:bulan:hari)
2Ch Dapatkan waktu CH:CL:DH = jam:menit:detik
Contoh: Baca string dengan AH=0Ah
.data
    max_len db 20              ; byte 1: panjang maksimum input
    akt_len db ?              ; byte 2: panjang aktual (diisi DOS)
    buffer  db 21 dup(?)      ; byte 3+: data karakter
    msg     db 0Dh, 0Ah, '$'

.code
    ; Baca string dari keyboard
    MOV  AH, 0Ah
    LEA  DX, max_len       ; DX menunjuk ke byte PERTAMA buffer
    INT  21h                 ; menunggu user mengetik lalu tekan Enter

    ; Setelah INT 21h:
    ;   akt_len berisi jumlah karakter yang diketik (tanpa Enter)
    ;   buffer berisi karakter-karakter yang diketik

    ; Tambahkan '$' di akhir string agar bisa dicetak dengan AH=09h
    MOV  BL, akt_len       ; BL = jumlah karakter
    XOR  BH, BH           ; BX = posisi akhir string
    MOV  BYTE PTR buffer[BX], '$'

    ; Cetak string yang dibaca
    MOV  AH, 09h
    LEA  DX, msg
    INT  21h
    LEA  DX, buffer
    INT  21h

Kode 12.3: Membaca string dari keyboard menggunakan buffered input (AH=0Ah). Perhatikan struktur buffer 3 bagian.

Struktur Buffer untuk AH=0Ah

Byte 0
max_len
(diisi programmer)
Byte 1
akt_len
(diisi DOS)
Byte 2 ... N
data karakter (diisi DOS dari keyboard)

Contoh: jika user mengetik "HELLO" (5 karakter), max_len=20, maka byte 0=20, byte 1=5, byte 2-6='H','E','L','L','O'

12.11 INT 10h — Layanan BIOS Video

INT 10h menyediakan layanan video tingkat rendah langsung dari BIOS, termasuk mengatur mode tampilan, memindahkan kursor, menulis karakter langsung ke memori video, dan mengubah warna. Berikut fungsi yang paling sering digunakan:

AHFungsiInput PentingKeterangan
00h Set Video Mode AL = nomor mode AL=03h: text 80×25 16 warna
02h Set Cursor Position DH=baris, DL=kolom, BH=halaman Baris 0–24, Kolom 0–79
03h Get Cursor Position BH = halaman DH=baris, DL=kolom, CH/CL = baris awal/akhir kursor
06h Scroll Window Up AL=jumlah baris, BH=atribut, CH/CL=baris/kolom atas, DH/DL=bawah AL=0: scroll seluruh layar
09h Write Character & Attribute AL=karakter, BH=halaman, BL=atribut(warna), CX=jumlah Menulis tanpa memindahkan kursor
0Ah Write Character Only AL=karakter, BH=halaman, CX=jumlah Seperti 09h tapi tidak mengubah atribut warna
Contoh: Pindah kursor dan tulis karakter berwarna
; Set mode video teks 80×25 16 warna
    MOV  AH, 00h
    MOV  AL, 03h             ; mode 3
    INT  10h

    ; Pindahkan kursor ke baris 10, kolom 20
    MOV  AH, 02h
    MOV  DH, 10             
    MOV  DL, 20             
    MOV  BH, 0              
    INT  10h

    ; Tulis 'A' berwarna merah di atas latar hitam (atribut 0Ch)
    MOV  AH, 09h
    MOV  AL, 'A'            
    MOV  BL, 0Ch            
    MOV  CX, 1              
    MOV  BH, 0              
    INT  10h

Kode 12.4: INT 10h untuk mengatur posisi kursor dan menulis karakter berwarna.

Atribut Warna (Byte Atribut Video)

Byte atribut (BL pada AH=09h) menentukan warna foreground dan background:

Bit 7 Blink | Bit 6-4 BG (Background) | Bit 3 I (Intensity) | Bit 2-0 FG (Foreground)
0: Hitam
1: Biru
2: Hijau
3: Cyan
4: Merah
5: Magenta
6: Coklat
7: Abu-abu terang

Contoh: 0Ch = 0000_1100b → FG=cyan(3), BG=hitam(0), I=1 → cyan terang di atas hitam. 1Eh = 0001_1110b → FG=kuning(14), BG=biru(1) → kuning di atas biru.

12.12 INT 16h — Layanan BIOS Keyboard

INT 16h menyediakan akses tingkat rendah ke buffer keyboard BIOS. Berbeda dengan INT 21h yang menunggu input, beberapa fungsi INT 16h bisa mengecek apakah ada tombol yang ditekan tanpa menunggu.

AHFungsiInputOutputKeterangan
00h Baca tombol AL = ASCII, AH = scan code Menunggu sampai tombol ditekan
01h Cek status keyboard ZF=0: ada tombol, ZF=1: kosong Tidak menunggu! Penting untuk polling
02h Get Shift Status AL = flags (bit 0=Shift, bit 1=Ctrl, dll.) Cek apakah Shift/Ctrl/Alt ditekan
Contoh: Cek keyboard tanpa menunggu (polling)
tunggu_tombol:
    MOV  AH, 01h           ; fungsi: cek status keyboard
    INT  16h                 ; TIDAK menunggu
    JZ   tunggu_tombol    ; ZF=1 → belum ada tombol, ulangi

    ; ZF=0 → ada tombol di buffer, baca sekarang
    MOV  AH, 00h           ; fungsi: baca tombol
    INT  16h                 

Kode 12.5: Pola polling keyboard menggunakan INT 16h AH=01h (cek tanpa menunggu) diikuti AH=00h (baca).

12.13 Flag IF, Instruksi STI, dan CLI

Interrupt Flag (IF) adalah bit ke-9 di Flags Register yang mengontrol apakah interupsi perangkat keras maskable (melalui pin INTR) diizinkan atau ditolak.

STI SeT Interrupt flag

IF ← 1. Interupsi hardware maskable diizinkan. Ini adalah kondisi normal/default.

CLI CLear Interrupt flag

IF ← 0. Interupsi hardware maskable ditolak/dinonaktifkan. NMI tetap aktif. INT n (software) tetap bisa dieksekusi.

⚠ Peringatan Serius: Jika Anda menulis CLI dan lupa menulis STI, seluruh interupsi hardware (keyboard, timer, disk) akan lumpuh. Keyboard tidak akan merespons, sistem bisa hang. Selalu pastikan setiap CLI memiliki STI yang sesuai.

Pola penggunaan CLI/STI
    CLI                    ; nonaktifkan interupsi hardware

    ; === Bagian kritis: operasi yang tidak boleh terganggu ===
    ; Misalnya: mengubah isi IVT, mengakses data yang juga
    ; digunakan oleh ISR, operasi timing presisi

    STI                    ; aktifkan kembali interupsi hardware

Kode 12.6: Pola dasar CLI → operasi kritis → STI. Sesingkat mungkin di antara CLI dan STI.

Catatan: IF Otomatis saat INT

Saat instruksi INT n dieksekusi, CPU secara otomatis men-set IF = 0 (dan TF = 0) sebelum melompat ke ISR. Ini mencegah interupsi hardware mengganggu ISR. Saat IRET dieksekusi, IF dipulihkan ke nilai sebelumnya dari stack. Jadi jika sebelum INT, IF=1, maka setelah IRET, IF akan kembali 1 secara otomatis.

12.14 Contoh Program: Input-Output Lengkap

Program berikut mendemonstrasikan kombinasi INT 21h (AH=09h cetak string, AH=01h baca karakter, AH=4Ch keluar) yang telah kita gunakan sepanjang semester, namun kini dengan pemahaman penuh tentang apa yang terjadi di balik setiap INT.

Assembly 8086
.model small
.stack 100h

.data
    msg1    db '=== Program Interupsi Demo ===', 0Dh, 0Ah, '$'
    msg2    db 'Tekan sembarang tombol: $'
    msg3    db 0Dh, 0Ah, 'Anda menekan: $'
    msg4    db 0Dh, 0Ah, 'Scan code: $'
    msg5    db 0Dh, 0Ah, 'Kode ASCII : $'
    msg_end db 0Dh, 0Ah, 'Selesai. Tekan ENTER untuk keluar.$'

.code
mulai:
    MOV  AX, @data
    MOV  DS, AX

    ; Cetak judul (INT 21h AH=09h)
    MOV  AH, 09h
    LEA  DX, msg1
    INT  21h                 ; → CPU push Flags,CS,IP → baca IVT offset 0084h
                            ; → lompat ke ISR DOS → cetak string → IRET → kembali ke sini

    ; Prompt input
    MOV  AH, 09h
    LEA  DX, msg2
    INT  21h

    ; Baca tombol (INT 16h AH=00h — BIOS keyboard)
    MOV  AH, 00h
    INT  16h                 ; AL = ASCII, AH = scan code
    MOV  BL, AL           ; simpan ASCII di BL
    MOV  BH, AH           ; simpan scan code di BH

    ; Tampilkan karakter yang ditekan
    MOV  AH, 09h
    LEA  DX, msg3
    INT  21h
    MOV  DL, BL
    MOV  AH, 02h
    INT  21h                 

    ; Tampilkan pesan akhir
    MOV  AH, 09h
    LEA  DX, msg_end
    INT  21h

    ; Tunggu ENTER lalu keluar
    MOV  AH, 01h
    INT  21h

    ; Akhiri program (INT 21h AH=4Ch)
    MOV  AH, 4Ch
    MOV  AL, 0              
    INT  21h                 

end mulai

Kode 12.7: Program demo yang menggabungkan INT 21h (DOS) dan INT 16h (BIOS) dengan komentar yang menjelaskan apa yang terjadi di setiap INT.

12.15 Tabel Layanan INT 21h yang Paling Sering Digunakan

AHFungsiRegister PentingAnalogi Bahasa C
01hBaca karakter (echo)Output: ALgetchar()
02hCetak karakterInput: DLputchar(dl)
05hCetak ke printerInput: DL
09hCetak string ('$'-terminated)Input: DS:DXprintf("%s", s)
0AhBaca string ke bufferInput: DS:DXfgets(buf, n, stdin)
25hSet interrupt vectorInput: AL=no.INT, DS:DX=addr ISR
35hGet interrupt vectorInput: AL=no.INT; Output: ES:BX=addr
4ChExit programInput: AL=return codeexit(code)

12.16 Tabel Ringkasan Interupsi Penting

INTSumberFungsi UtamaDigunakan Untuk
INT 00hInternal CPUDivide ErrorOtomatis saat bagi dengan nol
INT 02hHardware NMINon-Maskable InterruptKegagalan hardware kritis
INT 08hHardware IRQ0Timer Tick (18.2 Hz)Clock system, multitasking dasar
INT 09hHardware IRQ1KeyboardOtomatis saat tombol ditekan
INT 10hBIOS ROMVideo Display ServicesMode video, kursor, warna, tulis karakter
INT 13hBIOS ROMDisk I/O (low-level)Baca/tulis sektor disk langsung
INT 16hBIOS ROMKeyboard ServicesBaca tombol, cek status, shift flags
INT 20hDOSProgram TerminateCara lama mengakhiri program
INT 21hDOSDOS Function CallsI/O karakter, string, file, memori, tanggal, waktu

Kapan Pakai INT 10h/16h (BIOS) vs INT 21h (DOS)?

AspekBIOS (INT 10h, 16h)DOS (INT 21h)
LevelRendah (dekat hardware)Tinggi (abstraksi lebih tinggi)
PortabilitasHanya PC-compatibleSemua sistem DOS
KecepatanLebih cepat (langsung ke hardware)Lebih lambat (melalui lapisan DOS)
FiturWarna, kursor, scan code, mode videoFile, direktori, string buffer, tanggal
RekomendasiUntuk kontrol tampilan/karakter detailUntuk I/O umum, file, dan akhir program

12.17 Soal Latihan

Kerjakan soal-soal berikut untuk menguji pemahaman Anda. Klik "Lihat jawaban" setelah mencoba menjawab sendiri.

Soal 1. Apa perbedaan mendasar antara interupsi perangkat keras (hardware interrupt) dan interupsi perangkat lunak (software interrupt)? Berikan masing-masing satu contoh.

Lihat jawaban

Interupsi perangkat keras (hardware interrupt) datang dari sinyal eksternal pada pin CPU (INTR, NMI), misalnya: tombol keyboard ditekan, timer mengeluarkan pulsa, data tiba di port serial. Waktunya tidak dapat diprediksi oleh program (asinkron).

Interupsi perangkat lunak (software interrupt) dipicu oleh instruksi INT n di dalam program, misalnya: INT 21h untuk memanggil layanan DOS, INT 10h untuk layanan BIOS. Waktunya dapat diprediksi karena programmer yang menuliskan instruksinya (sinkron).

Soal 2. Jelaskan langkah-langkah yang dilakukan CPU 8086 ketika menerima interupsi, mulai dari deteksi hingga eksekusi Interrupt Service Routine (ISR).

Lihat jawaban

Langkah-langkahnya: (1) CPU menyelesaikan instruksi yang sedang dieksekusi, (2) CPU memeriksa apakah interupsi diizinkan (IF=1 untuk INTR, selalu untuk NMI), (3) CPU mendekrement SP dua kali dan mendorong (push) Flags Register ke stack, (4) CPU mendorong CS ke stack, (5) CPU mendorong IP ke stack, (6) CPU menghitung alamat vektor: 0000h + n × 4, (7) CPU membaca [CS:IP] baru dari tabel vektor interupsi, (8) CPU melompat ke alamat ISR dan mengeksekusinya, (9) Setelah ISR selesai (instruksi IRET), Flags, CS, dan IP di-pop dari stack, lalu eksekusi dilanjutkan.

Soal 3. Mengapa CPU perlu menyimpan Flags Register, CS, dan IP ke stack saat interupsi terjadi? Apa yang terjadi jika langkah ini tidak dilakukan?

Lihat jawaban

Ketiga nilai ini menyimpan keadaan lengkap program saat interupsi terjadi: IP menunjuk ke instruksi berikutnya yang harus dieksekusi setelah ISR selesai, CS menunjuk ke segmen kode tersebut, dan Flags Register menyimpan status semua flag (termasuk IF yang otomatis dinolkan oleh CPU agar interupsi tidak bersarang secara tak terkendali). Tanpa menyimpan ketiganya: (1) CPU tidak tahu harus kembali ke mana setelah ISR, (2) status flag hilang sehingga logika program rusak, (3) program akan crash atau berperilaku tak terduga.

Soal 4. Apa fungsi Instruksi IRET? Mengapa IRET berbeda dari RET biasa?

Lihat jawaban

IRET (Interrupt Return) melakukan tiga operasi POP secara berurutan: POP IP, lalu POP CS, lalu POP Flags. Ini kebalikan persis dari tiga PUSH yang dilakukan CPU saat menerima interupsi. RET biasa hanya melakukan POP IP (near RET) atau POP IP + POP CS (far RET) — tetapi tidak memulihkan Flags Register. Itulah mengapa ISR harus diakhiri IRET, bukan RET.

Soal 5. Tuliskan alamat memori (dalam bentuk segmen:offset) yang menyimpan vektor interupsi untuk INT 10h, INT 16h, dan INT 21h.

Lihat jawaban

Vektor interupsi disimpan di alamat 0000h + nomor_interupsi × 4:

INT 10h: 0000h + 10h × 4 = 0000h + 0040h = 0040h (2 byte IP di 0040h-0041h, 2 byte CS di 0042h-0043h).
INT 16h: 0000h + 16h × 4 = 0000h + 0058h = 0058h.
INT 21h: 0000h + 21h × 4 = 0000h + 0084h = 0084h.

Soal 6. Apa perbedaan antara instruksi CLI dan STI? Kapan seorang programmer perlu menggunakan keduanya?

Lihat jawaban

CLI (CLear Interrupt flag) men-set IF = 0, sehingga menonaktifkan semua interupsi perangkat keras maskable (yang masuk lewat pin INTR). STI (SeT Interrupt flag) men-set IF = 1, sehingga mengaktifkan kembali interupsi tersebut.

Digunakan ketika program melakukan operasi kritis yang tidak boleh terganggu, misalnya: mengubah isi Interrupt Vector Table (IVT), mengakses data yang juga diakses oleh ISR, atau operasi timing yang presisi. Pola umum: CLI → operasi kritis → STI. Penting: selalu pastikan STI dipanggil setelah CLI, jika tidak seluruh interupsi hardware akan lumpuh.

12.18 Kuis Bab 12

Uji pemahaman Anda. Pilih satu jawaban yang paling tepat. Setelah memilih, jawaban benar akan ditandai dan penjelasan muncul.

1. Berapa byte yang ditempati setiap entri di Interrupt Vector Table (IVT)?

2. Instruksi apa yang digunakan untuk kembali dari Interrupt Service Routine (ISR)?

3. Apa yang dilakukan instruksi CLI?

4. Interrupt Vector Table (IVT) pada 8086 terletak di alamat memori berapa?

5. Berapa banyak entri interupsi yang ada dalam IVT pada 8086?

6. Fungsi DOS INT 21h AH=01h digunakan untuk...

7. Apa perbedaan antara INT (software interrupt) dan INTR (hardware interrupt)?

8. Saat interupsi terjadi, register apa saja yang otomatis di-push oleh CPU ke stack?