0
#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 语法,但得到了相同的结果。

4

1 回答 1

0

好吧,您不能这样写,因为f在生成的程序集中不存在该符号的被授权者——它只是 C 中的一个符号。

解决方案是使用GCC 的扩展 asm 语法。例如,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 */);
于 2013-11-04T05:06:22.767 回答