用于调用函数的x86程序集宏(带参数)

时间:2017-06-24 13:17:25

标签: c gcc assembly macros

我试图编写一个调用带参数的函数的宏(在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:错误:位置参数太多

1 个答案:

答案 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