无法使用内联汇编调用fseek

时间:2013-11-04 04:38:55

标签: gcc inline-assembly

#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语法,但结果相同。

1 个答案:

答案 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 */);