X86 Assembly/Önemli int servisleri

Vikikitap, özgür kütüphane

Ş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ştir]

Belirli 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ştir]

Ekranı 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ştir]

Belirli 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ştir]

Program, 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ştir]

Programı sonlandırır. Örnek:

int 20

Burada program hiçbir şey yapılmadan sonlandırılır.

int 21[değiştir]

Belirli 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ştir]

Klavyeden 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ştir]

Dl 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ştir]

Bunu 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ştir]

Bu fonsiyon int 20'nin yaptığının aynısını yapar. Yani programı sonlandırır. Örnek:

mov   ah,4c
int   21