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

function call に関しては、fseekあなたのコードは問題ないと思います(少なくとも私の経験では、私のラップトップでは今のところ動作します)。プラットフォーム情報は?glibcC の標準ライブラリを提供する、または類似のものはありますか? また、少なくとも C 仕様に従って戻り値を持つ必要があるため
、奇妙な宣言を使用していることに注意してください。fseek

参考までに、次のスタイルの間接呼び出しを試してみてください。

asm volatile ("call *%0" 
               : /* no output operands */
               : "r"(fseek)
               : /* no clobbered operands */);
于 2013-11-04T05:06:22.767 に答える