Bölüm 5.1: Kesmeler
Giriş
Öğrenme Çıktıları
Kesmenin ne olduğunu, yoklamadan (polling) farkını ve kesme türlerini açıklamak.
Kesme vektör tablosunu kullanarak INT n ile hangi adrese gidileceğini hesaplamak.
INT ve IRET sırasında FLAGS, CS ve IP'nin yığına nasıl yazılıp geri alındığını izlemek.
INTR kabulünü ve 8259A ile maskelemeyi izlemek; kendi kesme yordamını kurup eski vektörü geri yüklemek.
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ı).
Kitap okurken telefon çalar: sayfa işaretlenir (dönüş adresini saklama), telefon açılır (ISR), konuşma bitince işaretli sayfadan okumaya devam edilir (IRET).
Kesme Kavramı
Yoklama mı, Kesme mi?
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
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.
Dış aygıt bir pini sürer. INTR maskelenebilir (IF=0 iken dikkate alınmaz), NMI maskelenemez (ör. bellek eşlik hatası, güç kaybı).
İş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.
| Tip | Kaynak | Açıklama |
|---|---|---|
00h | iç | Bölme hatası (DIV/IDIV sıfıra bölme veya bölüm sığmıyor) |
01h | iç | Tek adım (TF = 1) — hata ayıklayıcılar kullanır |
02h | donanım | NMI pini (maskelenemez) |
03h | yazılım | Kesme noktası; tek baytlık INT 3 (CCh) |
04h | yazılım | INTO: 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 Kavramı
Üç Kaynağın Karşılaştırması
| Yazılım (INT n) | Donanım (INTR / NMI) | İç (istisna) | |
|---|---|---|---|
| Tetikleyen | programdaki komut | dış aygıt, pin | işlemcinin kendisi |
| Zamanlama | eş zamanlı: hep aynı yerde | eş zamansız: herhangi bir komuttan sonra | eş zamanlı: hatalı komutta |
| Tip numarası | komutun içinde | INTR: 8259A, INTA ile; NMI: hep 2 | sabit: 0, 1 |
| IF = 0 iken | yine çalışır | INTR bekler, NMI çalışır | yine çalışır |
| Tipik kullanım | BIOS/DOS hizmeti, INT 3, INTO | klavye, zamanlayıcı, disk | bölme hatası, tek adım |
CLI yalnızca INTR girişini kapatır; yazılım kesmeleri ve istisnalar IF'den etkilenmez.
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.
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
Program INT 10h komutunu çalıştırır. Tip numarası n = 10h (16).
Vektör adresi n × 4: 10h × 4 = 40h. (Onaltılıkta ×4, iki bit sola kaydırmaktır.)
Bu 4 bayt okunur: düşük sözcük IP = F065h, yüksek sözcük CS = F000h (little-endian: önce düşük bayt).
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 (00h–FFh) girilince tablodaki konumu ve kesmenin bilinen görevi gösterilir.
adres = n × 4. IP bu adreste, CS ise n × 4 + 2 adresindedir.INT ve IRET
INT n Nasıl Çalışır?
SP ← SP − 2, [SS:SP] ← FLAGS.IP ← [n×4], CS ← [n×4+2]: ISR başlar.INT ve IRET
INT ve IRET: Yığın Adım Adım
INT 10h 0700:0104'te. SP = FFFEh, FLAGS = F202h (IF = 1; 8086'da bit 1 ve 12–15. bitler hep 1'dir).
FLAGS itilir: SP = FFFCh, [FFFCh] = F202h.
IF = 0, TF = 0 → FLAGS = F002h. Eski değer yığında güvende.
CS itilir: SP = FFFAh, [FFFAh] = 0700h.
Dönüş adresi itilir: INT 10h 2 bayt olduğu için 0106h. SP = FFF8h.
CS:IP ← vektör (F000:F065). ISR çalışır ve karakteri yazar.
IRET: IP ← 0106h, CS ← 0700h (SP = FFFCh).
FLAGS ← F202h, 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 / RET | INT n / IRET | |
|---|---|---|
| Hedef adres | komutun içinde (etiket) | vektör tablosundan (n × 4) |
| Yığına yazılan | IP (yakın) veya CS + IP (uzak) | FLAGS + CS + IP (6 bayt) |
| Bayraklar | değişmez | IF = 0, TF = 0 yapılır |
| Dönüş | RET: IP (ve CS) geri alınır | IRET: IP, CS, FLAGS geri alınır |
| Komut boyu | 3 bayt (yakın CALL) | 2 bayt (INT 3: 1 bayt) |
| Kim çağırır? | yalnız program | program, işlemci (istisna) veya donanım |
RET ile bitirmek hatadır: yakın RET yalnız IP'yi alır; CS ve FLAGS yığında kalır (SP 4 bayt kayar) ve IF eski hâline dönmez. ISR'ler daima IRET ile biter.INT ve IRET · Kodu adım adım çalıştır
Kod İzleme: IRET Yerine RET
org 100h mov ax, 0 mov es, ax mov word ptr es:[61h*4], offset isr mov word ptr es:[61h*4+2], cs int 61h hlt ; SP = ? isr: ret ; HATA!
AX = 0: IVT kesimi.
ES = 0000h.
Tip 61h vektörünün IP'si: [184h] = offset isr = 0114h.
CS: [186h] = 0700h. Vektör 0700:0114.
int 61h: yığına FLAGS (F202h), CS (0700h), IP (0113h) — 6 bayt; SP = FFF8h, IF = 0.
ISR'deki yakın ret (IRET olmalıydı) yalnız IP'yi alır (0113h): CS ve FLAGS yığında kaldı. SP = FFFAh, beklenen FFFEh'den 4 bayt eksik; IF = 0 kaldı.
hlt'e gelindi ama kesmeler kapalı (IF = 0) ve yığın kaymış: bu noktadan sonra bir ret 0700h'yi dönüş adresi sanırdı. ISR daima IRET ile biter.
RETF bile yetmez: IP ve CS alınır ama FLAGS (2 bayt) yığında kalır ve IF eski hâline dönmez.
INT ve IRET
İstisnalar: Bölme Hatası ve INTO
AX = 1000, DIV BL (BL = 2): bölüm 500, AL'ye (en çok 255) sığmaz → INT 0. Bölen sıfır olmasa da hata oluşur.ADD AL, BL · INTO.Bölmeden önce bölenin sıfır olmadığını ve bölümün sığacağını denetlemek (ör. 16 bitlik bölme için DX:AX kullanmak) INT 0'ı baştan önler.
INT ve IRET · Kodu adım adım çalıştır
Kod İzleme: Kendi INT 0 Yordamımız
org 100h mov ax, 0 mov es, ax ; ES = 0: IVT mov word ptr es:[0*4], offset hata mov word ptr es:[0*4+2], cs mov ax, 100 mov bl, 0 div bl ; INT 0! mov dl, al ; dönüş buraya ret hata: mov ax, 0FFFFh ; hata işareti iret
AX = 0: IVT kesimi.
ES = 0000h: ES:[0] tip 0'ın vektörüdür (0 × 4 = 0).
Düşük sözcük (IP) = offset hata = 011Bh. Önceki vektör öykünücünün varsayılan yordamını gösteriyordu.
Yüksek sözcük (CS) = 0700h. Tip 0 artık bizim yordamımıza gider.
AX = 100 = 0064h: bölünen.
BL = 0: bölen sıfır.
div bl → INT 0. Yığına FLAGS, CS ve dönüş IP'si 0118h (DIV'den sonraki komut) itilir; SP = FFF8h, IF = 0.
Yordam çalışıyor: AX = FFFFh, programa "sonuç geçersiz" işareti.
iret: IP = 0118h, CS, FLAGS geri alınır; SP = FFFEh, IF = 1. DIV yeniden çalışmaz.
DL = AL = FFh: ana program hatayı işaretten anlar.
ret: program DOS'a döner.
Kısalık için eski vektör saklanmadı; gerçek bir programda çıkıştan önce geri yüklenir. Değerler emu8086 benzeri .COM yüklemesi (CS = 0700h) için.
INT ve IRET
Hata Ayıklayıcının Araçları: INT 1 ve INT 3
Tek adım (TF): TF = 1 iken her komuttan sonra işlemci INT 1 üretir. TF'yi doğrudan değiştiren komut yoktur; FLAGS yığın üzerinden düzenlenir:
PUSHF POP AX OR AH, 01h ; bit 8 = TF PUSH AX POPF ; TF = 1
INT 1 yordamı TF = 0 ile çalışır (INT, TF'yi temizler); kendi komutları adım adım kesilmez. IRET, yığındaki TF = 1'i geri yükler.
Kesme noktası (INT 3): tek baytlık özel kodlaması vardır: CCh. Hata ayıklayıcı:
- Durulacak komutun ilk baytını saklar, yerine CCh yazar.
- Program oraya gelince INT 3 çalışır; yazmaçlar gösterilir.
- Saklanan bayt geri yazılır, yığındaki dönüş IP'si 1 azaltılır.
- IRET ile komut baştan çalıştırılır.
Tek bayt olduğu için en kısa komutun yerine bile sığar; INT 03h yazılsa iki baytlık CD 03 olurdu.
emu8086'nın "single step" düğmesi aynı işi öykünücü içinde yapar; gerçek işlemcide DEBUG gibi araçlar INT 1 ve INT 3 vektörlerini kullanır.
Donanım Kesmeleri
INTR Kabul Süreci
09h) veri yoluna koyar.INT n ile aynıdır: FLAGS, CS, IP yığına; IF = TF = 0; CS:IP ← [n×4].IRET ile döner.Donanım Kesmeleri
Öncelik ve PC Kesme Haritası
8086 öncelik sırası
| Sıra | Kaynak |
|---|---|
| 1 (en yüksek) | Bölme hatası, INT n, INTO |
| 2 | NMI |
| 3 | INTR |
| 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
| IRQ | Aygıt | Tip |
|---|---|---|
| 0 | Zamanlayıcı (18,2 Hz) | 08h |
| 1 | Klavye | 09h |
| 3 / 4 | Seri portlar | 0Bh / 0Ch |
| 6 | Disket | 0Eh |
| 7 | Yazıcı | 0Fh |
INT 09h çalışır ve tuşu arabelleğe koyar; programın çağırdığı INT 16h bu arabellekten okur.Donanım Kesmeleri
8259A İçinde Üç Yazmaç
Bir ana 8259A'ya sekiz yardımcı bağlanarak 64 IRQ'ya çıkılır; PC/AT ikinci yongayı IRQ2'ye bağlar (IRQ8–15, tip 70h–77h). Yazmaç adı ISR, kesme hizmet yordamı ile karıştırılmamalıdır.
Donanım Kesmeleri · Kodu adım adım çalıştır
Kod İzleme: Tek Bir IRQ'yu Maskelemek
org 100h in al, 21h ; IMR'yi oku or al, 00000010b ; IRQ1 maskele out 21h, al mov cx, 3 ; kritik iş in al, 21h and al, 11111101b ; IRQ1 aç out 21h, al ret
in al, 21h: IMR okunur, AL = B8h = 1011 1000b. IRQ3, 4, 5, 7 zaten maskeli (örnek değer).
or al, 02h: yalnızca bit 1 kurulur → AL = BAh. Diğer bitler korunur; IMR'ye henüz yazılmadı.
out 21h, al: IMR = BAh. IRQ1 (klavye) artık INTR'ye ulaşamaz; IF ve diğer IRQ'lar etkilenmedi.
Kesilmemesi gereken iş (burada yalnızca bir yer tutucu). Klavyeye basılırsa istek IRR'de bekler, kaybolmaz.
IMR yeniden okunur: AL = BAh.
and al, 0FDh (1111 1101b): yalnızca bit 1 silinir → AL = B8h.
out 21h, al: IMR = B8h, IRQ1 açıldı; bekleyen klavye isteği şimdi hizmet görür.
ret: maske ilk hâline döndü. Başkasının bitlerine dokunulmadı.
Oku–değiştir–yaz kalıbı: OR ile maskelenir, AND ile açılır, böylece diğer bitler korunur. CLI'den farkı: yalnızca seçilen aygıt bekletilir.
Donanım Kesmeleri
INTR Ne Zaman Kabul Edilmez?
MOV SS, AX ya da POP SS'den sonraki komut da bitene kadar kesme gelmez: MOV SP, … güvenle tamamlanır. STI'den sonra da bir komut daha yürütülür; sti / hlt ya da sti / iret arasına kesme giremez.REP MOVSB turlar arasında kesilebilir; dönüş adresi öneki gösterir, IRET'ten sonra kalan CX kadar sürer. 8086 yalnızca bir öneki hatırlar: REP ES: MOVSB kesilirse ES: öneki kaybolur, bu yüzden böyle bir satır CLI/STI arasına alınır.HLT işlemciyi durdurur; bir INTR ya da NMI onu uyandırır ve IRET HLT'den sonraki komuta döner. WAIT sırasında gelen kesme de kabul edilir.Kısacası 8086 kesmeyi yalnızca komut sınırlarında kabul eder; birkaç durumda bu sınır bilerek bir komut ileri kaydırılır.
Donanım Kesmeleri
Kesme Gecikmesi (Latency)
| İşlem (8086) | Saat turu |
|---|---|
INT n | 51 |
INT 3 | 52 |
INTO (OF = 1 / OF = 0) | 53 / 4 |
| INTR kabulü (iki INTA dahil) | 61 |
IRET | 24 |
16 bitlik IDIV (yazmaç) | 165–184 |
Kesme gecikmesi: isteğin gelmesiyle ISR'nin ilk komutunun başlaması arasındaki süre.
- En kötü durumda önce yürüyen komut bitmelidir: uzun bir IDIV ≈ 184 tur.
- Ardından kabul: 61 tur. Toplam ≈ 245 tur.
- 5 MHz'de bir tur 200 ns → ≈ 49 µs.
- CLI ile kapalı geçen süre bu gecikmeye doğrudan eklenir; CLI–STI arası kısa tutulur.
Saniyede 18,2 kez gelen zamanlayıcı kesmesi için bu süre önemsizdir; yüksek hızlı seri port gibi aygıtlarda ISR'nin kısa olması veri kaybını önler.
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 = 240hadresindedir. - IVT 0000 kesimindedir; ES = 0 yapılır.
- Vektör yazılırken
CLI/STIile korunur: yarım yazılmış vektörle kesme gelmemelidir. INT 90hekrana * yazar ve program devam eder.- DOS altında
INT 21h, AH =25h(vektör ata) /35h(vektör oku) daha güvenli yoldur.
Donanım Kesmeleri · Kodu adım adım çalıştır
Kod İzleme: INT 60h ile Kendi ISR'miz
org 100h mov ax, 0 mov es, ax ; ES = 0: IVT cli mov word ptr es:[60h*4], offset isr mov word ptr es:[60h*4+2], cs sti mov al, '#' int 60h ; kendi kesmemiz ret isr: mov ah, 0Eh int 10h iret
AX = 0. Vektör tablosu (IVT) 0000:0000'dadır; tip 60h'nin vektörü 60h × 4 = 180h adresinde.
ES = 0000h: ES:[180h] artık IVT'deki 0000:0180h baytını gösterir.
cli: IF = 0. Vektör yarı yazılmışken donanım kesmesi gelmesin. FLAGS = F002h.
Düşük sözcük = IP = offset isr = 0118h: bellekte 18 01 (little-endian).
Yüksek sözcük = CS = 0700h: 00 07. Vektör artık 0700:0118.
sti: IF = 1, kesmeler yeniden açık. FLAGS = F202h (8086'da bit 1 ve 12–15. bitler hep 1).
AL = '#' (23h): ISR'ye yazmaç ile iletilen parametre.
int 60h: FLAGS (F202h), CS (0700h), dönüş IP'si (0117h) yığına; IF = 0; CS:IP ← [180h] = 0700:0118.
ISR çalışıyor: AH = 0Eh (teletype).
int 10h: ekrana # yazılır. ISR içinden başka bir kesme çağrılabilir.
iret: IP = 0117h, CS = 0700h, FLAGS = F202h geri alınır; IF yeniden 1, SP = FFFEh.
ret: ana program kaldığı yerden sürdü ve DOS'a döner.
Tip 60h kullanıcı programlarına ayrılmış tiplerdendir. Değerler emu8086 benzeri .COM yüklemesi (CS = 0700h) için.
Donanım Kesmeleri · Kodu adım adım çalıştır
Kod İzleme: Vektörü Sakla, Değiştir, Geri Yükle
org 100h xor ax, ax mov es, ax ; ES = 0: IVT mov ax, offset isr3 xchg ax, es:[3*4] ; yeni IP ↔ eski mov eski, ax mov ax, cs xchg ax, es:[3*4+2] ; yeni CS ↔ eski mov eski+2, ax mov ax, 1234h int 3 ; bizim ISR mov bx, eski mov es:[3*4], bx ; geri yükle mov bx, eski+2 mov es:[3*4+2], bx ret isr3: push ax mov ax, 0E21h ; AH=0Eh, AL='!' int 10h pop ax iret eski dw ?, ?
ES = 0000h: IVT. Tip 3'ün vektörü 3 × 4 = 000Ch adresinde.
AX = offset isr3 = 0130h.
xchg ax, es:[12]: tek komutta yeni IP yazılır, eski IP (1003h) AX'e gelir.
Eski IP eski değişkenine saklandı.
AX = CS = 0700h.
xchg: yeni CS yazıldı, eski CS = F000h AX'te. Vektör artık 0700:0130.
Eski CS de saklandı: eski vektör F000:1003. Tip 3'ü yalnızca program çağırdığı için CLI gerekmedi; donanım tiplerinde bu satırlar CLI/STI arasına alınır.
AX = 1234h: ana programın değeri. ISR bunu bozmamalı.
int 3 (tek bayt, CCh): FLAGS, CS, dönüş IP'si 011Dh yığına; CS:IP ← 0700:0130.
push ax: ISR, kullanacağı AX'i önce saklar (1234h yığında).
AX = 0E21h: AH = 0Eh (teletype), AL = 21h ('!').
int 10h: ekrana ! yazılır.
pop ax: AX = 1234h, ana programın değeri geri geldi.
iret: IP, CS, FLAGS geri alınır; SP = FFFEh.
Eski IP vektöre geri yazıldı.
Eski CS de geri yazıldı: tip 3 yine eski yordamı gösteriyor.
ret: AX = 1234h korundu, vektör tablosu programdan önceki hâlinde.
Eski vektör F000:1003h öykünücünün varsayılan yordamıdır. DOS altında: INT 21h, AH = 35h / 25h.
Donanım Kesmeleri
ISR Yazım Kuralları ve Sık Yapılan Hatalar
| Kural | Uyulmazsa |
|---|---|
| Kullanılan her yazmaç PUSH/POP ile korunur (FLAGS'i işlemci korur). | Ana program, değeri kendiliğinden değişmiş bir yazmaçla devam eder; hata rastgele anlarda görülür. |
Donanım ISR'si 8259A'ya EOI gönderir: MOV AL, 20h · OUT 20h, AL. | 8259A ISR bitini silmez; aynı ve daha düşük öncelikli IRQ'lar bir daha gelmez. |
| ISR kısa tutulur; uzun iş bir bayrak değişkeniyle ana programa bırakılır. | Kesme gecikmesi büyür, hızlı aygıtların verisi kaybolur. |
| Donanım ISR'sinden INT 21h çağrılmaz. | DOS yeniden girişli (reentrant) değildir; kesilen DOS çağrısının verileri bozulur. |
| Vektör CLI ile ya da AH = 25h ile yazılır, çıkışta eskisi geri yüklenir. | Program bittikten sonra kesme, artık başka bir şeyin bulunduğu belleğe atlar. |
ISR IRET ile biter. | Yığın 4 bayt kayar, IF kapalı kalır. |
Uzun bir ISR içinde STI ile daha öncelikli kesmelere izin verilebilir; bu durumda ISR'nin kendisi de yeniden girişli yazılmalıdır.
Laboratuvar · vektör tablosu, INT ve IRET adım adım
Laboratuvar: Kesme Mekanizması
Özet
Özet
İşlemci işini bırakır, ISR'yi çalıştırır, IRET ile kaldığı yere döner.
0000:0000–03FF, 256 × 4 bayt. Tip n → adres n × 4 (IP), n × 4 + 2 (CS).
FLAGS, CS, IP yığına (SP −6), IF = TF = 0, CS:IP ← vektör.
INTR yalnız IF = 1 iken, komut sınırında kabul edilir; tip numarası ikinci INTA darbesinde 8259A'dan gelir. NMI hep INT 2.
IMR tek tek IRQ'ları maskeler (port 21h); ISR sonunda EOI: MOV AL, 20h · OUT 20h, AL.
Vektör CLI/STI arasında yazılır, kullanılan yazmaçlar korunur, IRET ile biter; çıkışta eski vektör geri yüklenir.
Özet
Alıştırmalar
INT 13hvektörü hangi fiziksel adreslerde bulunur?INT 21hçalışmadan önce SP = FFFEh ise ISR içindeyken SP kaçtır? Yığında ne vardır?- IMR = B8h iken yalnız IRQ0'ı (zamanlayıcı) da maskeleyen komutları yazın. IMR kaç olur?
- Tip 61h'nin vektörü 0700:0120h yapılacak. Hangi fiziksel adreslere hangi baytlar yazılır?
- 5 MHz'lik 8086'da INTR geldiğinde
MUL BX(en çok 133 tur) yeni başlamışsa kesme gecikmesi en çok ne kadardır? - ISR'nin
IRETyerineRETile bitmesi ne gibi sorunlara yol açar?
İpuçları / cevaplar
- 13h × 4 = 4Ch →
0004Ch–0004Fh(IP: 4Ch–4Dh, CS: 4Eh–4Fh). - SP = FFF8h. [FFF8h] = dönüş IP'si, [FFFAh] = CS, [FFFCh] = FLAGS.
IN AL, 21h·OR AL, 01h·OUT 21h, AL→ IMR = B9h; IRQ3, 4, 5, 7 maskeli kalır.- 61h × 4 = 184h:
00184h–00187h← 20 01 00 07 (önce IP, sonra CS; little-endian). - 133 + 61 (INTR kabulü) = 194 tur × 200 ns ≈ 39 µs.
- CS ve FLAGS yığında kalır (yakın RET ile SP 4 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.
- 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).