; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
comment * -------------------------------------------------------------
This example is written in pure Intel mnemonics to demonstrate that
Pelle's Macro Assembler can build code at the lowest level possible
Build this example from the PROJECT menu with MAKEIT.BAT
----------------------------------------------------------------- *
.486
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive
include poasm1k.inc ; local includes for this file
.code
szClassName db "POASM 1k", 0
start:
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
push ebp ; Entiendo que mete ebp en la pila, pero si te fijas al final nunca lo saca
;a menos que leave lo haga , pero no lo se
mov ebp, esp
sub esp, 96 ; Aqui no entiendo porque reserva 96 bytes, sume la estructura
;mas los 4 argumentos DWORD de WndProc y da son 76
xor edi, edi
mov esi, 400000h ; use constant for the hInstance
;No entiendo porque usa una constante y no obtiene el manipulador
;de instancia. Tampoco pense que funcionara así(Ya eso es de la api, esta fuera de tema).
mov ebx, OFFSET szClassName ;Quien no entende esto :D
push IDC_ARROW
push edi
call LoadCursor ;Entiendo las rutinas de llamada
; -----------------------------------
; manually coded WNDCLASSEX structure ;No es hermosa esta parte del código
; ----------------------------------- ;casi poesía *.* xD
;Esta parte mas o menos la entiendo
mov DWORD PTR [ebp-96], 48 ;Le asigna a esa pos de memoria el tamaño de la estructura
mov DWORD PTR [ebp-92], CS_VREDRAW or CS_HREDRAW ;De aqui hacia abajo va llenando la estructura
mov DWORD PTR [ebp-88], OFFSET MyWndProc
mov DWORD PTR [ebp-84], edi
mov DWORD PTR [ebp-80], edi
mov DWORD PTR [ebp-76], esi
mov DWORD PTR [ebp-72], edi
mov DWORD PTR [ebp-68], eax
mov DWORD PTR [ebp-64], COLOR_BTNFACE+1
mov DWORD PTR [ebp-60], edi
mov DWORD PTR [ebp-56], ebx
mov DWORD PTR [ebp-52], edi
lea eax, [ebp-96] ;Mueve a eax la dirección de la estructura
push eax
call RegisterClassEx ; register the window class
mov ecx, CW_USEDEFAULT
push edi
push esi
push edi
push edi
push edi
push ecx
push edi
push ecx
push WS_OVERLAPPEDWINDOW
push ebx
push ebx
push edi
call CreateWindowEx ; create the main window
push SW_SHOWNORMAL
push eax
call ShowWindow ; display it
lea ebx, [ebp-48] ; Carga en ebx la dirección de inicio
;de la estructura MSG
jmp jmpin
StartLoop:
push ebx
call DispatchMessage
jmpin:
push edi
push edi
push edi
push ebx
call GetMessage ; process messages until
; GetMessage returns zero
test al, al
jnz StartLoop
leave ; exit the stack frame
retn ; make a NEAR return
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
MyWndProc:
push ebp ; Otra vez lo mismo con ebp desde el principio
mov ebp, esp ; No entiendo como esp apunta a la dirección de las variables pasadas al WndProc
cmp DWORD PTR [ebp+12], WM_DESTROY
jne @F
push NULL
call PostQuitMessage
@@:
push DWORD PTR [ebp+20]
push DWORD PTR [ebp+16]
push DWORD PTR [ebp+12]
push DWORD PTR [ebp+8] ;Aqui no entiendo porque hWnd apunta deste 8, que hay de primero entonces
;No debería apuntar desde el byte 0
;Ha y no entiendo porque aqui es ebp+direccion y arriba es ebp-direccion
call DefWindowProc
leave ; exit the stack frame
ret 16 ; balance stack on exit
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
end start