Due to this thread (http://masm32.com/board/index.php?topic=5849.0) - for work with probing stack algo, use enter and leave instructions, is need to have in assembler sets own macro names, as NONE, PrologueDef and EpilogueDef - with some sequence of parameters, that to implement and automatically insert this macros to each procedure seen this options :eusa_boohoo:
Hi Adamanteus,
Reading the section User-defined prologue and epilogue macro (IA32) [8.00] in Pelle's manual, you can construct your macros. Attached is a 32-bit HJWasm example.
include testfunc.inc
CustomPrologue MACRO procname, flags, parambytes, localbytes, reglist, userparms:VARARG
echo Procedure name = procname
echo Flag = flags
echo Byte count = parambytes
echo Number of locals = localbytes
echo Registers = reglist
echo Macro arguments = userparms
IF localbytes GT 0
push ebp
mov ebp,esp
sub esp,localbytes
ELSEIF parambytes GT 0
push ebp
mov ebp,esp
ELSEIFNB <userparms>
IF @InStr(1,<userparms>,<FORCEFRAME>)
push ebp
mov ebp, esp
ENDIF
ENDIF
IFNB <reglist>
FOR reg,reglist
push reg
ENDM
ENDIF
EXITM <localbytes>
ENDM
CustomEpilogue MACRO procname, flags, parambytes, localbytes, reglist, userparms:VARARG
echo
echo
echo Procedure name = procname
echo Flag = flags
echo Byte count = parambytes
echo Number of locals = localbytes
echo Registers = reglist
echo Macro arguments = userparms
IFNB <reglist>
FOR reg,reglist
pop reg
ENDM
ENDIF
IF (parambytes GT 0) OR (localbytes GT 0)
mov esp,ebp
pop ebp
ELSEIFNB <userparms>
IF @InStr(1,<userparms>,<FORCEFRAME>)
mov esp,ebp
pop ebp
ENDIF
ENDIF
IF (flags AND 10h) OR (parambytes EQ 0)
ret ; retn - Poasm
ELSE
ret parambytes ; retn - Poasm
ENDIF
ENDM
.data
msg db 'This is a test',0
capt db 'Hello',0
.code
start:
invoke testfunc,ADDR msg,ADDR capt
invoke ExitProcess,0
OPTION PROLOGUE:CustomPrologue
OPTION EPILOGUE:CustomEpilogue
testfunc PROC <abc> USES esi edi ebx message:DWORD,caption:DWORD
LOCAL a:DWORD
LOCAL x:DWORD
LOCAL y:DWORD
LOCAL z:DWORD
lea eax,a
lea eax,x
lea eax,y
lea eax,z
mov y,100
invoke MessageBox,0,message,caption,MB_OK
mov eax,y
ret
testfunc ENDP
OPTION PROLOGUE:PROLOGUEDEF
OPTION EPILOGUE:EPILOGUEDEF
END start
I hear about such type of macros, but example not found - thanks, Vortex !
And my variant, that looks for 32-bit HJWasm most universal, with few conditions :
IF 0 ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
Build this template with "CONSOLE ASSEMBLE AND LINK"
ENDIF ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
__UNICODE__ equ 1
EL_NESTED equ 0
EL_PROC equ 1
IF EL_PROC
EL_PROLOGUE equ 1
EL_EPILOGUE equ 1
ELSE
EL_CHKSTK equ 1
ENDIF
include masm32rt.inc
CustomPrologue MACRO procname, flags, parambytes, localbytes, reglist, userparms : VARARG
if 0
echo Procedure name = procname
echo Flag = flags
echo Byte count = parambytes
echo Number of locals = localbytes
echo Registers = reglist
echo Macro arguments = userparms
endif
IF localbytes GT 0
IF EL_PROLOGUE
ENTER localbytes, EL_NESTED
ELSE
PUSH EBP
MOV EBP, ESP
IF EL_CHKSTK
IF @InStr(1, userparms, <CLEARFRAME>) eq 0
MOV EAX, localbytes + TYPE EBP + TYPE EAX
CALL __chkstk
ENDIF
ELSE
SUB ESP, localbytes
ENDIF
ENDIF
ELSEIF parambytes GT 0
IF EL_PROLOGUE
ENTER 0, EL_NESTED
ELSE
PUSH EBP
MOV EBP, ESP
ENDIF
ELSEIFNB <userparms>
IF @InStr(1, userparms, <FORCEFRAME>)
IF EL_PROLOGUE
ENTER 0, EL_NESTED
ELSE
PUSH EBP
MOV EBP, ESP
ENDIF
ENDIF
ENDIF
IFNB <reglist>
FOR reg, reglist
PUSH reg
ENDM
ENDIF
EXITM <localbytes>
ENDM
CustomEpilogue MACRO procname, flags, parambytes, localbytes, reglist, userparms : VARARG
IFNB <reglist>
FOR reg,reglist
POP reg
ENDM
ENDIF
IF (parambytes GT 0) OR (localbytes GT 0)
IF EL_EPILOGUE
LEAVE
ELSE
MOV ESP, EBP
POP EBP
ENDIF
ELSEIFNB <userparms>
IF @InStr(1, userparms, <FORCEFRAME>)
IF EL_EPILOGUE
LEAVE
ELSE
MOV ESP, EBP
POP EBP
ENDIF
ENDIF
ENDIF
IF (flags AND 10h) OR (parambytes EQ 0)
RET
ELSE
RET parambytes
ENDIF
ENDM
.data
STRING msg, "that is test"
STRING capt, "Hello,"
.code
__chkstk PROTO SYSCALL
OPTION PROLOGUE:CustomPrologue
OPTION EPILOGUE:CustomEpilogue
testfunc PROC <abc> USES esi edi ebx message : DWORD, caption : DWORD
LOCAL a:DWORD
LOCAL x:DWORD
LOCAL y:DWORD
LOCAL z:DWORD
lea eax,a
lea eax,x
lea eax,y
lea eax,z
mov y,100
print caption
print " "
print message
print " ", 21h, 13, 10
mov eax,y
ret
testfunc ENDP
OPTION PROLOGUE:PrologueDef
OPTION EPILOGUE:EpilogueDef
start:
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
call main
inkey
exit
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
main proc
cls
invoke testfunc, addr msg, addr capt
ret
main endp
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
end start