Re: Como usar la pila.

Iniciado por TheEnmanuelRmrz, 19 Octubre 2014, 06:08 AM

0 Miembros y 1 Visitante están viendo este tema.

TheEnmanuelRmrz

Saludos gracias por contestar. Lo del ring 0-3 si lo entiendo.
Mira te pondré un ejemplo y sería de mucha ayuda si me lo explicaras pondré las dudas al lado de lo que entiendo.
El ejemplo lo saque del paquete de MASM32 y se puede ensamblar tanto en POASM como en MASM también.
Todo lo que hace lo se hacer con variables y eso, pero me gustaría mucho comprender este por completo.

Ha no le hagas caso a la declaración de los datos en un solo segmento es solo un ejemplo de como gastar 1kb
Código (asm) [Seleccionar]


; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

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



Eso más que todo es las partes que no entiendo agradezco tu ayuda.