2013-11-04 41 views
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 =英特尔call.c无法调用FSEEK与内联汇编

call.c:(.text+0x2c): undefined reference to `f' 
call.c:(.text+0x31): undefined reference to `fseek' 

我一直在尝试使用AT/T语法,但得到了同样的结果。

回答

0

那么你可以不写这样的,因为没有被授权者该符号f将存在于生成的汇编 - 它只是在C.

一个符号的解决方案是使用GCC's extended asm syntax。例如,push f可以rewrited到这一点:

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 */); 
+1

这第二个'asm'是不对的,因为调用函数将痛殴至少调用者保存寄存器。 – gsg