Bölüm 11: Kesme Fonksiyonları
Giriş
Öğrenme Çıktıları
BIOS ve DOS servislerini AH'deki fonksiyon numarası ve yazmaç parametreleriyle çağırmak.
INT 10h ve INT 21h ile karakter, renkli karakter ve dizgi yazdırmak; imleci konumlamak.
INT 16h ve INT 21h ile tuş okumak, tuş beklemeden yoklamak, satır okumak.
Tarih/saat bilgisini okuyup yazdırmak; programı RET, INT 20h ya da INT 21h/4Ch ile doğru sonlandırmak.
Giriş
BIOS ve DOS Servisleri
- BIOS (Basic Input/Output System): anakarttaki ROM'da bulunan, donanımı doğrudan süren yordamlar. İşletim sistemi olmadan da çalışır.
- DOS: BIOS'un üstünde; dosya, dizgi, saat ve program yönetimi sunar.
- Her iki katmana da yazılım kesmesi (
INT n) ile ulaşılır; çağıranın servis adresini bilmesi gerekmez.
Giriş
Servis Çağırma Kalıbı
- AH ← fonksiyon (servis) numarası
- Diğer parametreler: AL, BX, CX, DX, DS:DX, ES:BP …
INT n(10h, 16h, 21h …)- Sonuç yazmaçlarda: AL, AX, CX, DX, ZF/CF …
mov ah, 02h ; servis: karakter yaz mov dl, 'A' ; parametre int 21h ; DOS'u çağır
| Kesme | Sağlayan | Görev |
|---|---|---|
INT 10h | BIOS | video: mod, imleç, karakter, dizgi |
INT 16h | BIOS | klavye |
INT 1Ah | BIOS | saat sayacı, gerçek zaman saati |
INT 13h | BIOS | disk |
INT 20h | DOS | programı sonlandır (COM) |
INT 21h | DOS | yüzlerce servis: G/Ç, dosya, saat, çıkış |
Giriş
Bir Servis Çağrısı Adım Adım: INT 21h
Çağrı öncesi: parametreler yazmaçlarda (AH = 09h, DX = msg). CS:IP = 0700:0105h, komut int 21h.
İşlemci vektör adresini hesaplar: 21h × 4 = 84h → 0000:0084h.
FLAGS, CS ve dönüş IP'si (0107h) yığına atılır; IF = TF = 0.
CS:IP ← [0000:0086h]:[0000:0084h]. DOS'un INT 21h yordamı AH'ye bakarak 09h servisine dallanır.
Servis biter, iret ile IP, CS, FLAGS geri alınır. Sonuçlar yazmaçlarda (09h için AL = 24h).
Vektör tablosundaki adresler sistemden sisteme değişir; bu yüzden programlar servisleri adresle değil kesme numarasıyla çağırır. Ayrıntılar Bölüm 5: Kesmeler'de.
Giriş
Ekran ve Klavyede ASCII
| Kod | Ad | Etki (0Eh / 02h) |
|---|---|---|
07h | BEL | zil sesi |
08h | BS | imleç bir geri |
09h | TAB | sekme (DOS) |
0Ah | LF | bir alt satır |
0Dh | CR | satır başı (Enter tuşu) |
1Bh | ESC | Esc tuşu |
| Karakter | ASCII | İlişki |
|---|---|---|
| boşluk | 20h | |
| '0' … '9' | 30h–39h | rakam = kod − 30h |
| 'A' … 'Z' | 41h–5Ah | bit 5 = 0 |
| 'a' … 'z' | 61h–7Ah | bit 5 = 1 (+20h) |
| '$' | 24h | 09h servisinde dizgi sonu |
0Dh, 0Ah (CR LF). Yalnız LF imleci aşağı indirir ama satır başına getirmez. Türkçe harfler (ç, ğ, ı, ö, ş, ü) 7 bitlik ASCII'de yoktur; kod sayfasına (CP857) göre gösterilir.INT 10h Video
INT 10h: BIOS Video Servisleri
| AH | Servis | Giriş | Çıkış / not |
|---|---|---|---|
00h | video modu seç | AL = mod (03h: 80×25 renkli metin) | ekran temizlenir |
01h | imleç şekli | CH = başlangıç, CL = bitiş satırı | CH = 20h → imleç gizli |
02h | imleç konumla | BH = sayfa, DH = satır, DL = sütun | |
03h | imleç konumu oku | BH = sayfa | DH, DL = konum; CH, CL = şekil |
06h | pencereyi yukarı kaydır | AL = satır (0 = temizle), BH = öznitelik, CH,CL – DH,DL = köşeler | ekran/pencere silme |
09h | karakter + öznitelik yaz | AL = karakter, BH = sayfa, BL = öznitelik, CX = sayı | imleç ilerlemez |
0Ah | yalnız karakter yaz | AL, BH, CX | mevcut öznitelik korunur |
0Eh | teletype çıkışı | AL = karakter, BH = sayfa | imleç ilerler; CR, LF, BS, BEL yorumlanır |
13h | dizgi yaz | AL = kip, BH, BL, CX = uzunluk, DH,DL, ES:BP = dizgi | AT ve sonrası BIOS |
INT 10h Video
AH = 00h: Video Modu ve Metin Ekranı
| AL | Mod | Bellek |
|---|---|---|
01h | 40×25 metin, 16 renk | B800h |
03h | 80×25 metin, 16 renk | B800h |
07h | 80×25 tek renk | B000h |
04h | 320×200, 4 renk | B800h |
13h | 320×200, 256 renk | A000h |
mov ah, 00h mov al, 03h ; ya da mov ax, 0003h int 10h ; temiz 80×25 ekran
emu8086 ekranı varsayılan olarak 80×25 metin modundadır; grafik modları sınırlı desteklenir.
INT 10h Video
İmleç Konumu: AH = 02h / 03h
- Satır DH (0–24), sütun DL (0–79); sol üst köşe (0, 0).
- BH = görüntü sayfası. 80×25 modda 8 sayfa (0–7) vardır; normalde 0 kullanılır.
- İkisi tek komutla:
mov dx, 0C28h→ DH = 12, DL = 40 (ekranın ortası). - AH = 03h konumu okur: dönüşte DH, DL; ayrıca CH, CL imleç şekli.
- INT 21h ile yazılan karakterler de bu imleç konumundan başlar.
; imleci ortaya al mov ah, 02h mov bh, 0 mov dx, 0C28h ; 12. satır, 40. sütun int 10h ; imleci bir sağa kaydır mov ah, 03h mov bh, 0 int 10h ; DH, DL = konum inc dl mov ah, 02h int 10h
INT 10h Video
Öznitelik (Attribute) Baytı
- Öznitelik = arka plan × 16 + ön plan.
07hvarsayılan (siyah üstüne açık gri),1Fhmavi üstüne beyaz,4Ehkırmızı üstüne sarı. - Bit 7 = 1 ise karakter yanıp söner (ya da BIOS ayarına göre arka plan parlak olur):
8Fh.
INT 10h Video
Öznitelik Gezgini
Seçilen renklerden öznitelik baytı ve INT 10h/09h çağrısı üretilir.
INT 10h Video
Karakter Yazma: AH = 09h mı, 0Eh mi?
| Özellik | AH = 09h | AH = 0Eh (teletype) |
|---|---|---|
| Girişler | AL = karakter, BH = sayfa, BL = öznitelik, CX = tekrar | AL = karakter, BH = sayfa |
| Renk | var (BL) | metin modunda yok (hücrenin rengi korunur) |
| İmleç | ilerlemez | ilerler, satır sonunda alt satıra geçer |
| CR, LF, BS, BEL | sembol olarak basılır (♪, ◘ …) | komut olarak yorumlanır |
| Ekran kaydırma | yok | son satırda ekran yukarı kayar |
| Tipik kullanım | renkli kutular, çerçeveler, aynı karakteri CX kez | düz metin akışı |
INT 10h Video · Kodu adım adım çalıştır
Kod İzleme: Mod, İmleç, 09h ve 0Eh
AH = 00h (mod seç), AL = 03h (80×25, 16 renk metin). İki yazmaç tek komutla yüklenir.
int 10h: mod ayarlanır, ekran temizlenir, imleç (0,0)'a gider.
AH = 02h: imleç konumunu ayarla.
BH = görüntü sayfası (metin modunda 0–7; normalde 0).
DX = 0104h → DH = 1 (satır), DL = 4 (sütun). Sol üst köşe (0,0).
İmleç satır 1, sütun 4'e taşınır. Ekranda henüz bir şey yok.
AH = 09h: imleç konumuna AL'yi BL özniteliğiyle CX kez yaz.
Yazılacak karakter AL = '*' (2Ah).
BL = 4Eh: arka plan 4 (kırmızı), ön plan E (sarı).
Tekrar sayısı CX = 3.
Ekrana *** yazılır, ama 09h imleci ilerletmez: imleç hâlâ (1,4).
AH = 0Eh: teletype (daktilo) çıkışı.
AL = 'A'.
'A', imlecin bulunduğu (1,4)'e yazılır ve ilk yıldızın üzerine gelir; imleç (1,5)'e ilerler.
AL = 'B'. AH hâlâ 0Eh.
'B' (1,5)'e yazılır: ekranda AB*. 0Eh metin modunda öznitelik almaz; hücrelerdeki 4Eh rengi korunur.
Ders: 09h ile yazdıktan sonra imleci AH = 02h ile kendiniz ilerletmelisiniz.
org 100h mov ax, 0003h ; AH=00h, AL=03h int 10h ; ekran silinir mov ah, 02h ; imleç konumla mov bh, 0 ; sayfa 0 mov dx, 0104h ; DH=1, DL=4 int 10h mov ah, 09h ; karakter + öznitelik mov al, '*' mov bl, 4Eh ; kırmızı üstüne sarı mov cx, 3 ; 3 kez int 10h ; imleç ilerlemez! mov ah, 0Eh ; teletype mov al, 'A' int 10h ; imleç ilerler mov al, 'B' int 10h ret
INT 10h Video · Kodu adım adım çalıştır
Kod İzleme: AH = 13h ile Renkli Dizgi
AH = 13h (dizgi yaz). AL = 01h: tüm karakterler BL özniteliğinde, yazdıktan sonra imleç ilerler.
BH = 0 (sayfa), BL = 1Eh: mavi (1) zemin, sarı (E) yazı.
CX = karakter sayısı. '$' gibi bir bitiş işareti yoktur.
DH = 2, DL = 5: yazmanın başlayacağı konum.
Dizginin adresi ES:BP'de olmalıdır (DS:DX değil!). COM programında ES = DS: BP = 0113h.
Satır 2, sütun 5'ten itibaren Merhaba yazılır; imleç (2,12)'ye gider.
AL = 00h olsaydı dizgi yine yazılır ama imleç eski yerinde kalırdı. AL = 02h/03h'te dizgi karakter, öznitelik çiftlerinden oluşur.
org 100h mov ax, 1301h ; AH=13h, AL=01h mov bx, 001Eh ; BH=0, BL=1Eh mov cx, 7 ; dizgi uzunluğu mov dx, 0205h ; satır 2, sütun 5 lea bp, mesaj ; ES:BP → dizgi int 10h ret mesaj db 'Merhaba'
INT 10h Video
AH = 06h: Pencere Kaydırma ve Ekran Temizleme
| Yazmaç | Anlamı |
|---|---|
AL | kaydırılacak satır sayısı; 0 = pencereyi temizle |
BH | boşalan satırların özniteliği |
CH, CL | sol üst köşe (satır, sütun) |
DH, DL | sağ alt köşe (satır, sütun) |
- AH = 07h aynı işi aşağı doğru yapar.
- İmleç yerinde kalır; temizledikten sonra 02h ile (0,0)'a alın.
; tüm ekranı mavi zemine temizle mov ax, 0600h ; AH=06h, AL=0 mov bh, 1Fh ; mavi/beyaz mov cx, 0000h ; (0,0) mov dx, 184Fh ; (24,79) int 10h ; ortada 10×40'lık kırmızı kutu mov ax, 0600h mov bh, 4Fh mov cx, 0714h ; (7,20) mov dx, 103Bh ; (16,59) int 10h
INT 10h Video
BIOS'suz Çıktı: B800h Ekran Belleği
- Mod 03h'te ekran, B800:0000h'dan başlayan 4000 baytlık bellekte tutulur (80 × 25 × 2).
- Her hücre 2 bayt: karakter (çift adres) + öznitelik (tek adres).
- Belleğe yazılan değer ekran kartı tarafından anında gösterilir: kesme çağrısından çok daha hızlı.
- Sözcük olarak yazarken little-endian:
4E41h→ 41h ('A') düşük adrese, 4Eh özniteliğe.
; (1,4) hücresine sarı/kırmızı 'A' mov ax, 0B800h mov es, ax mov di, (1*80+4)*2 ; 00A8h mov ax, 4E41h mov es:[di], ax ; tüm ekranı '.' ile doldur xor di, di mov ax, 072Eh mov cx, 2000 cld rep stosw
INT 16h Klavye
INT 16h: BIOS Klavye Servisleri
| AH | Servis | Çıkış |
|---|---|---|
00h | tuş bekle ve oku | AH = tarama kodu, AL = ASCII; tuş tampondan silinir |
01h | tuş var mı? (beklemez) | ZF = 1: yok · ZF = 0: AX = tuş, tampondan silinmez |
02h | Shift durumları | AL bitleri: 0 sağ Shift, 1 sol Shift, 2 Ctrl, 3 Alt, 4 Scroll, 5 Num, 6 Caps, 7 Insert |
| Tuş | AH (tarama) | AL (ASCII) |
|---|---|---|
| a / A | 1Eh | 61h / 41h |
| 1 | 02h | 31h |
| Enter | 1Ch | 0Dh |
| Esc | 01h | 1Bh |
| Boşluk | 39h | 20h |
| Tuş | AH (tarama) | AL |
|---|---|---|
| ↑ / ↓ | 48h / 50h | 00h |
| ← / → | 4Bh / 4Dh | 00h |
| F1 … F10 | 3Bh … 44h | 00h |
| Backspace | 0Eh | 08h |
| Ctrl+C | 2Eh | 03h |
Tarama kodu tuşun klavyedeki fiziksel konumudur: 'a' ve 'A' aynı tarama kodunu verir. ASCII karşılığı olmayan (genişletilmiş) tuşlarda AL = 00h olur; tuşu AH'den tanırız.
INT 16h Klavye
Klavye Gezgini: INT 16h / AH = 00h Ne Döndürür?
Harfler, rakamlar, ok tuşları, F1–F10, Enter, Esc ve Ctrl+harf deneyin. Değerler IBM PC/AT klavye düzenine (US) göredir.
INT 16h Klavye · Kodu adım adım çalıştır
Kod İzleme: Enter'a Kadar Oku, Büyük Harfle Yaz
AH = 00h: klavye tamponundan bir tuş bekle ve al.
Kullanıcı O (Shift+o) bastı: AL = 4Fh (ASCII), AH = 18h (tarama kodu).
4Fh ≠ 0Dh.
Enter değil, devam.
'O' (4Fh) < 'a' (61h) → CF = 1.
Küçük harf değil → doğrudan yaz.
AH = 0Eh (teletype). AL'de yazılacak karakter var.
Ekrana O.
Sonraki tuşa dön.
AH = 00h: klavye tamponundan bir tuş bekle ve al.
Kullanıcı k bastı: AL = 6Bh, AH = 25h.
6Bh ≠ 0Dh.
Devam.
'k' ≥ 'a' → CF = 0.
Küçük harf olabilir, devam.
6Bh − 7Ah: ödünç → CF = 1, ZF = 0. Yani 'k' < 'z'.
ja CF = 0 ve ZF = 0 ister; CF = 1 → dallanma yok: küçük harf.
Bit 5 temizlenir: 6Bh − 20h = 4Bh = 'K'.
AH = 0Eh (teletype). AL'de yazılacak karakter var.
Ekrana K.
Sonraki tuşa dön.
AH = 00h: klavye tamponundan bir tuş bekle ve al.
Kullanıcı Enter bastı: AL = 0Dh, AH = 1Ch.
AL = 0Dh → ZF = 1.
Enter → bitti.
Enter'da program biter. INT 16h/00h tuşu ekrana yansıtmaz; yansıtmayı biz yaptık.
org 100h oku: mov ah, 0 ; tuş bekle int 16h ; AH=tarama, AL=ASCII cmp al, 0Dh ; Enter? je bitti cmp al, 'a' jb yaz cmp al, 'z' ja yaz sub al, 20h ; küçük → büyük yaz: mov ah, 0Eh int 10h ; ekrana yaz jmp oku bitti: ret
INT 16h Klavye · Kodu adım adım çalıştır
Kod İzleme: AH = 01h ile Beklemeden Yoklama
DX = 0: bekleme sırasında yapılan işi sayacağız.
Arka planda iş yapılıyor: DX = 0001h.
AH = 01h: tuş durumunu sorgula (beklemez).
Tamponda tuş yok → ZF = 1.
ZF = 1 → bekle'ye dön; program donmaz.
Arka planda iş yapılıyor: DX = 0002h.
AH = 01h: tuş durumunu sorgula (beklemez).
Hâlâ tuş yok → ZF = 1.
Yoklamaya devam.
Arka planda iş yapılıyor: DX = 0003h.
AH = 01h: tuş durumunu sorgula (beklemez).
Tuş geldi: ZF = 0, AL = 'x' (78h), AH = 2Dh. Tuş tamponda kalır.
ZF = 0 → döngüden çık.
Tuşu tampondan almak için AH = 00h.
Aynı tuş okunur ve tampondan silinir: AL = 'x', AH = 2Dh.
Oyunlarda ve animasyonlarda bu kalıp kullanılır: çalışmayı sürdür, tuşa basılınca tepki ver.
org 100h xor dx, dx ; iş sayacı bekle: inc dx ; arka plan işi mov ah, 01h ; tuş var mı? int 16h ; ZF=1 → yok jz bekle mov ah, 00h ; tuşu tampondan al int 16h ret
INT 21h DOS
INT 21h: Sık Kullanılan DOS Servisleri
| AH | Servis | Giriş | Çıkış |
|---|---|---|---|
01h | karakter oku, yansıt | – | AL = karakter |
02h | karakter yaz | DL = karakter | AL = DL |
07h / 08h | karakter oku, yansıtmadan | – | AL (08h Ctrl+C'yi denetler) |
09h | dizgi yaz | DS:DX → '$' ile biten dizgi | AL = 24h |
0Ah | tamponlu satır oku | DS:DX → tampon | tampon[1] = sayı, tampon+2 = metin |
2Ah | tarihi al | – | CX = yıl, DH = ay, DL = gün, AL = gün adı (0 = Pazar) |
2Ch | saati al | – | CH = saat, CL = dakika, DH = saniye, DL = salise |
2Bh / 2Dh | tarihi / saati ayarla | 2Ah / 2Ch ile aynı yazmaçlar | AL = 00h başarılı |
4Ch | programı sonlandır | AL = çıkış kodu | (dönmez) |
DOS servisleri giriş/çıkış yönlendirmesine uyar: program > cikti.txt ile 02h/09h çıktısı dosyaya gider; BIOS INT 10h çıktısı ise her zaman ekrana gider.
INT 21h DOS · Kodu adım adım çalıştır
Kod İzleme: Karakter Oku, Yeni Satır, Karakter Yaz
AH = 01h: klavyeden bir karakter bekle ve ekrana yansıt.
Kullanıcı k bastı: AL = 6Bh, ekranda 'k' göründü.
AL sonraki INT 21h çağrılarında değişeceği için BL'de saklanır.
AH = 02h: DL'deki karakteri yaz.
DL = 0Dh (Carriage Return).
İmleç satır başına döner (görünür bir değişiklik yok).
DL = 0Ah (Line Feed).
İmleç bir alt satıra iner. Yeni satır = CR + LF.
BL = 6Bh + 1 = 6Ch = 'l'.
DL = 'l'.
Ekrana l yazılır. 02h sonrası AL de yazılan karakteri içerir.
Program biter.
org 100h mov ah, 01h ; oku + yansıt int 21h ; AL = karakter mov bl, al ; sakla mov ah, 02h ; karakter yaz mov dl, 0Dh ; CR: satır başı int 21h mov dl, 0Ah ; LF: alt satır int 21h inc bl ; sonraki harf mov dl, bl int 21h ret
INT 21h DOS · Kodu adım adım çalıştır
Kod İzleme: AH = 09h ile Dizgi Yazdırma
DX = 010Dh: dizginin bağıl konumu. Kesim DS'dir.
AH = 09h: '$' ile biten dizgiyi yaz.
'$' görülene kadar yazılır; 0Dh 0Ah satırı bitirir. Dönüşte AL = 24h ('$').
İkinci dizgi: DX = 011Eh.
AH değişmediği için yeniden yüklemek gerekmez (yine de yüklemek iyi alışkanlıktır).
Çıktı iki satır. '$' karakterinin kendisi bu servisle yazdırılamaz.
org 100h mov dx, offset msg1 ; DS:DX → dizgi mov ah, 09h int 21h mov dx, offset msg2 int 21h ; AH hâlâ 09h ret msg1 db 'Merhaba, 8086!', 0Dh, 0Ah, '$' msg2 db 'Gule gule$'
INT 21h DOS
AH = 0Ah: Tamponlu Satır Girişi
Program tamponu hazırlar: tampon db 10, ?, 10 dup(?). Bayt 0 = en fazla 10 karakter (Enter dahil).
Kullanıcı A yazar: karakter 2. konuma gelir ve ekrana yansıtılır. Backspace ile düzeltme yapılabilir.
l ve i de eklenir.
Enter: 0Dh sona yazılır; DOS bayt 1'e okunan sayıyı (3, CR hariç) yazar ve döner.
Metin tampon+2'den başlar, uzunluğu [tampon+1]'dedir. '$' ile bitmez; 09h ile yazdırmak için 0Dh yerine '$' konur.
- DOS satır düzenlemeyi kendisi yapar (Backspace, Esc); Enter'a basılana kadar program beklemez, çalışmaz.
- Tampon dolunca fazla tuşlar kabul edilmez ve zil çalar. İlk bayt 0 olamaz.
INT 21h DOS · Kodu adım adım çalıştır
Kod İzleme: İsim Oku, Selam Ver
DS:DX tamponu gösterir: DX = 0120h.
AH = 0Ah: Enter'a kadar satır oku.
Kullanıcı Ali⏎ yazdı. DOS: tampon[1] = 3, tampon[2..4] = 'Ali', tampon[5] = 0Dh. Enter yalnızca CR basar: imleç satır başında.
BL = okunan karakter sayısı = 3 (CR sayılmaz).
BX = 0003h; adres hesaplamasında kullanılacak.
tampon[3 + 2] = tampon[5]: 0Dh yerine '$' yazılır → dizgi AH = 09h ile yazılabilir.
DX = selam.
AH = 09h.
CR LF + 'Merhaba ' yazılır (yeni satırda).
DX = tampon + 2: girilen metnin başlangıcı (0122h).
Çıktı: Merhaba Ali.
tampon[0] = 10: en çok 9 karakter + CR. Fazlası kabul edilmez (DOS zil sesi çalar).
org 100h mov dx, offset tampon mov ah, 0Ah ; tamponlu giriş int 21h mov bl, [tampon+1] ; okunan sayı mov bh, 0 mov byte ptr tampon[bx+2], '$' mov dx, offset selam mov ah, 09h int 21h lea dx, [tampon+2] int 21h ret tampon db 10, ?, 10 dup(?) selam db 0Dh, 0Ah, 'Merhaba $'
INT 21h DOS
AH = 2Ah / 2Ch: Tarih ve Saat
| AH = 2Ah (tarih) | |
|---|---|
CX | yıl (ör. 07EAh = 2026) |
DH | ay (1–12) |
DL | gün (1–31) |
AL | haftanın günü (0 = Pazar … 6 = Cumartesi) |
| AH = 2Ch (saat) | |
|---|---|
CH | saat (0–23) |
CL | dakika (0–59) |
DH | saniye (0–59) |
DL | salise (0–99) |
; gün adını yazdır mov ah, 2Ah int 21h ; AL = 0…6 mov ah, 0 mov bl, 4 mul bl ; AX = AL × 4 mov dx, offset gunler add dx, ax mov ah, 09h int 21h ret gunler db 'Paz$Pzt$Sal$Car$' db 'Per$Cum$Cmt$'
INT 21h DOS · Kodu adım adım çalıştır
Kod İzleme: Saati SS:DD Biçiminde Yazdırma
AH = 2Ch: sistem saatini oku.
Dönüş: CH = 14 (0Eh) saat, CL = 35 (23h) dakika, DH = 7 saniye, DL = 42 salise.
AL = saat = 0Eh.
Alt program çağrılır: dönüş adresi yığında.
aam: 14 → AH = 1, AL = 4.
Her iki hane ASCII'ye: AX = 3134h.
BX'te sakla; INT 21h/02h AL'yi değiştirir.
DL = onlar hanesi.
AH = 02h.
Ekrana '1'.
DL = birler hanesi.
Ekrana '4' → 14.
Alt programdan dönülür.
DL = ':'.
AH = 02h.
Ekrana ':'.
AL = dakika = 23h (35). CL hiçbir çağrıda bozulmadı.
Dakika için aynı alt program.
35 → AH = 3, AL = 5.
Her iki hane ASCII'ye: AX = 3335h.
BX'te sakla; INT 21h/02h AL'yi değiştirir.
DL = onlar hanesi.
AH = 02h.
Ekrana '3'.
DL = birler hanesi.
Ekrana '5' → 14:35.
Alt programdan dönülür.
Ekranda 14:35. Tarih için AH = 2Ah: CX = yıl, DH = ay, DL = gün, AL = haftanın günü.
org 100h mov ah, 2Ch ; sistem saatini al int 21h ; CH=saat CL=dakika mov al, ch call yaz2 mov dl, ':' mov ah, 02h int 21h mov al, cl call yaz2 ret yaz2: ; AL (0-99) → 2 hane aam ; AH=onlar AL=birler add ax, 3030h ; ASCII mov bx, ax mov dl, bh mov ah, 02h int 21h mov dl, bl int 21h ret
Program Sonlandırma
Programı Sonlandırmanın Üç Yolu
| Yöntem | Nasıl çalışır? | Nerede? |
|---|---|---|
ret | COM programında yığının üstünde 0000h vardır; RET, PSP:0000h'a döner, orada int 20h (CD 20) bulunur. | yalnız COM, yığın dengeli ise |
int 20h | DOS programı sonlandırır; CS'nin PSP kesimini göstermesi gerekir. | COM |
mov ax, 4C00hint 21h | AL'deki çıkış kodu ile sonlandırır, açık dosyaları kapatır. | COM ve EXE · önerilen |
IF ERRORLEVEL 1 ile sınanır.PSP (Program Segment Prefix): DOS'un her programın önüne koyduğu 256 baytlık alan; COM'larda kod bu yüzden ORG 100h'tan başlar.
Program Sonlandırma
emu8086 Şablonları: COM ve EXE
COM (tek kesim)
org 100h mov dx, offset msg mov ah, 09h int 21h ret ; ya da int 20h msg db 'Merhaba$'
- CS = DS = ES = SS; ayar gerekmez.
- En fazla 64 KB (kod + veri + yığın).
EXE (ayrı kesimler)
.model small .stack 100h .data msg db 'Merhaba$' .code basla: mov ax, @data mov ds, ax ; DS'yi ayarla! mov dx, offset msg mov ah, 09h int 21h mov ax, 4C00h int 21h end basla
mov ax, @data / mov ds, ax yapılmazsa DS:DX yanlış yeri gösterir ve ekrana çöp basılır.Uygulama · Kodu adım adım çalıştır
Kod İzleme: Mini Menü Programı
DX = menü metninin adresi.
AH = 09h.
Menü yazılır.
AH = 01h: yansıtmalı tek karakter oku.
Kullanıcı 1 bastı: AL = 31h (ekranda görünür).
31h ≠ 'q' → ZF = 0.
Çıkış değil.
AL = '1' → ZF = 1.
Eşit → dallanma yok (başka tuşta menü yeniden gösterilirdi).
DX = selam.
AH = 09h.
Yeni satıra Selam! yazılır.
Menüye dön.
DX = menü metninin adresi.
AH = 09h.
Menü yeniden yazılır.
AH = 01h: yansıtmalı tek karakter oku.
Kullanıcı q bastı: AL = 71h.
AL = 'q' → ZF = 1.
→ cikis.
AH = 4Ch (sonlandır), AL = 00h (çıkış kodu).
Program DOS'a döner; çıkış kodu toplu iş dosyalarında ERRORLEVEL ile okunur.
org 100h goster: mov dx, offset menu mov ah, 09h int 21h mov ah, 01h ; seçimi oku int 21h cmp al, 'q' je cikis cmp al, '1' jne goster mov dx, offset selam mov ah, 09h int 21h jmp goster cikis: mov ax, 4C00h ; çıkış kodu 0 int 21h menu db 0Dh, 0Ah, '1:Selam q:Cikis $' selam db 0Dh, 0Ah, 'Selam!$'
Uygulama
Sık Yapılan Hatalar
mov ax, @data / mov ds, ax.Özet
Özet: Hızlı Başvuru
| İş | Çağrı | Parametreler |
|---|---|---|
| Ekranı temizle | INT 10h / 00h | AL = 03h |
| İmleci konumla | INT 10h / 02h | BH = 0, DH = satır, DL = sütun |
| Renkli karakter | INT 10h / 09h | AL, BH, BL = öznitelik, CX = sayı |
| Karakter (daktilo) | INT 10h / 0Eh | AL |
| Renkli dizgi | INT 10h / 13h | AL = kip, BL, CX, DH:DL, ES:BP |
| Tuş bekle / yokla | INT 16h / 00h, 01h | → AH = tarama, AL = ASCII; 01h: ZF |
| Karakter oku / yaz | INT 21h / 01h, 02h | → AL / DL |
| Dizgi yaz / satır oku | INT 21h / 09h, 0Ah | DS:DX ('$' / tampon) |
| Tarih / saat | INT 21h / 2Ah, 2Ch | → CX DH DL AL / CH CL DH DL |
| Programı bitir | INT 21h / 4Ch, INT 20h, RET | AL = çıkış kodu |
Özet
Alıştırmalar
- Ekranın tam ortasına (12, 38) mavi zemin üzerine beyaz "8086" yazan programı INT 10h/13h ile yazın.
- Kullanıcıdan iki rakam okuyup (01h) toplamlarını tek haneli olarak yazdırın (toplam ≤ 9).
- Esc'ye basılana kadar basılan tuşların tarama kodunu onaltılı yazdıran bir program yazın.
- 0Ah ile okunan metni tersten yazdırın.
- Tarihi GG.AA.YYYY biçiminde yazdırın. Yıl için hangi yöntemi kullanırsınız?
mov ah, 09h/int 21hile '$' karakterini nasıl yazdırırsınız?
İpuçları / cevaplar
- AX = 1301h, BX = 001Fh, CX = 4, DX = 0C26h, ES:BP → '8086'.
- AL'den 30h çıkar, BL'de topla, sonra 30h ekleyip DL ile 02h; arada CR LF yazın.
- INT 16h/00h; AH'yi XLAT tablosu ile iki onaltılı haneye çevirin (Bölüm 10'daki örnek);
cmp al, 1Bh. - SI = tampon+2+sayı−1'den geriye doğru:
std+lodsb+ 02h, CX = sayı. - Gün/ay için AAM; yıl (CX) için 10'a tekrarlı DIV ve yığın.
- Yazdırılamaz; '$' için 02h servisini (DL = 24h) kullanın.
Özet
Kaynaklar
- Ralf Brown, Ralf Brown's Interrupt List (INT 10h, 16h, 21h ayrıntılı başvuru).
- IBM, Personal Computer AT Technical Reference, BIOS bölümü, 1984.
- Peter Abel, IBM PC Assembly Language and Programming, 5. baskı, Prentice Hall, 2001.
- Barry B. Brey, The Intel Microprocessors, 8. baskı, Pearson, 2009.
- emu8086 yardım belgeleri: supported interrupt functions.