Hello
I recently change my workspace from ObjAsm32+Masm32 to UAsm+Objasm_C1.1
Perhaps there is a problem with VARARG option in 'StaticMethod' macro,
or I am wrong.
I change register ecx to register eax for total number of passed arguments
but trying:
StaticMethod xTrace , dword, PSTRING, ?
OCall xTrace, TRACE_TJS, Addr szHdr1, Addr szVersion ; (1)
OCall xTrace, TRACE_TJS, Addr szHdr2 ; (2)
OCall xTrace, TRACE_TJS, Addr szHdr3, Addr [esi].szDate, Addr [esi].szHeure ; (3)
...
...
Method TestParams.xTrace, uses esi edi, dNiv:dword, pMask:PSTRING, args:VARARG
...
MethodEnd
On return, esp register is wrong.
On (1) <<<OCall xTrace, TRACE_TJS, Addr szHdr1, Addr szVersion>>>
Address Hex dump Command Comments
006917F1 |. 68 30806900 PUSH OFFSET _szVersion ; UNICODE "2.0.0"
006917F6 |. 68 08816900 PUSH OFFSET _szHdr1 ; UNICODE "TestParams Version %s "
006917FB |. 68 00000000 PUSH 0
00691800 |. FF75 08 PUSH DWORD PTR SS:[EBP+8]
00691803 |. B8 03000000 MOV EAX,3
00691808 |. E8 4F010000 CALL _OA_TestParams_xTrace
0069180D |. 83C4 10 ADD ESP,10
Ok: the last instruction remove four parameters from stack
On (2) <<<OCall xTrace, TRACE_TJS, Addr szHdr2>>>
00691810 |. 68 6C816900 PUSH OFFSET _szHdr2
00691815 |. 68 00000000 PUSH 0
0069181A |. FF75 08 PUSH DWORD PTR SS:[EBP+8]
0069181D |. B8 02000000 MOV EAX,2
00691822 |. E8 35010000 CALL _OA_TestParams_xTrace
Not ok: there is no instruction to remove parameters from stack !!!
On (2) <<<OCall xTrace, TRACE_TJS, Addr szHdr3, Addr [esi].szDate, Addr [esi].szHeure>>>
00691827 |. 8D46 40 LEA EAX,[ESI+40]
0069182A |. 50 PUSH EAX
0069182B |. 8D46 20 LEA EAX,[ESI+20]
0069182E |. 50 PUSH EAX
0069182F |. 68 B0816900 PUSH OFFSET _szHdr3
00691834 |. 68 00000000 PUSH 0
00691839 |. FF75 08 PUSH DWORD PTR SS:[EBP+8]
0069183C |. B8 04000000 MOV EAX,4
00691841 |. E8 16010000 CALL _OA_TestParams_xTrace
00691846 |. 83C4 14 ADD ESP,14
Ok: the last instruction remove five parameters from stack
I am using Objects macro:
; ==================================================================================================
; Title: Objects.inc
; Author: G. Friedrich
; Version: C.1.4
; Purpose: ObjAsm object support using MASM compatible assembers (UASM, ASMC, JWASM, ML)
; Notes: Version C.1.0, October 2017
; - First release.
; Version C.1.1, September 2019
; - Method "uses": skip 64 bit registers in 32 bit mode.
; - Undefined symbol warning added in $PushMethodArgs.
; Version C.1.2, December 2020
; - $MethodAddr can handle addresses of embedded objects.
; Version C.1.3, May 2021
; - VARARG stack correction bug corrected.
; - dup spacing issue coorected.
; Version C.1.4, August 2022
; - Mitigation measures against multiple inclusion of object definition files.
; ==================================================================================================
What is wrong?
Changing line 2676 in this macro from
%exitm <@WordSize*(??ParamCount + ArgCount + 1)> ;;Return number of bytes to remove
to
%exitm <@WordSize*(??ParamCount + 1)> ;;Return number of bytes to remove @FB
this seems to solve the problem.