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.
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.
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 errorPower failureWatchdog timer
Aspek
Software (INT n)
Hardware Maskable (INTR)
Non-Maskable (NMI)
Sumber
Instruksi program
Pin INTR (dari PIC 8259A)
Pin NMI
Waktu
Sinkron (dapat diprediksi)
Asinkron (kapan saja)
Asinkron (kapan saja)
Bisa dinonaktifkan?
Tidak relevan
Ya (IF=0 via CLI)
TIDAK
Nomor interupsi
Ditentukan programmer (n)
Diberikan PIC (0-7 untuk master)
Selalu 2 (tetap)
Vektor di IVT
00h–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.
Properti
Nilai
Lokasi di memori
0000h:0000h – 0000h:03FFh
Ukuran total
1024 byte (1 KB)
Jumlah entri
256 entri (nomor 00h – FFh)
Ukuran per entri
4 byte (2 byte IP offset + 2 byte CS segmen)
Rumus alamat entri
Alamat = 0000h + (nomor_int × 4)
AlamatIsi (IP:CS)
0000hINT 00h: Divide Error
0004hINT 01h: Single Step
0008hINT 02h: NMI
000ChINT 03h: Breakpoint
0010hINT 04h: Overflow
0014h – 003FhINT 05h – 0Fh: Reserved
0040hINT 10h: BIOS Video
0058hINT 16h: BIOS Keyboard
005Ch – 007FhINT 17h – 1Fh: BIOS lainnya
0080hINT 20h: DOS — Program Terminate
0084hINT 21h: DOS — Function Calls
0088h – 03FFhINT 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]
INT21h; panggil layanan DOSINT10h; panggil layanan BIOS videoINT20h; 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_isrPROCFAR; ... kode penanganan ...IRET; kembali ke programmy_isrENDP
INT vs IRET vs RET
Instruksi
Push ke Stack
Pop dari Stack
Flag Dipulihkan?
INT n
Flags, CS, IP (6 byte)
—
Tidak (push saja)
IRET
—
IP, 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_isrPROCFAR; ISR harus FAR (karena CS di-push oleh CPU)PUSHAX; ① Simpan register yang akan dipakaiPUSHBXPUSHDS; ② --- Kode penanganan interupsi ---; Baca data, proses, kirim respons, dll.POPDS; ③ Kembalikan register (urutan terbalik)POPBXPOPAXIRET; ④ Kembali (pop IP, CS, Flags)nama_isrENDP
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
Nomor
Jenis
Fungsi
00h
Internal CPU
Divide Error — pembagian dengan nol
01h
Internal CPU
Single Step — debugging (TF=1)
02h
Hardware (NMI)
Non-Maskable Interrupt
03h
Internal CPU
Breakpoint — instruksi INT 3 (1 byte)
04h
Internal CPU
Overflow — INTO instruction
05h–07h
Reserved
Tidak digunakan pada 8086
08h–0Fh
Hardware (PIC)
IRQ0–IRQ7 dari PIC 8259A
10h
BIOS
Video Display — layar, kursor, warna
11h
BIOS
Equipment Check
12h
BIOS
Memory Size
13h
BIOS
Disk I/O (level rendah)
14h
BIOS
Serial Communication
15h
BIOS
Cassette I/O / System
16h
BIOS
Keyboard — baca tombol, status
17h
BIOS
Printer
18h–1Fh
BIOS
ROM BASIC, Reload, Clock, dll.
20h
DOS
Program Terminate
21h
DOS
Function Calls — I/O, file, memori
22h–24h
DOS
Terminate Address (internal DOS)
25h–26h
DOS
Absolute Disk Read/Write
27h
DOS
Terminate but Stay Resident (TSR)
28h–FFh
User / Reserved
Tersedia 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:
AH
Fungsi
Input
Output
Keterangan
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 pesanMOVAH, 09hLEADX, msg_tanya
INT21h; Baca satu karakter dari keyboardMOVAH, 01hINT21h; AL = kode ASCII karakter yang ditekan; Pindahkan ke DL dan cetakMOVDL, ALMOVAH, 02hINT21h
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)
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 db20; byte 1: panjang maksimum input
akt_len db?; byte 2: panjang aktual (diisi DOS)
buffer db21dup(?) ; byte 3+: data karakter
msg db0Dh, 0Ah, '$'.code; Baca string dari keyboardMOVAH, 0AhLEADX, max_len ; DX menunjuk ke byte PERTAMA bufferINT21h; 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=09hMOVBL, akt_len ; BL = jumlah karakterXORBH, BH; BX = posisi akhir stringMOVBYTE PTR buffer[BX], '$'; Cetak string yang dibacaMOVAH, 09hLEADX, msg
INT21hLEADX, buffer
INT21h
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:
AH
Fungsi
Input Penting
Keterangan
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
; Set mode video teks 80×25 16 warnaMOVAH, 00hMOVAL, 03h; mode 3INT10h; Pindahkan kursor ke baris 10, kolom 20MOVAH, 02hMOVDH, 10MOVDL, 20MOVBH, 0INT10h; Tulis 'A' berwarna merah di atas latar hitam (atribut 0Ch)MOVAH, 09hMOVAL, 'A'MOVBL, 0ChMOVCX, 1MOVBH, 0INT10h
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 7Blink|Bit 6-4BG (Background)|Bit 3I (Intensity)|Bit 2-0FG (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.
AH
Fungsi
Input
Output
Keterangan
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:MOVAH, 01h; fungsi: cek status keyboardINT16h; TIDAK menungguJZtunggu_tombol; ZF=1 → belum ada tombol, ulangi; ZF=0 → ada tombol di buffer, baca sekarangMOVAH, 00h; fungsi: baca tombolINT16h
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.
STISeT Interrupt flag
IF ← 1. Interupsi hardware maskable diizinkan. Ini adalah kondisi normal/default.
CLICLear 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 presisiSTI; 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
.stack100h.data
msg1 db'=== Program Interupsi Demo ===', 0Dh, 0Ah, '$'
msg2 db'Tekan sembarang tombol: $'
msg3 db0Dh, 0Ah, 'Anda menekan: $'
msg4 db0Dh, 0Ah, 'Scan code: $'
msg5 db0Dh, 0Ah, 'Kode ASCII : $'
msg_end db0Dh, 0Ah, 'Selesai. Tekan ENTER untuk keluar.$'.codemulai:MOVAX, @dataMOVDS, AX; Cetak judul (INT 21h AH=09h)MOVAH, 09hLEADX, msg1
INT21h; → CPU push Flags,CS,IP → baca IVT offset 0084h; → lompat ke ISR DOS → cetak string → IRET → kembali ke sini; Prompt inputMOVAH, 09hLEADX, msg2
INT21h; Baca tombol (INT 16h AH=00h — BIOS keyboard)MOVAH, 00hINT16h; AL = ASCII, AH = scan codeMOVBL, AL; simpan ASCII di BLMOVBH, AH; simpan scan code di BH; Tampilkan karakter yang ditekanMOVAH, 09hLEADX, msg3
INT21hMOVDL, BLMOVAH, 02hINT21h; Tampilkan pesan akhirMOVAH, 09hLEADX, msg_end
INT21h; Tunggu ENTER lalu keluarMOVAH, 01hINT21h; Akhiri program (INT 21h AH=4Ch)MOVAH, 4ChMOVAL, 0INT21hend 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
AH
Fungsi
Register Penting
Analogi Bahasa C
01h
Baca karakter (echo)
Output: AL
getchar()
02h
Cetak karakter
Input: DL
putchar(dl)
05h
Cetak ke printer
Input: DL
—
09h
Cetak string ('$'-terminated)
Input: DS:DX
printf("%s", s)
0Ah
Baca string ke buffer
Input: DS:DX
fgets(buf, n, stdin)
25h
Set interrupt vector
Input: AL=no.INT, DS:DX=addr ISR
—
35h
Get interrupt vector
Input: AL=no.INT; Output: ES:BX=addr
—
4Ch
Exit program
Input: AL=return code
exit(code)
12.16 Tabel Ringkasan Interupsi Penting
INT
Sumber
Fungsi Utama
Digunakan Untuk
INT 00h
Internal CPU
Divide Error
Otomatis saat bagi dengan nol
INT 02h
Hardware NMI
Non-Maskable Interrupt
Kegagalan hardware kritis
INT 08h
Hardware IRQ0
Timer Tick (18.2 Hz)
Clock system, multitasking dasar
INT 09h
Hardware IRQ1
Keyboard
Otomatis saat tombol ditekan
INT 10h
BIOS ROM
Video Display Services
Mode video, kursor, warna, tulis karakter
INT 13h
BIOS ROM
Disk I/O (low-level)
Baca/tulis sektor disk langsung
INT 16h
BIOS ROM
Keyboard Services
Baca tombol, cek status, shift flags
INT 20h
DOS
Program Terminate
Cara lama mengakhiri program
INT 21h
DOS
DOS Function Calls
I/O karakter, string, file, memori, tanggal, waktu
Kapan Pakai INT 10h/16h (BIOS) vs INT 21h (DOS)?
Aspek
BIOS (INT 10h, 16h)
DOS (INT 21h)
Level
Rendah (dekat hardware)
Tinggi (abstraksi lebih tinggi)
Portabilitas
Hanya PC-compatible
Semua sistem DOS
Kecepatan
Lebih cepat (langsung ke hardware)
Lebih lambat (melalui lapisan DOS)
Fitur
Warna, kursor, scan code, mode video
File, direktori, string buffer, tanggal
Rekomendasi
Untuk kontrol tampilan/karakter detail
Untuk 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)?
Setiap entri IVT menempati 4 byte: 2 byte pertama menyimpan offset (IP) dan 2 byte berikutnya menyimpan segmen (CS) dari alamat Interrupt Service Routine (ISR). Dengan 256 entri, total ukuran IVT adalah 256 × 4 = 1024 byte (1 KB).
2. Instruksi apa yang digunakan untuk kembali dari Interrupt Service Routine (ISR)?
IRET (Interrupt Return) memulihkan IP, CS, dan Flags Register dari stack — tepat kebalikan dari apa yang di-push oleh CPU saat interupsi. RET hanya memulihkan IP (atau IP+CS untuk far RET) tetapi tidak memulihkan Flags.
3. Apa yang dilakukan instruksi CLI?
CLI (CLear Interrupt flag) men-set bit IF (Interrupt Flag) menjadi 0, yang menonaktifkan semua interupsi yang masuk melalui pin INTR. Interupsi non-maskable (NMI) tetap aktif.
4. Interrupt Vector Table (IVT) pada 8086 terletak di alamat memori berapa?
IVT selalu dimulai dari alamat absolut 0000h:0000h (awal memori). Ini adalah lokasi tetap yang tidak dapat diubah. 1024 byte pertama memori (0000h sampai 03FFh) digunakan sepenuhnya oleh IVT.
5. Berapa banyak entri interupsi yang ada dalam IVT pada 8086?
IVT memiliki 256 entri (nomor 00h sampai FFh), masing-masing 4 byte. Total 256 × 4 = 1024 byte (1 KB). Nomor interupsi 00h-1Fh untuk CPU internal, 20h-Fh untuk DOS, 10h-1Fh untuk BIOS, dan sisanya tersedia.
6. Fungsi DOS INT 21h AH=01h digunakan untuk...
INT 21h AH=01h membaca satu karakter dari keyboard buffer dan menampilkannya di layar (echo). Karakter dikembalikan di register AL. Jika pengguna menekan tombol tanpa kode ASCII (seperti F1), fungsi ini menunggu tombol yang valid.
7. Apa perbedaan antara INT (software interrupt) dan INTR (hardware interrupt)?
INT n adalah instruksi yang ditulis programmer — dipicu secara sinkron pada waktu yang ditentukan. INTR adalah pin fisik pada CPU yang menerima sinyal dari chip Programmable Interrupt Controller (PIC) — dipicu secara asinkron kapan saja (jika IF=1).
8. Saat interupsi terjadi, register apa saja yang otomatis di-push oleh CPU ke stack?
CPU secara otomatis mendorong tiga hal ke stack saat menerima interupsi: Flags Register (2 byte), CS (2 byte), dan IP (2 byte), total 6 byte. Register lainnya (AX, BX, dll.) TIDAK otomatis disimpan — jika ISR menggunakannya, programmer harus push/pop secara manual.