; #########################################################################
;
; Bu ASM dosyasi MASM32 de 32 bit'lik kod yapisi icin
; ornek bir iskelet niteligindedir.
;
;
; #########################################################################
; 32 bit'lik ASM kodu icin Assembler spesifik yonergeleri girilir
.386 ; 32 bit icin minimum islemci ihtiyaci
.model flat, stdcall ; FLAT hafiza modeli & STDCALL cagrilari
option casemap :none ; code da kullanilacak olay duyarliliklari
; #########################################################################
; ---------------------------------------------
; Esitlemeler ve yapilar ile temel include dosyalari
; ---------------------------------------------
include \masm32\include\windows.inc
; -------------------------------------------------------------
; MASM32 de, her include dosyasi library dosyasindan L2INC.EXE
; yardimci araciyla islenebilir bir hale getirilir. Ozel bir library'den
; fonksiyon kullanmak isterseniz, o library icin include dosyasi ve
; library dosyasinin her ikisini birden kullanmalisiniz.
; -------------------------------------------------------------
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
; #########################################################################
; 1. szText
; Kodlama esnasinda .code section'da iken bile .data section'a text
; girer gibi kolaylikla data'lari byte sekli ile tanimlamaya yarayan
; kullanisli bir makrodur.Ozellikle fonksiyonlardan once kullanisi
; acisindan bir hayli yardimci olur. Girilen bilgiler .code sectionda
; tutulur.
szText MACRO Name, Text:VARARG
LOCAL lbl
jmp lbl
Name db Text,0
lbl:
ENDM
; 2. m2m
; Bir hafiza konumundan digerine kopyalama islemi yapar
; Kodlama esnasinda oldukca pratik ve yararli bir makrodur.
; Özellikle register disi immediate degerlere de pointer
; bazli calistigindan oldukca faydalı olur.
m2m MACRO M1, M2
push M2
pop M1
ENDM
; 3. return
; Cogunlukla WndProc prosedürü gibi karmasik sartlarin oldugu
; coklu dallanmalar'a sahip prosedurlerde iki satir gibi suren
; fonksiyona geri parametre gonderme ve EIP yordam isaretcisinine
; onceki cagri noktasindan bir sonraki yonergenin adresini gonderen
; islemleri tek satira dusurerek kodlamada duzen saglamaya yarayan
; kullanisli bir makrodur.
return MACRO arg
mov eax, arg
ret
ENDM
; #########################################################################
; ----------------------------------------------------------------------
; Prototipler MASM "invoke" ifadesi ile cagrilan prosedurun islenecek
; parametrelerinin boyutunu ve sayisinin kullanimini kontrol altina alir
; Ayrica kodlama ve derleme esnasinda parametrelerin neresinda hata oldugunu
; imler ve kodun gelisimini ve guvenilirligini arttirir.
; ----------------------------------------------------------------------
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
TopXY PROTO :DWORD,:DWORD
; #########################################################################
; ------------------------------------------------------------------------
; Burada data sectionin baslangicini ve bu sectionda yer alacak elemanlarin
; ilk degerlerini verebilirsiniz.Ayrica hic bir deger atamadan kodlamanin
; devaminda degerlerini vermek istediginiz elemanlar icinde [.data?] section
; devamina alan acabilirsiniz. Unutulmamasi gereken .data ve data? farkli
; bolumlerdir bknz:(section's).
; ------------------------------------------------------------------------
.data
szGorunenIsim db "Generic",0
CommandLine dd 0
hWnd dd 0
hInstance dd 0
; #########################################################################
; ------------------------------------------------------------------------
; Code section calistirilabilir kodun nereden baslayacagini gosteren GLOBAL
; bir section'dir. Derleyici bu tanımı kodların bulunduğu alan olarak varsyar.
; Bu section'dan ExitProcess() ile çıkıp kod ve uygulama sonlandırabilir.
; ------------------------------------------------------------------------
.code
; -----------------------------------------------------------------------
; "start:" etiketi code section'in baslangicini "end start" ise dosyanin
; sonunu imler. Tum prosedürler bu iki etiketin arasinda yer almalidirlar.
; -----------------------------------------------------------------------
start:
invoke GetModuleHandle, NULL ; ornek baslik ( instance handle ) alir
mov hInstance, eax
invoke GetCommandLine ; komut satirini alir
mov CommandLine, eax
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT ; ve win32 programları için giriş alani
invoke ExitProcess,eax ; islem bitti & isletim sistemine geri don
; #########################################################################
WinMain proc hInst :DWORD,
hPrevInst :DWORD,
CmdLine :DWORD,
CmdShow :DWORD
;===========================================
; LOCAL değişkenlerimiz yigina tanimlaniyor
;===========================================
LOCAL wc :WNDCLASSEX
LOCAL msg :MSG
LOCAL Wwd :DWORD
LOCAL Wht :DWORD
LOCAL Wtx :DWORD
LOCAL Wty :DWORD
szText szSinifAdi,"Genel_Sinif"
;==================================================
; WNDCLASSEX yapisi gerekli degiskenler ile tanimlaniyor
;==================================================
mov wc.cbSize, sizeof WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW \
or CS_BYTEALIGNWINDOW
mov wc.lpfnWndProc, offset WndProc ; WndProc'un adresi
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
m2m wc.hInstance, hInst ; ornek baslik (instance handle)
mov wc.hbrBackground, COLOR_BTNFACE+1 ; sistem rengi
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, offset szSinifAdi ; pencerenin sinif adi
invoke LoadIcon,hInst,500 ; ikon ID ; kaynak ikon
mov wc.hIcon, eax
invoke LoadCursor,NULL,IDC_ARROW ; sistem kursoru
mov wc.hCursor, eax
mov wc.hIconSm, 0
invoke RegisterClassEx, ADDR wc ; pencere sinifi kaydedilir
;================================
; Pencereyi asagidaki islemlerle ortala
;================================
mov Wwd, 500
mov Wht, 350
invoke GetSystemMetrics,SM_CXSCREEN ; pixel cinsinden ekran genisligini al
invoke TopXY,Wwd,eax
mov Wtx, eax
invoke GetSystemMetrics,SM_CYSCREEN ; pixel cinsinden ekran yuksekligini al
invoke TopXY,Wht,eax
mov Wty, eax
; ==================================
; Ana program penceresini olustur
; ==================================
invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW,
ADDR szSinifAdi,
ADDR szGorunenIsim,
WS_OVERLAPPEDWINDOW,
Wtx,Wty,Wwd,Wht,
NULL,NULL,
hInst,NULL
mov hWnd,eax ; Olusan programin basligi(handle) DWORD cinsinden degiskene kopyalanir
invoke LoadMenu,hInst,600 ; kaynak menuyu yukle
invoke SetMenu,hWnd,eax ; ana penceremize olusan menuyu ata
invoke ShowWindow,hWnd,SW_SHOWNORMAL ; pencereyi goster
invoke UpdateWindow,hWnd ; pencereyi ekranda guncelle
;==============================================
; PostQuitMessage gonderilene kadar dongude kal
;==============================================
StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0 ; her mesaji isle
cmp eax, 0 ; GetMessage() gelen (EXIT) cik mesajimi?
je ExitLoop ; sifir dondugunde cik
invoke TranslateMessage, ADDR msg ; mesaji cevir
invoke DispatchMessage, ADDR msg ; mesaji, isleyecek prosedure gonder
jmp StartLoop
ExitLoop:
return msg.wParam
WinMain endp
; #########################################################################
WndProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD
; -------------------------------------------------------------------------
; Bir uygulama WndProc proseduru sayesinde isletim sistemine mesaj gonderir
; ve kendisine gelen mesajlari isler.
; Her mesaj kendisiyle birlikte gelen wParam & lParam gibi iki parametreye
; sahiptir.
; -------------------------------------------------------------------------
.if uMsg == WM_COMMAND
;----------------------------------------------------------------------
; WM_COMMAND mesaji menuler,butonlar ve toolbarlar ile gelen mesajlardir.
;
;
; controlid'leri ozellikle menu komutlari ile calisirken cok kullanislidir
; Bir komut olarak WM_COMMAND'a gelen control id'leri W_param'in
; dusuk anlamli (low word)'ünde yer alir. Asagida kullanimi gosterilmistir.
; ---------------------------------------------------------------------
;======== menu komutlari ========
.if wParam == 1000
invoke SendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL
.elseif wParam == 1900
szText TheMsg,"Assembler, Kolaydır & Basittir"
invoke MessageBox,hWin,ADDR TheMsg,ADDR szGorunenIsim,MB_OK
.endif
;====== menu komutlarinin sonu ======
.elseif uMsg == WM_CREATE
; --------------------------------------------------------------------
; Bu mesaj CreateWindowEx fonkisyonu cagrildiginda ve bu islemden geri
; donuldugunde WndProc'a gonderilir.Programda kullanilacak diger kontrol
; nesnelerinin baslangic ayarlarida burada yapilir.
; --------------------------------------------------------------------
.elseif uMsg == WM_CLOSE
; -------------------------------------------------------------------
; Bu mesaj olustugunda bu alanda farkli isteklerinizi yerine getirebilirsiniz
; ornegin olusturdugunuz pencerenin kapanmamasi veya o anda kaydedilmesi gereken
; bir ozellik icin uyari islemlerini tanimliyabilirsiniz.
; Bu mesaja geri donus degeri olarak sifir verirsek isletim sistemi programi
; sonlandiramayacaktir.
; -------------------------------------------------------------------
szText TheText,"Please Confirm Exit"
invoke MessageBox,hWin,ADDR TheText,ADDR szGorunenIsim,MB_YESNO
.if eax == IDNO
return 0
.endif
.elseif uMsg == WM_DESTROY
; ----------------------------------------------------------------
; Bu mesaj uygulamadan saglikli bir cikis saglar.WinMain() de
; GetMessage() fonksiyonuna sifir dondugunde PostQuitMessage islenerek
; uygulumadan cikilir.Eger bu fonksiyon kullanilmazsa pencere kapanir
; ancak kodlar hafizada kalir.
;------------------------------------------------------------------
invoke PostQuitMessage,NULL
return 0
.endif
; --------------------------------------------------------------------
; Isletim sistemi tarafindan islenmesi icin WndProc prosedurune her
; hangi bir mesaj gelmez ise varsayilan pencere islemleri uygulanir.
; --------------------------------------------------------------------
invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
WndProc endp
; ########################################################################
TopXY proc wDim:DWORD, sDim:DWORD
; ----------------------------------------------------
; Bu prosedur WinMain prosedurunde CreateWindowEx cagrisi
; icin ust X & Y koordinantlari hesaplar.Amac penceremizi
; tam olarak ekranda ortalamaktır.
; ----------------------------------------------------
shr sDim, 1 ; ekran boyutunu 2 ile boler
shr wDim, 1 ; pencere boyutunu 2 ile boler
mov eax, wDim ; pencere boyutunu eax icine kopyalanir
sub sDim, eax ; ekranin boyutundan pencerenin yarisinin boyunu cikarilir.
return sDim
TopXY endp
; ########################################################################
end start