Turbo Assembler 5.0 elimde uzun süredir bulunmasına karşın,
paketteki bir sorundan ötürü TASM32.EXE açılmıyordu. Dolayısıyla da
Win32 için herhangi bir çalışma yapabilmem mümkün değildi. Geçenlerde
tuttum TASM 5’i bir kez daha download ettim. Paketi sorunsuz kurunca
tek eksik olan TASM32.EXE de tamamlanmış oldu. Böylece Win32 için kod
yazma olayına başladım. Yani, yazdığım bu konuda ben pek deneyimli
sayılmam. Win32 için program yazmak isteyen arkadaşlar için en azından
bir başlangıç olsun diye bişeyler yazıyorum işte. Yaw Türkiye’de
assembly ile win32 kodu yazan biri varmı ?
Gerekli olanlar;
1- Assembly ile Win32 kodu yazma isteği
2- Bir adet Windows 9x ile çalışan bilgisayar
3- Turbo Assembler 5.0 (TASM32.EXE, TLINK.EXE ve Win32 libraryleri yeterli)
4- Bir adet text editörü (Windowsun not defteri bile olabilir)
5- Win32 Programmers’ Reference
Yukarıdaki 5 şey sizde varsa olaya başlayabiliriz. Örnek olsun
diye ’marabaa televole’ şeklinde bir mesaj kutusu çıkaran bir program
yazalım.
Programı yazarken windows apilerini kullanmamız gerekecek. Geçen
sayılardan birinde Melikşah’ın da belirttiği gibi API dediğimiz olay
eskiden DOS’ta kullandığımız interrupt servislerine benzer bir olay.
API konusunda geniş bilgiyi Win32 Programmers’ Ref. de bulabilirsiniz.
Not: API konusunda bazı APIlerin sonunda ...A harfini görürsünüz.
Bu ’A’ harfi o APInin 32 bitlik olduğunu gösterir. Mesela MessageBox 16
bitlik iken MessageBoxA 32 bitliktir.
Amacımız ekrana bir mesaj kutusu çıkarmak olduğuna göre
MessageBoxA APIsini kullanmamiz gerekecek (Win32.hlp dosyasında
MessageBoxA ile ilgili bilgiyi bulabilirsiniz). Konuyu bulduysanız
karşınızda aşağıdaki gibi bir şey göreceksiniz.
int MessageBox(
HWND hWnd, // handle of owner window
LPCTSTR lpText, // address of text in message box
LPCTSTR lpCaption, // address of title of message box
UINT uType // style of message box
);
Burada hWnd mesaj kutusunu görüntüleyen pencerenin handle numarası,
LpText mesaj kutusunda görünecek olan yazının adresini, LpCaption mesaj
kutusunun başlık çubuğuna yazılacak yazıyı (caption) ve uType ise mesaj
kutusu tipini gösterir (Butonlar + Question, information vs..)
Eğer ortalıkta daha pencere falan yokken bir mesaj kutusu
görüntülenecekse haliyle hWnd=0 olacaktır. uType olayında ise mesaj
kutusuna konulacak düğmeleri ve mesaj kutusunun iconunu ifade eden bir
sayı bulunacaktır. (Ayrıntılı bilgi windows derleyicileri helpinde..)
MessageBox ile ilgili bilmemiz gerekenler bunlar. Şimdi kodlamaya başlayabiliriz.
;MESAJ.ASM
.386P
Locals
Jumps
.Model Flat ,StdCall
Yukarıdaki kısım derleyiciye yönelik olan parçalardır
extrn ExitProcess : Proc
extrn MessageBoxA : Proc
Yukarıda external olarak kullanacağımız API’leri tanımladık.
.Data
baslik db "ho hoyt !",0
yazi db "Marabaa televole",0
Kod özelliği taşımayan bilgileri .Data ile ifade edilen alana yazıyoruz. Burada text yazıların sonunu #0 karakteri belirtir
.Code
Main:
push 0 ;uType değeri stackte (Sadece Tamam düğmesi gösterilecek)
push offset Baslik ; Başlık adresi stackte
push offset Yazi ; Yazi adresi stackte
push 0 ; Pencere yok, o yüzden hWnd değeri olarak 0 değerini stacke koyduk
call MessageBoxA ; Mesaj kutusu gösterildi
CALL ExitProcess ;Programın sonu.. (Kernel32.ExitProcess)
End Main ;Burada da program bitti.
Bu programı aşağıdaki şekilde derleyebilirsiniz.
TASM32.EXE mesaj.asm /mx /m3 /z /q
TLINK32 -x /Tpe /ap /c mesaj,mesaj,, import32.lib