Snake Force / Ana Sayfa
Forum Anasayfası Forum Anasayfası > Programlama > Assembly
  Aktif Konular Aktif Konular
  SSS SSS  Forumu Ara   Kayıt Ol Kayıt Ol  Giriş Giriş


Bir Kod Bir Yorum

 Yanıt Yaz Yanıt Yaz
Yazar
Mesaj
  Konu Arama Konu Arama  Konu Seçenekleri Konu Seçenekleri
StreAmeR Açılır Kutu Gör
Yönetici
Yönetici
Simge

Kayıt Tarihi: 01/Ocak/2006
Konum: İstanbul
Aktif Durum: Aktif Değil
Gönderilenler: 107
  Alıntı StreAmeR Alıntı  Yanıt YazCevapla Mesajın Direkt Linki Konu: Bir Kod Bir Yorum
    Gönderim Zamanı: 09/Nisan/2007 Saat 16:04

; #########################################################################

;              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

Yukarı Dön
 Yanıt Yaz Yanıt Yaz

Forum Atla Forum İzinleri Açılır Kutu Gör

Bulletin Board Software by Web Wiz Forums® version 9.06
Copyright ©2001-2007 Web Wiz

Bu Sayfa 0,188 Saniyede Yüklendi.