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