 X Ŀ B
 O ͻ P
 R  .    .Ŀ .    *    Ŀ Ŀ   . Ŀ  .    *Ŀ   .     * X
ٺ               .۳                     Ŀ
ͼ   * Ŀ    .    ۳ .    Ŀ۳    .  ڿ۳.     .  ͻ
 . Ŀ ۳  Ŀ     Ŀ.. Ŀ ۳ Ŀ Ŀ.
  ۳۳  ۳* .۳*  ۳ ۳*   ۳. ۳ 
 ٳ ۳Ŀ ڿ   Ŀ  ۳  
*. ٳ ۳۳. Ŀ ۳  ڿ..  
 ۳   . ۳  ۳۳ٳ۳   ۳۳ ۳    
        ۳ ٳ۳ .   ڿ   
 Ŀ*       .  .    *  ۳ *      Ŀ     *  ۳* 
. ۳   .                 ۳       . ۳  .     ۳ 
              .              .              ..
members:       *    .       *  members: .            *     .       members:
 *    beanus   dulek      jaro   massh    mig-21 oxcart  zetx
arakus .  coxoc   hannibal  lobix * mauzer    neo  ._root_  
ٺ
ͻ   .        .           *     .         .           *   ĿĿĿĿ ͼ
Ŀ official URL: http://beanus.provider.pl/     .         ٳ۳۳۳ 
 E  *     on IRC: #crackpl or #cookiecrk  *          .       C
 X ͼ M
 P  P
_____________________________________________________________________________________________
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

                        Win32  Assembly Tutorial(tasm 5.0)
                      
                     "How to make a Win32 Program in Assembly"
                     "Jak napisac program w assemblerze pod WInde"

Ten program jest dla tych co znaju juz asemblera, wznaja API WIn32 i wiedza jak deklaruje sie funkcje i procedury , tyoy i struktury.

Na samym poczatku proponuje zdeklarowac procesor 386,486 albo lepszy

.486 

lub

.486p

Ja wybralem 486, ale Ty mozesz oczywiscie wybrac jaki chcesz.Ddzieku procesorowo definiujesz tylko limity i jakie insturkcje mozesz uzyc.Procesor 386 jest zazwyczaj uzywamy do operacji w trybie chrononinym "pmode" , 486 , 586 maja za to wiecej rozkazow:)

Nastepnie definiujemy model.

.MODEL FLAT, STDCALL

Chcesz defionoiwac model FLAT.to bardzo dobrze powniewaz FLAT jest bardzo latwy w uzyciu.
Rowniez deklaracja standardowych calli pokaze Ci jak windows reaguje na twoje funkcje

Teraz jak uzywac pliku WIN32.INC

INCLUDE WIN32.INC

To wszystko.

Teraz definicja .CODE i .DATA

Oto przyklad.

.486p
.MODEL FLAT, STDCALL
INCLUDE WIN32.INC


.DATA
 
  ; definiowanie zmiennych 

.CODE
 START:   ; poczatek wykonywanego kodu
          
    ; kod


END START ; koniec programu

Wprowadzmy przykladowe zmienne do .DATA

 TitleName   db  'Pierwszy program windowsowy', 0
 ClassName   db  'Program', 0
 Msg  MSGSTRUCT <?>   ; Struktora komunikatu
 WC   WNDCLASS  <?>   ; Classa windowsowa
 hwnd       dd ?      ; Uchwyt do okna
 hInstance  dd ?      ; Handle to Instance ( ??)

Natomiast kod zaczniemy od calla GetModule

PUSH L 0
CALL GetModule
MOV [hInstance], EAX    ;pobranie uchwytu 

Teraz mamy nasz uchwyt  i mozemy zarejstrowac classy

CALL RegClass           ; Register The Class



RegClass PROC
  MOV EAX, [hInstance]
  MOV [WC.clsHInstance], EAX              
  MOV [WC.clsStyle], 0
  MOV [WC.clsLpfnWndProc], OFFSET WndProc
  MOV [WC.clsCbClsExtra], 0
  MOV [WC.clsCbWndExtra], 0

  PUSH L IDI_APPLICATION                  ; Laduj Icone
  PUSH EAX
  CALL LoadIcon

  MOV [WC.clsHIcon], EAX
  MOV [WC.hIconSm], EAX

  PUSH L IDC_ARROW                        ; Laduj kursor
  PUSH L 0 
  CALL LoadCursor

  MOV [WC.clsHCursor], EAX

  PUSH L BLACK_BRUSH
  CALL GetStockObject                     ; Czarne tlo

  MOV [WC.clsHbrBackground], EAX
  MOV [WC.clsLpszMenuName], 0 
  MOV [WC.clsLpszClassName], OFFSET ClassName
 
  PUSH OFFSET WC
  CALL RegisterClass                      ; Zarejstrowanie Okna
   
  RET
ENDP


Potem musimy stworzyc okno

CALL CreateWind            ; Tworzenia okna

NAzwijmy ta procedure CreateWind

CreateWind PROC
  
  PUSH L 0
  PUSH [hInst]
  PUSH L 0
  PUSH L 0
  PUSH L CW_USEDEFAULT
  PUSH L CW_USEDEFAULT 
  PUSH L CW_USEDEFAULT
  PUSH L CW_USEDEFAULT
  PUSH L WS_OVERLAPPEDWINDOW
  PUSH OFFSET TitleName
  PUSH OFFSET ClassName
  PUSH L 0                 ; To sa paramatry dla calla CreateWindowEx , tylko ladowane od tylu                            

  CALL CreateWindowEx      ; Tworzenie okna

  MOV [hwnd], EAX          ; uchwyt okna 
  RET
ENDP

Teraz wykonujemy ShowWindows i UpDate Window

PUSH L SW_SHOW
PUSH [hwnd]
CALL ShowWindow


PUSH [hwnd]
CALL UpdateWindow

To stworzy nam nasze okno i wyswietli na ekranie

Ostatnia mysl , potrzebujemy stworzyc petle (Windows Message Loop)

Pseudo Kod:

Czekanie na wiadomosc
Jezeli jest wiadomosc pobierz ja
Jezeli wiadmomosc jest wyjsciem wyjdz :)
Przetworz wiadomosc
Wysli ta wiadomosc do okna
Wroc i czekaj na nastepna wiadomosc
Wyjscie



MessageLoop:
  PUSH L 0
  PUSH L 0
  PUSH L 0
  PUSH OFFSET Msg 
  CALL GetMessage       ; Pobierz wiadomosc

  TEST EAX, EAX         ; Koniec?
  JZ SHORT EndProgram

  PUSH OFFSET Msg
  CALL TranslateMessage ; translacja wiadomosci

  PUSH OFFSET Msg
  CALL DispatchMessage  ; Wyswietl wiadomosc

  JMP SHORT MessageLoop  

EndProgram:
  
  PUSH [Msg.wParam]
  CALL ExitProcess      ; koniec programu

Oto program

.486p
.MODEL FLAT, STDCALL
INCLUDE WIN32.INC


.DATA
 
 Msg  MSGSTRUCT <?>   ; The Message Struct
 WC   WNDCLASS  <?>   ; The Windows Class
 hwnd       dd ?      ; Handle to Window
 hInstance  dd ?      ; Handle to Instance



.CODE
 START:   ;poczatek kodu

  PUSH L 0  
  CALL GetModule
  MOV [hInstance], EAX    ; Get The Instance

  CALL RegClass           ; Register The Class(rejstrowanie Class)
  CALL CreateWind         ; Create The Window(tworzenie okna)

  PUSH L SW_SHOWNORMAL
  PUSH [hwnd]
  CALL ShowWindow         ; Show Window (pokaz okno)

  PUSH [hwnd]
  CALL UpdateWindow       ; Update The Window(zrob update okna) :)))

  MessageLoop:
    PUSH L 0
    PUSH L 0
    PUSH L 0
    PUSH OFFSET Msg 
    CALL GetMessage       ; Call To GetMessage(pobierz wiadomosc)

    TEST EAX, EAX         ; Quit Loop?(czy juz koniec)
    JZ SHORT EndProgram

    PUSH OFFSET Msg
    CALL TranslateMessage ; Translate Message(zamien wiadomosc)

    PUSH OFFSET Msg
    CALL DispatchMessage        ; Dispatch Message(wyswietla wiadomosc)

    JMP SHORT MessageLoop  

  EndProgram:
  
  PUSH [Msg.wParam]
  CALL ExitProcess      ; End Program(koniec programu)

; END OF WinMain.

END START  ; End of File.(koniec pliku)


ExitProcess zatrzyma program 

Teraz dodajmy obsluge bledow do programu.

  CALL RegClass           ; Register The Class(rejstrowanie Class)
  CALL CreateWind         ; Create The Window (tworzenie okna)

To sa dwie procedury, ktore maja kod powrotu z bledem(ale glupio brzmi).jezeli EAX =0 to jest koniec :)

  CALL RegClass           ; Register The Class(rejstrowanie Class)

  TEST EAX, EAX           ; Check Window Register Error(sprawdzanie czy ok?)
  JNZ  SHORT  NO_ERROR    

  PUSH L 0
  CALL ExitProcess        ; Exit(wyjscie)

NO_ERROR:
  CALL CreateWind         ; Create The Window(tworz okno)

  TEST EAX, EAX           ; Check Window Creation Error(sprawdzanie czy sa bledy przy tworzeniu okna)
  JNZ SHORT WINDOW_CREATED

  PUSH L 0
  CALL ExitProcess        ; Exit(koniec)

WINDOW_CREATED:

Wiec zrobmy to w naszym WIN32.INC

 FALSE equ <0>
 TRUE  equ <1>

W programie bedzie tak:

 PUSH L FALSE
lub

 PUSH L TRUE

dwa paraametry.

Teraz  zdefiniujmy powroty naszej funkcji z naszych okien.

WndProc PROC USES EBX EDI ESI, hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD

 ; KOD

ENDP

Sprawdz czy WM_messages sa zdefiniowane w twoim WIN32.INC


 MOV EAX, [Msg]

 CMP EAX, WM_CREATE     ; sprawdzenie bledu??
 JE W_CREATE

 PUSH [lParam]
 PUSH [wParam]
 PUSH [Msg]
 PUSH [hwnd]
 CALL DefWindowProc     ; Default
 RET

W_CREATE:               ; WM_CREATE Message

   ; KOD

XOR EAX, EAX
RET
_____________________________________________________________________________________________
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

To wszystko ...
tlumaczone raczej nieudolnie z _Secret/Scrat
http://www.nauticom.net/www/secret
programming@teo.nauticom.net

bEANUS CookieCrK