--- proc32.inc 2018-06-15 23:40:00.068528567 +0300 +++ proc32.inc 2018-06-15 23:41:19.297105668 +0300 @@ -54,26 +54,45 @@ prologue@proc equ prologuedef -macro prologuedef procname,flag,parmbytes,localbytes,reglist +macro prologuedef procname,flag,parmbytes,localbytes,frameptr,reglist { local loc loc = (localbytes+3) and (not 3) - parmbase@proc equ ebp+8 - localbase@proc equ ebp-loc if parmbytes | localbytes - push ebp - mov ebp,esp + if frameptr eq use + push ebp + mov ebp,esp + end if if localbytes sub esp,loc end if end if - irps reg, reglist \{ push reg \} } + irps reg, reglist \{ push reg \} + match =use,frameptr \{ + parmbase@proc equ ebp+8 + localbase@proc equ ebp-loc + \} + match =omit,frameptr \{ + usesregs equ 0 + irps reg, reglist \\{usesregs equ usesregs+4 \\} + parmbase@proc equ esp+usesregs+loc+4 + localbase@proc equ esp + \} + } epilogue@proc equ epiloguedef -macro epiloguedef procname,flag,parmbytes,localbytes,reglist - { irps reg, reglist \{ reverse pop reg \} - if parmbytes | localbytes - leave +macro epiloguedef procname,flag,parmbytes,localbytes,frameptr,reglist + { local loc + loc = (localbytes+3) and (not 3) + irps reg, reglist \{ reverse pop reg \} + if frameptr eq omit + if localbytes + lea esp,[esp+loc] + end if + else + if parmbytes | localbytes + leave + end if end if if flag and 10000b retn @@ -84,9 +103,10 @@ close@proc equ macro define@proc name,statement - { local params,flag,regs,parmbytes,localbytes,current + { local params,flag,regs,parmbytes,localbytes,current,frameptr if used name name: + frameptr equ use match =stdcall args, statement \{ params equ args flag = 11b \} match =stdcall, statement \{ params equ @@ -97,12 +117,16 @@ flag = 10001b \} match =params, params \{ params equ statement flag = 0 \} + match =omitfp args, params \{ params equ args + frameptr equ omit \} + match =omitfp, params \{ params equ + frameptr equ omit \} match =uses reglist=,args, params \{ regs equ reglist params equ args \} match =regs =uses reglist, regs params \{ regs equ reglist params equ \} match =regs, regs \{ regs equ \} - match prologue:reglist, prologue@proc: \{ prologue name,flag,parmbytes,localbytes,reglist \} + match prologue:reglist, prologue@proc: \{ prologue name,flag,parmbytes,localbytes,frameptr,reglist \} virtual at parmbase@proc match =,args, params \{ defargs@proc args \} match =args@proc args, args@proc params \{ defargs@proc args \} @@ -135,10 +159,10 @@ end virtual \} macro ret operand \{ match any, operand \\{ retn operand \\} - match , operand \\{ match epilogue:reglist, epilogue@proc: \\\{ epilogue name,flag,parmbytes,localbytes,reglist \\\} \\} \} + match , operand \\{ match epilogue:reglist, epilogue@proc: \\\{ epilogue name,flag,parmbytes,localbytes,frameptr,reglist \\\} \\} \} macro finish@proc \{ localbytes = current - match close:reglist, close@proc: \\{ close name,flag,parmbytes,localbytes,reglist \\} + match close:reglist, close@proc: \\{ close name,flag,parmbytes,localbytes,frameptr,reglist \\} end if \} } macro defargs@proc [arg]