The MASM Forum

General => The Campus => Topic started by: gelatine1 on June 15, 2014, 05:36:02 AM

Title: ebp not accesible in the message loop ?
Post by: gelatine1 on June 15, 2014, 05:36:02 AM
I had written this message loop for my window and it crashed somehow.

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
mov eax,uMsg

cmp eax, WM_DESTROY
jnz __cont1
invoke PostQuitMessage,NULL
jmp __cont

__cont1:
cmp eax,WM_KEYDOWN
jnz __cont2

mov eax,wParam
mov ebp,pmem
mov dword ptr [ebp],eax
;irrelevant stuff

jmp __cont

__cont2:
invoke DefWindowProc,hWnd,uMsg,wParam,lParam     ; Default message processing
ret

__cont:
xor eax,eax
ret
WndProc endp


As you can see I change ebp if the user presses a key and this is exactly why the program crashes. In the debugger I saw that ebp already gets used in this message loop so if its altered it crashes ofcourse. But I don't really see why it gets used already so could anyone explain that to me ? I hope I was clear and otherwise ask me for clarification.

thanks in advance,
Jannes
Title: Re: ebp not accesible in the message loop ?
Post by: dedndave on June 15, 2014, 05:49:29 AM
EBP is quite often used as a stack frame Base Pointer

also, WndProc is a call-back process - EBX, EBP, ESI, and EDI should be preserved
and, if you set the direction flag, you should clear it before exiting

the routine may be written without using EBP for a stack frame, but i don't recommend it for beginners
simply preserve EBX, ESI, or EDI and use that, instead
Title: Re: ebp not accesible in the message loop ?
Post by: gelatine1 on June 15, 2014, 06:10:37 AM
Okay, thank you
Title: Re: ebp not accesible in the message loop ?
Post by: MichaelW on June 15, 2014, 06:33:34 AM
EBP is normally used to point to data on the stack. And while EBP and ESP are classified as general-purpose registers, they are specialized in that using them as a base register in a memory operand will cause the default segment selection to use SS instead of DS. This difference will not cause problems in a Win32 app because DS and SS point to the same segment, but would cause problems in a DOS app where SS and DS pointed to different segments.