Bölüm 5: Kesmeler

Mikroişlemciler
Kesme kavramıKesme türleriVektör tablosuINT ve IRETAlt fonksiyonlarINT 10h ekranINT 16h klavyeINT 21h DOSÖrnek: ikilik yazdırmaDonanım kesmeleri
Sercan KÜLCÜ · Giresun Üniversitesi · Elektrik-Elektronik Mühendisliği

Giriş

Öğrenme Çıktıları

Kavram

Kesmenin ne olduğunu, yoklamadan (polling) farkını ve kesme türlerini açıklamak.

Mekanizma

Kesme vektör tablosunu kullanarak INT n ile hangi adrese gidileceğini hesaplamak.

Yığın

INT ve IRET sırasında FLAGS, CS ve IP'nin yığına nasıl yazılıp geri alındığını izlemek.

Uygulama

BIOS (INT 10h, INT 16h) ve DOS (INT 21h) hizmetleriyle ekrana yazan, tuş bekleyen programlar yazmak.

Kesme Kavramı

Kesme Nedir?

  • Kesme (interrupt), işlemcinin o anki işini geçici olarak bırakıp özel bir yordamı çalıştırmasını sağlayan olaydır.
  • Çalıştırılan yordama kesme hizmet yordamı denir: ISR (interrupt service routine).
  • ISR bitince işlemci, kaldığı komuttan devam eder; ana program kesildiğini fark etmez.
  • Yazılım kesmeleri, programlamayı kolaylaştıran hazır hizmetlerdir: karakter yazdırmak için kod yazmak yerine bir kesme çağrılır.
  • Ekran, klavye, disk sürücüsü, bellek yönetimi gibi donanımlarla çalışan kesme işlevleri vardır.
  • Kesmeler donanım tarafından da tetiklenebilir (klavyeye basılması, zamanlayıcı).
Günlük hayattan

Kitap okurken telefon çalar: sayfayı işaretlersiniz (dönüş adresini saklama), telefonu açarsınız (ISR), kapatınca işaretli sayfadan okumaya devam edersiniz (IRET).

Kesme Kavramı

Yoklama mı, Kesme mi?

Yoklama (polling)hazır?hazır?hazır?hazır?hazır?hazır?hazır?hazır?hazır?hazır?CPU sürekli aygıtı sorar; çoğu soru boşa gider, veri geç fark edilebilir.Kesme (interrupt)ana programISRana program (kaldığı yerden)aygıt: “veri hazır”IRET ile dönüş

Yoklama

  • Basit, ek donanım gerekmez.
  • CPU zamanı boşa harcanır.
  • Olay, sorgu aralığına bağlı olarak geç algılanır.

Kesme

  • CPU yalnızca olay olduğunda meşgul edilir.
  • Olaya hızlı tepki verilir.
  • Vektör tablosu, yığın ve ISR düzeni gerekir.

Kesme Kavramı

Kesme Türleri

Yazılım kesmesi

Program içindeki INT n komutuyla bilerek çağrılır. BIOS ve DOS hizmetleri bu yolla kullanılır. INT 3 (kesme noktası) ve INTO (OF=1 ise INT 4) de yazılım kesmesidir.

Donanım kesmesi

Dış aygıt bir pini sürer. INTR maskelenebilir (IF=0 iken dikkate alınmaz), NMI maskelenemez (ör. bellek eşlik hatası, güç kaybı).

İç kesme (istisna)

İşlemcinin kendisi üretir: sıfıra bölme / bölüm taşması → INT 0, TF=1 iken her komuttan sonra tek adım → INT 1.

TipKaynakAçıklama
00hiçBölme hatası (DIV/IDIV sıfıra bölme veya bölüm sığmıyor)
01hiçTek adım (TF = 1) — hata ayıklayıcılar kullanır
02hdonanımNMI pini (maskelenemez)
03hyazılımKesme noktası; tek baytlık INT 3 (CCh)
04hyazılımINTO: OF = 1 ise taşma kesmesi
05h–FFh—Intel 05h–1Fh'yi ayırmıştır; PC'de BIOS, DOS ve kullanıcı programları kullanır

Kesme Vektör Tablosu

Kesme Vektör Tablosu (IVT)

  • Belleğin en başındaki 1 KB: 00000h–003FFh.
  • 256 kesme tipinin her biri için 4 baytlık bir vektör (ISR'nin adresi) tutulur.
  • Düşük adresli sözcük IP (bağıl konum), yüksek adresli sözcük CS (kesim) değeridir; ikisi de little-endian.
  • Tip n için vektörün adresi: n × 4.
  • Vektörü değiştirmek, kesmeyi başka bir yordama yönlendirmek demektir.
adres (0000:…)+0, +1+2, +30000hIPCSINT 00h0004hIPCSINT 01h0008hIPCSINT 02h000ChIPCSINT 03h⋮0040hIP = F065hCS = F000hINT 10h⋮0084hIPCSINT 21h⋮03FChIPCSINT FFh256 giriş × 4 bayt = 1024 bayt (0000:0000 – 0000:03FF)

INT 10h vektörü için gösterilen F000:F065 değeri, orijinal IBM PC BIOS'undaki video yordamının adresidir (örnek).

Kesme Vektör Tablosu

Vektör Adresi Adım Adım

INT 10hkesme tipi n = 10h = 16

Program INT 10h komutunu çalıştırır. Tip numarası n = 10h (16).

10h × 4 = 40h16 × 4 = 64 → adres 0000:0040h

Vektör adresi n × 4: 10h × 4 = 40h. (Hex'te ×4, iki bit sola kaydırmaktır.)

0040h65h0041hF0h0042h00h0043hF0h} IP = F065h} CS = F000h

Bu 4 bayt okunur: düşük sözcük IP = F065h, yüksek sözcük CS = F000h (little-endian: önce düşük bayt).

fiziksel adres = CS × 16 + IPF0000h + F065h = FF065h

Yığına dönüş bilgisi yazıldıktan sonra CS:IP = F000:F065 yüklenir; ISR, fiziksel FF065h adresinden çalışmaya başlar.

Kesme Vektör Tablosu

Demo: Vektör Hesaplayıcı

Bir kesme tipi girin (00h–FFh): tablodaki konumu ve kesmenin bilinen görevi gösterilir.

Hesap her zaman aynıdır: adres = n × 4. IP bu adreste, CS ise n × 4 + 2 adresindedir.

INT ve IRET

INT n Nasıl Çalışır?

1. FLAGS yazmacı yığına itilir: SP ← SP − 2, [SS:SP] ← FLAGS.
2. IF = 0 ve TF = 0 yapılır: ISR başka maskelenebilir kesmelerle ve tek adımla kesilmez.
3. CS yığına itilir.
4. IP (INT'ten sonraki komutun adresi) yığına itilir.
5. IP ← [n×4], CS ← [n×4+2]: ISR başlar.
6. ISR sonunda IRET: IP, CS ve FLAGS sırasıyla yığından geri alınır, program kaldığı yerden sürer.
Yığına toplam 6 bayt (3 sözcük) yazılır. IF'nin eski değeri FLAGS ile birlikte saklandığı için IRET onu da geri yükler.

INT ve IRET

INT ve IRET: Yığın Adım Adım

yığın (SS = 0700h)FFF6hFFF8hFFFAhFFFChFFFEh← SPCS0700hIP0104hSPFFFEhFLAGS0202h

INT 10h 0700:0104'te. SP = FFFEh, FLAGS = 0202h (IF = 1, örnek).

yığın (SS = 0700h)FFF6hFFF8hFFFAhFFFCh0202h← SPFFFEhCS0700hIP0104hSPFFFChFLAGS0202h

FLAGS itilir: SP = FFFCh, [FFFCh] = 0202h.

yığın (SS = 0700h)FFF6hFFF8hFFFAhFFFCh0202h← SPFFFEhCS0700hIP0104hSPFFFChFLAGS0002h

IF = 0, TF = 0 → FLAGS = 0002h. Eski değer yığında güvende.

yığın (SS = 0700h)FFF6hFFF8hFFFAh0700h← SPFFFCh0202hFFFEhCS0700hIP0104hSPFFFAhFLAGS0002h

CS itilir: SP = FFFAh, [FFFAh] = 0700h.

yığın (SS = 0700h)FFF6hFFF8h0106h← SPFFFAh0700hFFFCh0202hFFFEhCS0700hIP0104hSPFFF8hFLAGS0002h

Dönüş adresi itilir: INT 10h 2 bayt olduğu için 0106h. SP = FFF8h.

yığın (SS = 0700h)FFF6hFFF8h0106h← SPFFFAh0700hFFFCh0202hFFFEhCSF000hIPF065hSPFFF8hFLAGS0002h

CS:IP ← vektör (F000:F065). ISR çalışır ve karakteri yazar.

yığın (SS = 0700h)FFF6hFFF8h0106hFFFAh0700hFFFCh0202h← SPFFFEhCS0700hIP0106hSPFFFChFLAGS0002h

IRET: IP ← 0106h, CS ← 0700h (SP = FFFCh).

yığın (SS = 0700h)FFF6hFFF8h0106hFFFAh0700hFFFCh0202hFFFEh← SPCS0700hIP0106hSPFFFEhFLAGS0202h

FLAGS ← 0202h, SP = FFFEh. Program 0106h'den devam eder. (Yığındaki eski değerler silinmez, yalnızca SP geri çekilir.)

INT ve IRET

INT/IRET ile CALL/RET

CALL / RETINT n / IRET
Hedef adreskomutun içinde (etiket)vektör tablosundan (n × 4)
Yığına yazılanIP (yakın) veya CS + IP (uzak)FLAGS + CS + IP (6 bayt)
BayraklardeğişmezIF = 0, TF = 0 yapılır
DönüşRET: IP (ve CS) geri alınırIRET: IP, CS, FLAGS geri alınır
Komut boyu3 bayt (yakın CALL)2 bayt (INT 3: 1 bayt)
Kim çağırır?yalnız programprogram, işlemci (istisna) veya donanım
ISR'yi RET ile bitirmek hatadır: FLAGS yığında kalır, SP 2 bayt kayar ve IF eski hâline dönmez. ISR'ler daima IRET ile biter.

Yazılım Kesmeleri

INT Komutu ve Alt Fonksiyonlar

  • Yazılım kesmesi INT değer komutuyla çağrılır; değer 0–255 (0–0FFh) arasında bir sayıdır.
  • Bir kesmenin birçok alt fonksiyonu olabilir.
  • Alt fonksiyon, kesme çağrılmadan önce AH yazmacına yazılarak seçilir.
  • AH 8 bit olduğundan her kesmenin en fazla 256 alt fonksiyonu olabilir: 256 × 256 = 65 536 farklı hizmet (teorik üst sınır).
  • Diğer yazmaçlar (AL, BX, CX, DX, DS:DX …) parametre iletmek ve sonuç almak için kullanılır.
MOV AH, 0Eh   ; alt fonksiyon
MOV AL, 'A'   ; parametre
INT 10h       ; hizmeti çağır
Bazı hizmetler AL'yi de alt-alt fonksiyon olarak kullanır (ör. INT 10h, AX = 4F00h: VESA). Kesme, sonucu çoğunlukla AL/AX'te ya da bayraklarda (CF, ZF) döndürür.

Yazılım Kesmeleri

Sık Kullanılan Kesmeler

KesmeKatmanGörevÖrnek alt fonksiyonlar
INT 10hBIOSVideo / ekran00h kip seç, 02h imleç konumu, 0Eh karakter yaz (teletype)
INT 13hBIOSDisk02h sektör oku, 03h sektör yaz
INT 16hBIOSKlavye00h tuş bekle ve oku, 01h tuş var mı?
INT 1AhBIOSSaat00h tik sayacını oku
INT 20hDOSProgramı sonlandır—
INT 21hDOSDOS hizmetleri01h tuş oku, 02h karakter yaz, 09h dizge yaz, 4Ch çık
INT 33hsürücüFare00h sıfırla, 03h konum ve düğmeler
emu8086 bu kesmelerin önemli bir kısmını taklit eder; tam liste için emu8086 yardımındaki “supported interrupts” sayfasına bakılabilir.

Yazılım Kesmeleri

BIOS ve DOS Katmanları

Uygulama programıDOS (INT 21h …)BIOS (INT 10h, 16h …)DonanımINT 21hINT 10h(doğrudan)
BIOS

ROM'daki temel giriş/çıkış sistemi. İşletim sisteminden bağımsızdır; açılışta vektör tablosunu doldurur.

DOS

İşletim sistemi hizmetleri: dosya, bellek, program yükleme/sonlandırma. Kendi işi için çoğu zaman BIOS'u çağırır.

INT 10h: Ekran

Ekrana Yazı Yazma

ORG    100h
MOV    AH, 0Eh    ; alt fonksiyon seç.
MOV    AL, 'H'    ; ASCII kodu: 72
INT    10h        ; yazdır!
MOV    AL, 'e'    ; ASCII kodu: 101
INT    10h        ; yazdır!
MOV    AL, 'l'    ; ASCII kodu: 108
INT    10h        ; yazdır!
MOV    AL, 'l'    ; ASCII kodu: 108
INT    10h        ; yazdır!
RET               ; işletim sistemine geri dön.
  • INT 10h, ekrana karakter yazdırmak ve imleci hareket ettirmek için kullanılır.
  • 0Eh alt fonksiyonu (teletype): AL'deki ASCII kodunu imlecin olduğu yere yazar ve imleci bir ilerletir.
  • Her karakter için AL'ye ASCII kodu atanır, ardından INT 10h çağrılır.
  • AH, kesme tarafından değiştirilmediği için yalnızca bir kez ayarlanır.
  • Program ekrana Hell yazar; “Hello” için iki komut daha gerekir.

INT 10h: Ekran · Kodu adım adım çalıştır

Kod İzleme: INT 10h / 0Eh

_AH0EhAL00h

AH = 0Eh: teletype alt fonksiyonu seçildi.

_AH0EhAL48h'H' = 72

AL ← 'H' = 72 = 48h.

H_AH0EhAL48h'H' = 72

INT 10h: 'H' yazılır, imleç bir sağa geçer.

H_AH0EhAL65h'e' = 101

AL ← 'e' = 101 = 65h.

He_AH0EhAL65h'e' = 101

INT 10h: 'e' yazılır, imleç bir sağa geçer.

He_AH0EhAL6Ch'l' = 108

AL ← 'l' = 108 = 6Ch.

Hel_AH0EhAL6Ch'l' = 108

INT 10h: 'l' yazılır, imleç bir sağa geçer.

Hel_AH0EhAL6Ch'l' = 108

AL ← 'l' = 108 = 6Ch.

Hell_AH0EhAL6Ch'l' = 108

INT 10h: 'l' yazılır, imleç bir sağa geçer.

Hell_AH0EhAL6Ch

RET: COM programı DOS'a döner. Ekranda Hell kalır.

ORG    100h
MOV    AH, 0Eh    ; alt fonksiyon seç.
MOV    AL, 'H'    ; ASCII kodu: 72
INT    10h        ; yazdır!
MOV    AL, 'e'    ; ASCII kodu: 101
INT    10h        ; yazdır!
MOV    AL, 'l'    ; ASCII kodu: 108
INT    10h        ; yazdır!
MOV    AL, 'l'    ; ASCII kodu: 108
INT    10h        ; yazdır!
RET               ; işletim sistemine geri dön.

INT 10h: Ekran

INT 10h: Diğer Alt Fonksiyonlar

AHİşlevGirdiNot
00hVideo kipini seçAL = kip (03h: 80×25 metin)ekranı da temizler
02hİmleci konumlandırBH = sayfa, DH = satır, DL = sütunsol üst köşe (0, 0)
03hİmleç konumunu okuBH = sayfaDH, DL'de döner
06hPencereyi yukarı kaydırAL = satır sayısı (0: temizle), BH = renk, CX–DX = köşelerekran temizleme
09hKarakter + renk yazAL = karakter, BL = renk, CX = tekrarimleç ilerlemez
0EhTeletype yazAL = karakter (BH = sayfa)imleç ilerler, CR/LF işlenir
Metin kipinde ekran 80 sütun × 25 satırdır; her hücre bir ASCII kodu ve bir renk (öznitelik) baytı tutar.

INT 10h: Ekran

Demo: Metinden INT 10h Koduna

Bir metin yazın: her karakter için gereken MOV AL / INT 10h çifti ve ASCII kodları üretilir.

INT 16h: Klavye

Klavye Tuşunu Bekleme

ORG 100h
; wait for any key press:
MOV AH, 0
INT 16H
RET
  • INT 16h, BIOS klavye hizmetidir.
  • AH = 00h: bir tuşa basılana kadar bekler; tuş arabellekten alınır.
  • Dönüşte AL = ASCII kodu, AH = tarama kodu (scan code). Ör. 'a' → AL = 61h, AH = 1Eh.
  • Ekrana bir şey yazmaz (yankı yoktur).
  • AH = 01h: beklemeden kontrol eder; tuş yoksa ZF = 1, varsa ZF = 0 ve AX'te tuş (arabellekten silinmez).
  • Program sonundaki MOV AH,0 / INT 16h, çıktı ekranının kapanmadan önce okunabilmesini sağlar.

INT 16h: Klavye · Kodu adım adım çalıştır

Kod İzleme: Tuşu Oku ve Yankıla

AH = 0: “tuş bekle ve oku” alt fonksiyonu.

INT 16h: program burada bekler; kullanıcı henüz tuşa basmadı.

Kullanıcı a tuşuna bastı: AL = 61h ('a'), AH = 1Eh (A tuşunun tarama kodu). Ekranda henüz bir şey yok.

AH = 0Eh. AL hâlâ 61h: okunan karakter doğrudan yazdırılabilir.

INT 10h: 'a' ekrana yazılır (yankı).

RET: DOS'a dönüş.

ORG 100h
MOV AH, 0      ; tuş bekle
INT 16h        ; AL = ASCII, AH = tarama
MOV AH, 0Eh    ; teletype
INT 10h        ; AL'yi yaz
RET

INT 21h: DOS

INT 21h Hizmetleri

AHİşlevGirdiÇıktı
01hTuş oku, ekrana yankıla—AL = ASCII
02hKarakter yazDL = karakterAL = DL
09hDizge yazDS:DX = '$' ile biten dizge—
0AhSatır oku (arabellekli)DS:DX = arabellekarabellek dolar
4ChProgramı sonlandırAL = dönüş kodu—
MOV AH, 2     ; karakter yaz
MOV DL, '*'
INT 21h       ; ekranda: *
MOV AH, 9     ; dizge yaz
LEA DX, msg
INT 21h
msg DB 'Merhaba$'

INT 21h: DOS

INT 10h/0Eh mi, INT 21h/02h mi?

BIOS · INT 10h, AH = 0Eh
  • Karakter AL'de.
  • Doğrudan video BIOS'u; DOS gerekmez.
  • Açılış (boot) kodunda da çalışır.
  • Renk (grafik kipte BL) verilebilir.
DOS · INT 21h, AH = 02h
  • Karakter DL'de.
  • DOS çağrısı; çıktı yönlendirilebilir (dosyaya, yazıcıya).
  • Dönüşte AL = DL olur.
  • Ctrl+Break denetimi yapılır.
İkisi de bir karakter yazar ve imleci ilerletir; seçim, programın hangi ortamda çalışacağına bağlıdır. Aynı programda karıştırılabilir.

Örnek Program

Toplama, Çıkarma ve Sonucu Yazdırma

org 100h
mov al, 5       ; bin=00000101b
mov bl, 10      ; hex=0ah or bin=00001010b
; 5 + 10 = 15 (decimal), 0fh, 00001111b
add bl, al
; 15 - 1 = 14 (decimal), 0eh, 00001110b
sub bl, 1
mov cx, 8       ; sonucu ikilik tabanda yazdır
print:
mov ah, 2   ; yazdırma fonksiyonu
mov dl, '0'
test bl, 10000000b  ; ilk biti test et
jz zero
mov dl, '1'
zero:
int 21h
shl bl, 1
loop print
; b (binary suffix) yazdır
mov dl, 'b'
int 21h
; klavye tuşu basılmasını bekle
mov ah, 0
int 16h
ret
  • 5 + 10 − 1 = 14 = 0Eh hesaplanır; sonuç BL'dedir.
  • Döngü 8 kez (CX = 8) çalışır: her turda BL'nin en anlamlı biti (MSB) test edilir, '0' ya da '1' yazılır, BL bir sola kaydırılır.
  • En sonda 'b' eki yazılır ve bir tuşa basılması beklenir. Beklenen çıktı: 00001110b.

Örnek Program

TEST ve SHL ile Bit Okuma

BL0706050413121100maske10000000AND → 00000000ZF = 1 (bit 7 = 0)

TEST BL, 10000000b: BL ile maske VE'lenir ama BL değişmez. Sonuç 0 ise bit 7 = 0 → ZF = 1, JZ atlar.

önce0706050413121100sonra00011100CF0bit 7 → CFsağdan 0 girer

SHL BL, 1: tüm bitler bir sola kayar; çıkan bit 7 CF'ye gider, bit 0'a 0 girer. Bir sonraki bit, test edilecek konuma (bit 7) gelir.

tur:12345678bit:00001110

8 tur sonunda BL'nin bitleri MSB'den LSB'ye sırayla yazılmış olur: 00001110, ardından b.

Alternatif: SHL BL,1 ardından JC ile CF'ye bakmak. Ancak bu sıralamada kaydırma, yazdırmadan önce yapılmalıdır.

Örnek Program · Kodu adım adım çalıştır

Kod İzleme (1/2): Hesaplama

AL = 5 = 05h = 00000101b. MOV bayrakları etkilemez.

BL = 10 = 0Ah = 00001010b.

ADD BL, AL: BL = 0Ah + 05h = 0Fh (15). Taşma yok (CF = 0), sonuçta dört 1 biti var → PF = 1.

SUB BL, 1: BL = 0Eh (14) = 00001110b. Üç 1 biti → PF = 0. Ödünç yok: CF = 0.

CX = 8: LOOP sayacı, her bit için bir tur.

org 100h
mov al, 5       ; bin=00000101b
mov bl, 10      ; hex=0ah or bin=00001010b
; 5 + 10 = 15 (decimal), 0fh, 00001111b
add bl, al
; 15 - 1 = 14 (decimal), 0eh, 00001110b
sub bl, 1
mov cx, 8       ; sonucu ikilik tabanda yazdır

Örnek Program · Kodu adım adım çalıştır

Kod İzleme (2/2): İkilik Yazdırma

BL0706050413121100CF0DL—

Tur 1: AH = 2 (DOS karakter yaz).

BL0706050413121100CF0DL'0'

Varsayılan karakter DL = '0' (30h).

BL0706050413121100maske 10000000b → bit 7CF0DL'0'

TEST: bit 7 = 0 → ZF = 1, CF = 0.

BL0706050413121100maske 10000000b → bit 7CF0DL'0'

ZF = 1 → JZ zero atlar; DL '0' kalır.

BL0706050413121100CF0DL'0'

INT 21h: DL'deki '0' yazılır.

BL0706051413120100CF0DL'0'

SHL BL,1: BL = 1Ch, çıkan bit CF = 0.

BL0706051413120100CF0DL'0'

LOOP: CX = 7 ≠ 0 → print'e dön.

BL0706151413020100CF0DL'0'

Tur 2 (özet): bit = 0, '0' yazıldı, BL = 38h. LOOP: CX = 6 ≠ 0 → print'e dön.

BL0716151403020100CF0DL'0'

Tur 3 (özet): bit = 0, '0' yazıldı, BL = 70h. LOOP: CX = 5 ≠ 0 → print'e dön.

BL1716150403020100CF0DL'0'

Tur 4 (özet): bit = 0, '0' yazıldı, BL = E0h. LOOP: CX = 4 ≠ 0 → print'e dön.

BL1716150403020100CF0DL'0'

Tur 5: AH = 2 (DOS karakter yaz).

BL1716150403020100CF0DL'0'

Varsayılan karakter DL = '0' (30h).

BL1716150403020100maske 10000000b → bit 7CF0DL'0'

TEST: bit 7 = 1 → ZF = 0, CF = 0.

BL1716150403020100maske 10000000b → bit 7CF0DL'0'

ZF = 0 → JZ atlamaz, sıradaki komut çalışır.

BL1716150403020100maske 10000000b → bit 7CF0DL'1'

DL = '1' (31h).

BL1716150403020100CF0DL'1'

INT 21h: DL'deki '1' yazılır.

BL1716050403020100CF1DL'1'

SHL BL,1: BL = C0h, çıkan bit CF = 1.

BL1716050403020100CF1DL'1'

LOOP: CX = 3 ≠ 0 → print'e dön.

BL1706050403020100CF1DL'1'

Tur 6 (özet): bit = 1, '1' yazıldı, BL = 80h. LOOP: CX = 2 ≠ 0 → print'e dön.

BL0706050403020100CF1DL'1'

Tur 7 (özet): bit = 1, '1' yazıldı, BL = 00h. LOOP: CX = 1 ≠ 0 → print'e dön.

BL0706050403020100CF0DL'0'

Tur 8 (özet): bit = 0, '0' yazıldı, BL = 00h. LOOP: CX = 0 → döngü biter.

BL0706050403020100CF0DL'b'

DL = 'b'. AH hâlâ 2.

BL0706050403020100CF0DL'b'

INT 21h: 'b' eki yazılır.

BL0706050403020100CF0DL'b'

AH = 0: tuş bekleme.

BL0706050403020100CF0DL'b'

INT 16h: kullanıcı bir tuşa basana kadar beklenir (çıktı okunabilsin).

BL0706050403020100CF0DL'b'

RET: program biter. Ekranda 00001110b.

print:
mov ah, 2   ; yazdırma fonksiyonu
mov dl, '0'
test bl, 10000000b  ; ilk biti test et
jz zero
mov dl, '1'
zero:
int 21h
shl bl, 1
loop print
; b (binary suffix) yazdır
mov dl, 'b'
int 21h
; klavye tuşu basılmasını bekle
mov ah, 0
int 16h
ret

Örnek Program

Ekran Çıktısı ve Notlar

00001110b_

emu8086 ekran penceresi (80×25)

  • Sayının içi zaten ikiliktir; yazdırmak, her biti '0'/'1' karakterine çevirmektir.
  • TEST sonucu saklamadığı için BL bozulmaz; bozan yalnızca SHL'dir (bilerek).
  • LOOP CX'i azaltır; döngü içinde CX başka amaçla kullanılmamalıdır.
  • INT 21h/02h AL'yi değiştirir (AL = DL); AL'de saklanan bir değer varsa önce korunmalıdır.

Donanım Kesmeleri

8086'nın Kesme Pinleri

8086INTRINTA̅NMID0–D78259A PICIR0IR1IR2IR3IR4IR5IR6tip numarası (ör. 08h)ZamanlayıcıKlavyeDisk, seri port…IRQ0IRQ1güç / eşlik hatası
INTR

Maskelenebilir istek. IF = 1 ise kabul edilir. STI IF'yi 1, CLI 0 yapar.

INTA̅

Kesme onayı (çıkış). İki darbe gönderilir; ikincisinde denetleyici tip numarasını D0–D7'ye koyar.

NMI

Maskelenemez; yükselen kenarla tetiklenir, her zaman INT 2 olarak işlenir.

Donanım Kesmeleri

INTR Kabul Süreci

1. Aygıt (ör. klavye) IRQ1 hattını etkinleştirir; 8259A INTR pinini 1 yapar.
2. 8086 o anki komutu bitirir; kesmeler komut ortasında kabul edilmez.
3. IF = 0 ise istek bekletilir. IF = 1 ise kabul edilir.
4. CPU iki INTA̅ darbesi üretir; ikinci darbede 8259A tip numarasını (PC'de klavye için 09h) veri yoluna koyar.
5. Bundan sonrası INT n ile aynıdır: FLAGS, CS, IP yığına; IF = TF = 0; CS:IP ← [n×4].
6. ISR işini bitirince 8259A'ya EOI (kesme sonu) gönderir ve IRET ile döner.

Donanım Kesmeleri

Öncelik ve PC Kesme Haritası

8086 öncelik sırası

SıraKaynak
1 (en yüksek)Bölme hatası, INT n, INTO
2NMI
3INTR
4 (en düşük)Tek adım (TF)

Aynı anda birden çok istek varsa, yüksek öncelikli olan önce hizmet görür.

IBM PC donanım kesmeleri

IRQAygıtTip
0Zamanlayıcı (18,2 Hz)08h
1Klavye09h
3 / 4Seri portlar0Bh / 0Ch
6Disket0Eh
7Yazıcı0Fh
Klavyeye basılınca önce donanım kesmesi INT 09h çalışır ve tuşu arabelleğe koyar; programın çağırdığı INT 16h bu arabellekten okur.

Donanım Kesmeleri

Kendi Kesme Yordamımız

org 100h
mov ax, 0
mov es, ax          ; ES = 0: IVT kesimi
cli                 ; kesmeleri kapat
mov word ptr es:[90h*4], offset isr  ; IP
mov word ptr es:[90h*4+2], cs       ; CS
sti                 ; kesmeleri aç
int 90h             ; kendi kesmemiz
ret
isr:
mov ah, 0Eh
mov al, '*'
int 10h
iret                ; RET değil!
  • Kullanılmayan bir tip seçilir: 90h. Vektörü 90h × 4 = 240h adresindedir.
  • IVT 0000 kesimindedir; ES = 0 yapılır.
  • Vektör yazılırken CLI/STI ile korunur: yarım yazılmış vektörle kesme gelmemelidir.
  • INT 90h ekrana * yazar ve program devam eder.
  • DOS altında INT 21h, AH = 25h (vektör ata) / 35h (vektör oku) daha güvenli yoldur.

Özet

Özet

Kesme

İşlemci işini bırakır, ISR'yi çalıştırır, IRET ile kaldığı yere döner.

Vektör tablosu

0000:0000–03FF, 256 × 4 bayt. Tip n → adres n × 4 (IP), n × 4 + 2 (CS).

INT n

FLAGS, CS, IP yığına (SP −6), IF = TF = 0, CS:IP ← vektör.

Alt fonksiyon

AH ile seçilir; parametreler diğer yazmaçlarda.

BIOS

INT 10h/0Eh AL'yi yazar; INT 16h/00h tuş bekler (AL = ASCII, AH = tarama kodu).

DOS

INT 21h/02h DL'yi yazar; 09h '$' ile biten dizgeyi yazar; 4Ch çıkar.

Özet

Alıştırmalar

  1. INT 13h vektörü hangi fiziksel adreslerde bulunur?
  2. INT 21h çalışmadan önce SP = FFFEh ise ISR içindeyken SP kaçtır? Yığında ne vardır?
  3. Ekrana Hello yazdırmak için kesmeler bölümündeki programı tamamlayın.
  4. Ekrana INT 21h/09h ile “Merhaba Dünya” yazan programı yazın.
  5. Basılan tuşun ASCII kodunu ikilik olarak yazan bir program tasarlayın.
  6. ISR'nin IRET yerine RET ile bitmesi ne gibi sorunlara yol açar?
İpuçları / cevaplar
  1. 13h × 4 = 4Ch → 0004Ch–0004Fh (IP: 4Ch–4Dh, CS: 4Eh–4Fh).
  2. SP = FFF8h. [FFF8h] = dönüş IP'si, [FFFAh] = CS, [FFFCh] = FLAGS.
  3. Sona MOV AL,'o' ve INT 10h eklenir.
  4. msg DB 'Merhaba Dünya$', LEA DX,msg, MOV AH,9, INT 21h; 'ü' için kod sayfası desteği gerekir.
  5. MOV AH,0 / INT 16h → MOV BL,AL, ardından örnek programdaki döngü (CX = 8).
  6. FLAGS yığında kalır (SP 2 bayt kayar), IF = 0 olarak kalır, ilk RET'te yanlış dönüş adresi alınabilir.

Özet

Kaynaklar

  • A. S. Tanenbaum, Modern Operating Systems, 3. baskı, Pearson, 2008 (kaynak sunumda faydalanılmıştır).
  • Intel, The 8086 Family User's Manual, 1979 — Interrupts bölümü.
  • B. B. Brey, The Intel Microprocessors, 8. baskı, Pearson, 2009 — Bölüm 6 ve 12.
  • emu8086 yardım belgeleri: “Interrupts” ve “Supported interrupts” sayfaları.
  • R. Brown, Ralf Brown's Interrupt List (BIOS/DOS kesme başvurusu).

Son

Bölüm 5: Kesmeler
Sonraki bölüm: Bölüm 5: emu8086.inc Kütüphanesi
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.