X86 Assembly/Önemli int servisleri
Şimdiye kadar tek gördüğümüz int servisi, int 21'di. Bu derste bu ve diğer birkaç önemli int servisini göreceğiz.
int 10
değiştirBelirli bir işlevi yoktur. Ah yazmacında bulunan değere göre farklı bir anlam kazanır. Buna int 10'un farklı fonksiyonları diyebiliriz. Yani int 10, kullanıldığı anda ah yazmacında hangi değer varsa int 10'un o fonksiyonunu kullandık demektir.
2. fonksiyon
değiştirİmleci (kursör) konumlandırmak için kullanılır. Bu sayede yazacağımız yazıyı ekranın istediğimiz bir yerine yazabiliriz. Düzgün çalışabilmesi için yazmaçların durumu şöyle olmalıdır:
- dh → satır no (0-18)
- dl → sütun no (0-4f)
- bh → 0 (geçerli pencereyi belirtmek için)
Örnek program:
14F4:0100 mov ah,2 14F4:0102 mov dh,1 14F4:0104 mov dl,1 14F4:0106 mov bh,0 14F4:0108 int 10 14F4:010A mov dl,41 14F4:010C int 21 14F4:010E mov ah,0 14F4:0110 int 16 14F4:0112 int 20
Bu programdaki sondan ikinci ve üçüncü satırlar programın bir tuşa basılıncaya kadar beklemesini sağlarlar. Bunu daha sonra göreceğiz. Bu program ekranın (2,2) noktasına A yazıp bir tuşa basılıncaya kadar bekleyecek ve bir tuşa basıldığında da kapanacaktır. Ayrıca bilgisayar saymaya 0'dan başladığı için koordinatları belirtirken insanların kullandığı sayıların bir eksiğini yazmalıyız. Örneğimizde dh ve dl yazmaçlarına 2 yerine 1 koyduk.
6. fonksiyon
değiştirEkranı renklendirmek (var olan renkleri değiştirmek) için kullanılır. Düzgün olarak çalışabilmesi için yazmaçların durumu şöyle olmalıdır:
- al → 0 (aktif pencereyi belirtmek için)
- ch → renklendirilmek istenen dikdörtgensel bölgenin sol üst köşesinin ordinatı (0-18)
- cl → renklendirilmek istenen dikdörtgensel bölgenin sol üst köşesinin apsisi (0-4f)
- dh → renklendirilmek istenen dikdörtgensel bölgenin sağ alt köşesinin ordinatı (0-18)
- dl → renklendirilmek istenen dikdörtgensel bölgenin sağ alt köşesinin apsisi (0-4f)
- bh → renk
Bh yazmacına renk kodu şu mantıkla koyulur:
- Elimize 8 basamaklı ikilik düzende bir sayı alırız.
- Bu sayının sağdan itibaren ilk üç basamağı önplan rengini belirtir. Basamaklar soldan itibaren sırasıyla kırmızı, yeşil ve maviyi temsil eder. Eğer ilgili basamak 1 olursa rengimize ilgili rengin karıştığı, eğer ilgili basamak 0'sa ilgili rengin karışmadığı anlamına gelir.
- Elimizdeki sayının sağdan itibaren dördüncü basamağı ilgili önplan renginin parlak mı yoksa sönük mü olacağını belirtmek için kullanılır. Dördüncü basamak 1'se önplan rengi parlak, değilse sönüktür.
- Elimizdeki sayının sağdan itibaren beşinci, altıncı ve yedinci basamağı arkaplan rengini belirtir. Bunun dışında önplan rengini belirtmek için kullanılan bitlerden farkı yoktur.
- Elimizdeki sayının sağdan itibaren son, soldan itibaren ilk biti yazının yanıp sönmesini sağlar. Eğer ilgili basamak 1'se yazı yanıp söner, ilgili basamak 0'sa olduğu gibi kalır.
- Son olarak elimizdeki ikilik düzendeki sayı on altılık düzene çevrilir ve bh yazmacına yazmaya hazır hâle getirilir. Örnek program:
14F4:0100 mov al,0 14F4:0102 mov ch,2 14F4:0104 mov cl,9 14F4:0106 mov dh,6 14F4:0108 mov dl,12 14F4:010A mov bh,9c 14F4:010C mov ah,6 14F4:010E int 10 14F4:0110 mov ah,0 14F4:0112 int 16 14F4:0114 int 20
Bu programdaki sondan ikinci ve üçüncü satırlar programın bir tuşa basılıncaya kadar beklemesini sağlarlar. Bunu daha sonra göreceğiz. Programımızda dikkat etmemiz gereken noktalar:
- İnsanlar bir şeyi sayarken 1'den başlarlar. Ancak bilgisayar programlama dillerinde 0'dan başlanır. O yüzden dikdörtgenin koordinatlarını belirtirken örneğin 2 yazdığımızda aslında 3. karakterden bahsediyor oluyoruz.
- Debug'da bütün sayılar on altılık düzende olduğu için 5. satırdaki 12 aslında 18 sayısını ifade ediyor.
- Bu örnek zaten yazılı olan yazıları ihmal edecek ve o yazıların üstünü boyayarak görünmez hâle getirecektir. Şimdi isterseniz imleç konumlandırma ile ilgilenen 2. fonksiyonu da işin içine katalım ve daha gelişmiş bir örnek yapalım. Bu sayede ön plan renginin değiştiğini ve yazının yanıp söndüğünü görebileceğiz.
14F4:0100 MOV AL,00 14F4:0102 MOV CH,01 14F4:0104 MOV CL,09 14F4:0106 MOV DH,06 14F4:0108 MOV DL,12 14F4:010A MOV BH,9C 14F4:010C MOV AH,06 14F4:010E INT 10 14F4:0110 MOV AH,02 14F4:0112 MOV DH,01 14F4:0114 MOV DL,08 14F4:0116 MOV BH,00 14F4:0118 INT 10 14F4:011A MOV DX,0127 14F4:011D MOV AH,09 14F4:011F INT 21 14F4:0121 MOV AH,00 14F4:0123 INT 16 14F4:0125 INT 20 14F4:0127 DB "deneme$"
Bu programdaki deneme yazısının d harfi renklendirilmiş alanın dışında kalır. Diğer kısımları ise alanın içindedir. Yazının yanıp söndüğünü görmek için ekranı tam ekran yapmanız gerekebilir. (alt+enter)
int 16
değiştirBelirli bir işlevi yoktur. Ah yazmacında bulunan değere göre farklı bir anlam kazanır. Buna int 16'nın farklı fonksiyonları diyebiliriz. Yani int 16, kullanıldığı anda ah yazmacında hangi değer varsa int 16'nın o fonksiyonunu kullandık demektir.
0. fonksiyon
değiştirProgram, klavyeden herhangi bir tuşa basılana kadar bekler. Basılan tuş al yazmacına koyulur. Örnek:
mov ah,0 int 16
Bu fonksiyonu kullanıcıdan girdi almak yerine programı bir tuşa basılana kadar bekletmek için kullanın. Çünkü kullanıcının girdiği tuş ekrana yazılmaz. Kullanıcıdan veri girişi için ileride göreceğimiz int 21'in 1. fonsiyonunu kullanın.
int 20
değiştirProgramı sonlandırır. Örnek:
int 20
Burada program hiçbir şey yapılmadan sonlandırılır.
int 21
değiştirBelirli bir işlevi yoktur. Ah yazmacında bulunan değere göre farklı bir anlam kazanır. Buna int 21'in farklı fonksiyonları diyebiliriz. Yani int 21, kullanıldığı anda ah yazmacında hangi değer varsa int 21'in o fonksiyonunu kullandık demektir.
1. fonksiyon
değiştirKlavyeden veri girişi için beklenir. Klavyeden girilen tuş al yazmacına koyulur. Örnek:
mov ah,1 int 21 int 20
Burada program kullanıcıdan klavyeden bir tuşa basması için bekler. Kullanıcı klavyeden bir tuşa bastığında basılan tuşun ASCII kodu al yazmacına koyulur.
2. fonksiyon
değiştirDl yazmacındaki karakteri ekrana yazar. Örnek:
mov ah,1 int 21 mov dl,al mov ah,2 int 21 int 20
Bu program kullanıcının girdiği karakteri tekrar ekrana yazar.
NOT: Karakterler bellek gözeneklerinde ve yazmaçlarda ASCII kodlarla saklanır. Yani aslında her karakterin (harfin, rakamın, simgenin, vb.) aslında bir ASCII kodu vardır. Aslında bellekte karakterler değil bunların ASCII kodları saklanır. 1. ve 2. fonksiyonların yaptığı iş karakterle ASCII kod arasında dönüşüm yapmaktır. Yani 1. fonksiyon karakteri ASCII koda dönüştürüp bu sayıyı al yazmacına koyar. 2. fonksiyon da ASCII kodu karaktere dönüştürüp karakteri ekrana yazar. ASCII kodlar hakkında şuradan bilgi alabilirsiniz. Örneğin A karakterinin ASCII kod karşılığı 41'dir (on altılık düzende). Bellekte de A değil, 41 saklanır.
9. fonsiyon
değiştirBunu daha önce görmüştük. Ancak yine de anlatmak istiyorum. Bu fonksiyon dx yazmacında belirtilen ofset adresinden itibaren $ karakteri ile karşılaşana kadar karakterleri ekrana yazar. Örnek:
14F7:100 mov ah,9 14F7:102 mov dx,109 14F7:105 int 21 14F7:107 int 20 14F7:109 db "merhaba",24
Gördüğünüz gibi db komutunu klasik şekilde yazımızı " karakterleri arasına yazabileceğimiz gibi her bir karakterin ASCII kodunu kullanarak ve bu kodları virgülle ayırarak da yazabiliyoruz. 24, $ karakterinin ASCII kodudur. Eğer 109. ofseti db "merhaba",41,24
olarak değiştirirsek bu sefer ekrana merhabaA
yazılır.
4c. fonksiyon
değiştirBu fonsiyon int 20'nin yaptığının aynısını yapar. Yani programı sonlandırır. Örnek:
mov ah,4c int 21