#include "stdio.h"
void fseek(void *, int, int);
main () {
FILE* f = fopen("myfile", "rb");
asm("push 2");
asm("push 0");
asm("push f");
asm("call fseek");
asm("add esp, 12");
}
gcc -masm = intel call.c
call.c:(.text+0x2c): undefined reference to `f'
call.c:(.text+0x31): undefined reference to `fseek'
我一直在尝试使用AT / T语法,但结果相同。
答案 0 :(得分:0)
嗯,你不能这样写,因为生成的程序集中不存在符号f
的被授予者 - 它只是C中的符号。
解决方案是使用GCC's extended asm syntax。例如,push f
可以重写为:
asm volatile ("pushl %0"
: /* no output operands */
: "m" (f)
: /* no clobbered operands */);
对于函数调用fseek
,我相信你的代码应该没问题(至少在我的经验和我的笔记本电脑上它现在可以工作)。你的平台信息是什么?你有glibc
或类似的东西提供C的标准库吗?
另请注意您使用的是fseek
的奇怪声明,因为它至少应具有符合C规范的返回值。
仅为了您的信息,您可以尝试这种间接调用方式:
asm volatile ("call *%0"
: /* no output operands */
: "r"(fseek)
: /* no clobbered operands */);