我正在尝试从我的 C 代码中调用 golang 函数。Golang 不使用标准的 x86_64 调用约定,所以我不得不求助于自己实现转换。由于 gcc 不想将 cdecl 与 x86_64 约定混合使用,我尝试使用内联汇编调用该函数:
void go_func(struct go_String filename, void* key, int error){
void* f_address = (void*)SAVEECDSA;
asm volatile(" sub rsp, 0xe0; \t\n\
mov [rsp+0xe0], rbp; \t\n\
mov [rsp], %0; \t\n\
mov [rsp+0x8], %1; \t\n\
mov [rsp+0x18], %2; \t\n\
call %3; \t\n\
mov rbp, [rsp+0xe0]; \t\n\
add rsp, 0xe0;"
:
: "g"(filename.str), "g"(filename.len), "g"(key), "g"(f_address)
: );
return;
}
可悲的是,编译器总是向我抛出一个我不明白的错误:
./code.c:241: Error: too many memory references for `mov'
这对应于这一行:mov [rsp+0x18], %2; \t\n\如果我删除它,编译工作。我不明白我的错误是什么......
我正在使用 -masm=intel 标志进行编译,因此我使用了 Intel 语法。有人可以帮帮我吗?
手掌心
精慕HU
相关分类