HERKES İÇİN DEBUG İLE PROGRAMLAMA
Murat Yıldırımoğlu
Debug
programı, uzantısı COM ve EXE olan doğrudan çalıştırılabilir dosyaları
oluşturmanızı ve bu uzantılara sahip programları inceleyip değiştirebilmenizi
sağlar.
DEBUG
komutunu verdiğinizde karşınıza bir tire çıkar. Bu tire, debug programının,
vereceğiniz komutları beklediğini gösterir. Vereceğiniz komutlar yardımı ile
mikroişlemcinin yazmaçlarını (register) ve belleği inceleyebilir, basit
programlar yapabilirsiniz. 8088 Ve 8086
mikroişlemcilerinde 14 adet yazmaç bulunur (yeni işlemcilerle birlikte yazmaç
sayısı da artmaktadır) . Bu yazmaçların özel işlevleri vardır. Bunlardan dördü karalama yazmacıdır ve
yapılan işlemlerin sonuçlarını geçici olarak tutmak için kullanılır. Dört
yazmaç, segment değerlerini tutar; beş yazmaç da offset değeri için kullanılır.
Son olarak da bir bayrak (flag) yazamacı 8088’in içinde bulunduğu durumla
ilgili bilgileri tutar ve bu amaçla 1 bitlik 9 adet bayrak içerir. Karalama yazmaçları AX, BX, CX ve DX olarak
sıralanırlar. Segment yazmaçları CS, DS, SS ve ES’dir. Offset yazmaçları ise
IP, SP, BP, SI ve DI’dır.
Yazmaçları
ve içeriklerini görmek isterseniz register anlamına “r” harfini girip ENTER’a
basın. Herhangi bir yazmaçı tek başına görüp değiştirmek isterseniz
“r”’nin yanısıra o yazmaçın adını da yazmalısınız. Örneğin,
“raX” komutunu verirseniz AX yazmaçının içeriğini görüp
değiştirebilirsiniz. Tireyi gördüğünüzde “Q” harfine basarsanız DEBUG’dan
çıkarsınız. “C” komutu belleğin bir kısmı ile diğer bir kısmını karşılaştırır.
“D” komutu ile belleğin bir kısmını sergileyebiliriz. “F” komutu ile belleğin
bir kısmını bir değer ile doldurabiliriz. “G” komutu ile bellekteki herhangi
bir programı çalıştırabiliriz. Örneğin, XT’ler zamanında “G=c800:5” komutunu
vererek sabit diski alçak düzey formatlama programını çalıştırıyorduk.
“A”
ve “U” komutları ile bir program yapabilir ya da bir programı makina dilinde
inceleyebiliriz. Yalnız bunun için makina diline aşina olmanız gerekir.
Evet
şimdi de ufak bir program yapalım. Programımız
ekrana “Merhaba” yazısını yazacak.
1- Debug komutu ile programa
girelim. Tire işaretini görelim.
2- “A” komutunu girerek bir program
yapmak istediğimizi belirtelim. Bu komuta karşılık olarak offset kısmı 0100
olan bir adresten program yazmaya başalayabiliriz. Segment kısmı bilgisayarın o
anki durumuna göre değişebilir. Örnek:
1864:0100
3- Yukarda örnek olarak verdiğimiz
satırın hemen yanına şunu yazalım:
mov ah,9
“mov” ile “ah,9” ifadelerinin
arasını TAB tuşuna basarak açabilirsiniz.
“mov ah,9”
yazdıktan sonra ENTER tuşuna basın.
4- Karşınıza başka bir adres
gelecektir. Bu adresleri GW-BASIC’teki satır numaralarına benzetebiliriz. Bu
adresin hemen yanına şunu yazalımj:
mov dx,120
Satır sonunda yine ENTER’a basıyoruz.
5- Şimdiki satıra
int 21
yazıp
ENTER tuşuna basıyoruz.
6- Buraya da “int 20” yazın. Tabii, yine ENTER’a
basıyorsunuz.
7- Şimdi karşımıza çıkan adrese bir
şey yazılmayacak. Yalnızca ENTER’a basın. Programımız hemen hemen bitti.
8- Karşımıza yine tire işareti
geldi. Burada şu komutu verin:
e 120 ‘MERHABA $’
(Sonra ENTER’a basmayı unutmayın.)
9- Şimdi yazacağımız komut “rcx”. Bu
komutun karşılığı olarak ekranda ilkönce CX yazmaçının değeri görünecek sonra
da “:” işareti ile bizden yeni bir değer istenecektir. Biz de buraya “2e”
değerini gireceğiz.
10- Tire işareti yine göründü. Şimdi
“n mer.com” yazalım.
11- Tire işaretini görünce “w”
komutunu girelim.
12- Debug’dan çıkmak için “Q”
komutunu verelim.
İşi
tamamladık. Şimdi “mer” komutu ile programımızı çalıştırabiliriz. Yukarda
yaptıklarımızı da satır satır açıklayalım:
3- İlk yazdığımız komut ile AH
yazmaçına 9 değerini yüklüyoruz.
4- Bu komut ile de DX yazmaçına 120
değerini yüklüyoruz. Bu değerler Hexadecimal (onaltılı düzende)’dir.
5- Bu satırda 21 nolu kesintiyi
yaratıyoruz. 21 Nolu kesinti AH yazmaçına yüklenen değerle birleşince bir
karakter dizisinin ekrana yazılacağı anlaşılıyor. Karakter dizisinin nerede yer
alacağı ise DX yazmaçına yüklenen değer ile belirtiliyor.
6- int 20 komutu ile işletim sistemine programın sona erdiğini
bildiriyoruz.
8- e (eNTER-GİR) komutu ile tırnak
işareti içinde karakter dizimizi veriyoruz. Yalnız burada son karakter olarak
“$” karakterini vermeyi unutmayın. Unutursanız ne olacağını deneyerek
görebilirsiniz.
9- rcx komutu ile CX yazmaçının
değerini görüyor ve değiştiriyoruz. CX’e yüklediğimiz “2e” değeri programımızın
büyüklüğünü belirtiyor.
10- n (nAME-ADLANDIR) komutu ile
programımıza bir ad veriyoruz. (Adı mer.com)
11- w (xRITE-YAZ) komutu ile
programı diske yazdırıyoruz.
Şimdi
de bir başka örnek program ile DEBUG bilgimizi pekiştirelim. Aşağıdaki program
özellikle fiziksel özürlülerin işine çok yarayabilecek bir programdır ve
basılan tuşun sürekli tekrar edilmesini engeller. Bu programı herhangibir editörle yazın, ama ASCII modunda
kaydedin.
A 0100
JMP 0130
DB 0,0,0,0,F8
STI
PUSH AX
IN AL,60
CS:
CMP AL,[0106]
JZ 011D
CS:
MOV [0106],AL
POP AX
CLI
CS:
JMP FAR
[0102]
IN AL,61
MOV AH,AL
OR AL,80
OUT 61,AL
MOV AL,AH
OUT 61,AL
CLI
MOV AL,20
OUT 20,AL
POP AX
IRET
MOV AX,3509
INT 21
MOV [0102],BX
MOV [0104],ES
MOV AX,2509
MOV DX,0107
INT 21
MOV DX,0130
INT 27
N NOTEKRAR.COM
RCX
4A
W
Q
Şimdi
diyelim ki bu yukardaki programı içeren dosyanın adı NOTEKRAR.SCR. Şu komutu
vererek NOTEKRAR.COM adında bir program yaratabilirsiniz:
DEBUG <NOTEKRAR.SCR
Bu
program yardımı ile basılan tuşun tekrarı önlenir. Bu programı istediğiniz
zaman çalıştarabileceğiniz gibi AUTOEXEC.BAT içine yerleştirerek bilgisayarın
her açılışında otomatik olarak çalışmasını sağlayabilirsiniz.
Bu
örnekte de gördüğünüz gibi bir program oluşturmak için DEBUG’ın içine girip
komutları tek tek vermek zorunlu değil (zaten kolay da değil). Özellikle
dergilerde yer alan programları, kendinizi rahat hissettiğiniz bir yazı
programı ile yazabilir sonra, yalnızca son aşamada, programı oluşturmak için
DEBUG’ı çağırabilirsiniz.
Assembler program örneklerini görmek için buraya
tıklayınız.