Bu bölümde Debug programını daha etkin kullanmanın yollarına
yer vereceğim. Bu sayede kısa programlar yazmak epey cazip hale gelecek.
Bölüm 2: Debug ile Kod İçerikli Dosyaları Derlemek
Eskiler bilirler, DOS altında standart çıkış birimine giden içeriği farklı çıkış birimlerine, daha öznel olarak dosyaya aktarmanın yolları vardır. Komut isteminde kullanacağınız 1 - 2 ek karakter ile bunu kolaylıkla başarabilirsiniz. Birkaç tiyo vermekten ziyan çıkmaz.
[komut] > [dosya adı]
Bu şekilde kullanımda yapacağınız işe ilişkin komutu yazdıktan sonra (boşluk bırakarak veya bırakmaksızın) ">" karakterini yazdıktan sonra belirteceğiniz dosya adı, görüntü birimine CRT modunda aktarılacak içeriği alacaktır. Eğer bu dosya daha önceden mevcut ise içeriği silinir ve baştan yazılır. Aksi takdirde sıfırdan oluşturulur.
[komut] >> [dosya adı]
Bu şekilde kullanımın farkı, içeriğin dosyanın üzerine yazılmayıp sonuna eklenmesidir. Bu özellik, Windows ortamı altında günlük dosyası oluşturan programlarda "Günlüğün sonuna ekle" veya "Append Log" biçiminde geçer.
[komut] | [dosya]
Bu şekilde kullanım ise, içeriğin [dosya] ile belirtilen programa gönderilmesini sağlar. Her üç komut için de mutlak olan, programlara gönderilen bilgilerin klavyenin tuşlarına basılmış gibi gönderildiğidir. Yani programın oluşturacağı içerik, komutun çıkış içeriğinden farklı olabilir. Zira ASCII 8 karakterinin anlamı "Backspace" olduğundan ekrandan bir karakter silinir, 10 karakterinin anlamı "Carriage Return" olduğundan satırın başına dönülür.
Şimdi birkaç örnek ile bu komut kombinasyonlarının kullanımına yer vereceğim.
C:\>dir > c:\içerik.txt
Bu şekilde C:\ kök dizininin içeriğini içerik.txt dosyasına kaydetmiş olursunuz. Komutun çalışması esnasında ekrana hiçbir şey basılmaz. Dosyayı "edit içerik.txt" şeklinde açtığınızda normalde ekranda yazacak olan yazıların bu dosyanın içine yazılmış olduğunu fark edeceksiniz.
C:\>Windows>dir >> c:\içerik.txt
Bu komutu çalıştırmadan önce bir önceki işlemin yapıldığını varsayın. Bu durumda içerik.txt dosyasının içine baktığınızda sırasıyla C:\ kök dizininin içeriğini ve C:\Windows dizininin içeriğini göreceksiniz.
C:\>Windows\System32>Java | more
C:\Windows\System32 dizininin altında Java.exe diye bir dosya bulunur, ne işe yaradığının şu an önemi yok. Sadece "Java" yazıp Enter'a bastığınızda ekrana dökülen bilgilerin satır sayısından fazla olduğunu, dolayısıyla yukarıda kalanları göremediğinizi farkedersiniz. Ancak yukarıdaki şekilde kullandığınızda ekran satır sayısı kadar bilginin ardından -- More -- yazar ve sizin herhangi bir tuşa basmanızı bekler. Bu sayede çıkış içeriğinin tümünü uzun uzun inceleyebilirsiniz.
Sıradaki kullanım şekli, bu bölümün asıl konusunu oluşturuyor.
[komut] < [dosya]
Bu şekilde kullanımda, [dosya] ile belirtilen dosyadaki içerik, [komut] ile çalıştırılan uygulamaya gönderilir. Özellikle çok defa klavye girişi yapılan programlarda işleri kısaltmak için kullanılır. Biz ise, daha önce oluşturmuş olduğumuz kod dosyalarını Debug'a işletip, COM uzantılı dosyalar elde etmek için kullanacağız.
Debug programının .asm uzantılı dosyaları okuyup da işleme özelliği yoktur. İşlev itibariyle tamamen alt düzey çalışan komut girme ve görme uygulaması niteliğindedir. Dolayısıyla komut girme işini otomatik olarak yaparak büyük bir yükten kurtulacağız.
Windows altında Not Defteri uygulamasını açalım ve aşağıdaki kodu girelim(uğraşmayın, kopyala-yapıştır kullanın):
a
;
;1024 x 768 x 256 ve mul dx kullanılan
sürüm
;
mov ax, 4f01 ;SVGA mod bilgisi işlevi
mov cx,
0105 ;Bilgisi
alınacak mod numarası: 105 = 1024 x 768
mov di,
200
;Bilginin depolanacağı bellek başlangıç adresi
int
10
;Video BIOS kesmesi
;
mov ax,
4f02 ;SVGA
modunu ayarlama işlevi
mov bx,
0105 ;SVGA
modu: 0x101 = 640 x 480
int 10
;
mov ax,
A000 ;Video
memory başlangıç ofseti
mov es,
ax
;Extra Segment'i ax'e eşitle
xor bx,
bx
;BX'i sıfırla
;
mov si,
2FF
;SI'ye 2FFH(767) ver, program değişkeni olarak kullan
mov cx,
3FF
;Yatay çözünürlük: 1024 piksel (3FF=1023)
;'Loop' dallanma noktası
mov ax, si
;cx'i ax'e kopyala
mov dx,
400
;Yatay çözünürlük: 1024 piksel
mul dx
add ax,
cx
;İstenen piksel için ofseti bul
jnc
12C
;Piksel ofseti FFFFH'ı aşmadıysa aşağıdaki satırı atla...
inc
dx
;Yukarıdaki durum dahilinde DX'i bir arttır
mov di,
ax
;Piksel ofsetini DI'ye ayarla
;
cmp dx, [240]
jne
144
;Banka seç
;
mov ax,
cx
;CX'teki sayı renk olacak
stosb
;AX'teki bilgiyi DI adresine aktar
;
push
cx
;İşleri biraz yavaşlatmak için...
mov cx,
1000 ;CX ile küçük bir...
loop
13B
;...döngü kullan
pop
cx
;CX'i düzelt
;
loop
120
;Yatay sütun tamamlanana dek tekrarla
dec si
;Bir yukarı geç
jnz
11D
;Tüm yatay sütunlar tamamlanmadıysa tekrarla
ret
;Programı bitir ve sisteme geri dön
;
push
si
;SI'yı koru
mov si,
20C
;WindowFuncPtr adresi
call far [si]
;SVGA yazma penceresi seçme işlevi
pop
si
;SI'yı geri al
mov [240],
dx ;Yeni bankayı
kaydet
jmp 134
n grafik2.com
rcx
100
w
q
Bu programın mükemmel çalışacağı garantisini veremiyorum, çünkü ben bu kodu yazalı çok uzun zaman oldu ve 1-2 hata bulunması olasıdır. Söz konusu program, ekranı 256 renk paleti ile yatay olarak boyar. Ne demek istediğimi anlamanız için programı çalıştırmanız gerekir.
Şimdi yazmış olduğunuz metni C:\> kök dizininde deneme.asm diye kaydedin. Komut isteminde aşağıdaki ifadeyi girin ve Enter'a basın.
C:\>Debug <deneme.asm
Ekrana yazılan bilgiler, debug programı içinde sizin girmiş
olduğunuz bilgiler olacaktır. Burada dikkat çekmek istediğim bir kaç nokta var.
1. "deneme.asm" dosyasının ilk satırında yazmış
olduğunuz a harfi, debug programının başlamasının ardından Assemble moduna
geçmeniz için gereken giriştir.
2. Kimi satırlarda bulunan noktalı virgül (;) karakteri, o
satırın yorum olarak kabul edileceğini, daha açık bir deyişle yapılan girişin
önemsenmeyeceğini belirtir.
3. Programa ilişkin son satır olan "jmp 134"
ifadesinden sonra boş bırakılan satır çok önemlidir. Bu satır sayesinde
Assemble modundan çıkılır ve ana menüye dönülür.
4. 3. maddenin önemini düşünerek, asla kodunuzu yazarken
anlaşılırlık açısından boş satır bırakmayın; boş bırakmayı düşündüğünüz satıra
yukarıdaki gibi sadece noktalı virgül (;) koyun.
5. Bu programın biterek DOS'a dönüş yaptığı satır aslında
"ret" ifadesinin bulunduğu yerdir. Ancak bu ifade yazıldıktan sonra
girilenler, programın akışı içerisinde kullanılan bir işlevdir.
Bu şekilde bir mikroişlemci kodu yazarken jxx, loop, call
komutlarının parametrelerini doğru tahmin edebilmeniz için bu konuda epey
tecrübeye sahip olmanız gerekir, yani her komutun kaç bayt tuttuğunu
bilmelisiniz. Ancak vereceğiniz parametreler, çoğunlukla komutların
kapladıkları yerleri değiştirmez. Bu nedenle, kod yazarken ilk aşamada jxx, loop, call
komutlarının parametlerini keyfi verin. Daha sonra yazdığınız programı Debug'a
aktarırken hedef noktaların ofset adreslerini(IP değerlerini) bir kenara not
alın ve son olarak kaynak koddaki yerlerine yazın. Debug, hangi kodun kaç bayt
uzunluğunda olacağının alıştırmasını yapmak için harika bir araçtır. Zira bu
programda alıştırmasını yapmanız gereken tüm ifadeler bulunmaktadır.
Debug derleyicisinin sembolik çalışan herhangi bir yönü
yoktur. Bu nedenle kod dosyanızda etiketlere(label) yer veremez ve dallanma
komutlarında bu sözde etiketleri kullanamazsınız. Etiket ve sembolik
değişkenleri destekleyen derleyici Turbo Assembler'dır.
Bir dahaki bölümde Turbo Assembler'in üstünlüklerine ve (çok
az olsa da)zayıflıklarına, assembler kaynak kod dosya formatına ve TASM.EXE ve
TLINK.EXE kullanımlarına yer vereceğim. Bu süreç boyunca bana grup
üzerinden mail yoluyla ulaşabilir ve kafanıza takılanları sorabilirsiniz. Eğer
talep ederseniz sıradaki yazıyı, Mikroişlemciler - 1 dersinde epey faydasını
göreceğiniz içeriğiyle Intel x86 platformundaki Gerçek Kip İşleyişi
hakkında yazabilirim. Yazı dizisi tam gaz devam edecek. Şimdilik hepiniz
hoşçakalın...
Bilmemek değil, öğrenmemek ayıptır.
Cihan Atıl Namlı
14 Ekim 2004 Perşembe, 18.18