Author Topic: Option prologue/epilogue macro  (Read 2159 times)

Adamanteus

  • Member
  • **
  • Posts: 214
    • LLC "AMS"
Option prologue/epilogue macro
« on: December 09, 2016, 01:07:10 AM »
 Due to this thread - 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:
« Last Edit: December 09, 2016, 07:53:48 AM by Adamanteus »

Vortex

  • Member
  • *****
  • Posts: 2084
Re: Option prologue/epilogue macro
« Reply #1 on: December 09, 2016, 05:17:04 AM »
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.

Code: [Select]
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

Adamanteus

  • Member
  • **
  • Posts: 214
    • LLC "AMS"
Re: Option prologue/epilogue macro
« Reply #2 on: December 09, 2016, 08:01:15 AM »
  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 :
Code: [Select]
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
« Last Edit: December 11, 2016, 01:41:14 AM by Adamanteus »