Assembly & Win32

1/6/2008 · Kategori: Genel Programlama

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

EkleBunu Sosyal Paylaşım Butonu

Yorum (0) Yorum yaz! Arkadaşına Gönder!

0 yorum yazılmıştır

« Önceki :: Sonraki »