2013-11-04 108 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