"option zerolocals : 1" should (at least to my understanding) initialize all locals of a procedure to zero, but it doesn´t
32 bit code for UASM:
...
include windows.inc
includelib kernel32.lib
includelib user32.lib
option ZEROLOCALS : 1
.data
MsgCaption db "Test",0
MsgBoxText db "works",0
.code
start proc
;***************************************************************************
;
;***************************************************************************
local n :dword
LOCAL rct :RECT ;is created on the stack
int 3
mov eax, rct.left
mov rct.left, 1
;int 3 ;at this point i would expect EAX to be zero
mov eax, rct.left
mov ebx, n ;at this point EAX = 1, which is expected
invoke MessageBox, NULL, addr MsgBoxText, addr MsgCaption, MB_OK
invoke ExitProcess, NULL
ret
start endp
end start
;*************************************************************************************
; code generated
;*************************************************************************************
;00081000 <Mod> 55 PUSH EBP
;00081001 8BEC MOV EBP, ESP
;00081003 83C4 EC ADD ESP, -14
;00081006 CC INT3
;00081007 8B45 EC MOV EAX, DWORD PTR SS:[EBP-14]
;0008100A C745 EC 01000000 MOV DWORD PTR SS:[EBP-14], 1
;00081011 8B45 EC MOV EAX, DWORD PTR SS:[EBP-14]
;00081014 8B5D FC MOV EBX, DWORD PTR SS:[EBP-4]
;00081017 6A 00 PUSH 0
;00081019 68 00300800 PUSH Sample2.00083000 ; ASCII "Test"
;0008101E 68 05300800 PUSH Sample2.00083005 ; ASCII "works"
;00081023 6A 00 PUSH 0
;00081025 FF15 08200800 CALL DWORD PTR DS:[<&USER32.MessageBoxA>] ; USER32.MessageBoxA
;0008102B 6A 00 PUSH 0
;0008102D FF15 00200800 CALL DWORD PTR DS:[<&KERNEL32.ExitProcess>] ; kernel32.ExitProcess
;00081033 8BE5 MOV ESP, EBP
;00081035 5D POP EBP
;00081036 C3 RETN
The generated code doesn´t change regardless of the actual setting of "option zerolocals" (0 or 1), stepping through the code shows, that (in my case) rect.left is 0x48 (not zero). The reserved stack space for locals isn´t cleared (set to zero).
What am i doing wrong?
Thanks
JK