我试图编写一个调用带参数的函数的宏(在x86程序集中)。可变数量的参数,即。函数是第一个宏参数,函数参数是第二个宏参数。
换句话说,INVOKE foo, 1, 2, 3
应扩展为( stdcall 约定):
推送参数
调用foo
清理堆栈
我认为irp
应该这样做,并写下以下内容:
.intel_syntax noprefix
.arch i386
.data
if: .asciz "%i\n"
.text
.macro INVOKE func, argList
.irp arg,<argList>
push \arg
.endr
call \func
.irp arg,<argList>
add esp, 4
.endr
.endm
对于测试:
.globl main
.extern foo
main:
INVOKE foo, 1, 5, 10, 15
push eax
push offset if
call printf
ret
.end
使用单独的c文件foo
:
int foo(int a, int b, int c, int d) {
return a + b + c + d;
}
但是,使用GCC编译(使用GCC):
gcc filename.s filename.c -o filename.out
产生以下消息:
filename.s:汇编程序消息:
filename.s:21:错误:位置参数太多
答案 0 :(得分:3)
正确的语法是:
.macro INVOKE func, argList:vararg
.irp arg, \argList
push \arg
.endr
call \func
.irp arg, \argList
add esp, 4
.endr
.endm
请注意,push
的参数应该相反。另外,理想情况下,您只会发出一个add esp
。
PS:这不是stdcall
,而是cdecl
。