cプロトタイプを使用せずにアセンブリ関数を記述しようとしています。 何らかの理由でgccがグローバルコンテキストで拡張asmを使用できないように見えます。グローバル関数でsparc extended asmを使用する
succssefullyコンパイルし、次のコードを検討してください:次のように私も、ASMを使用してプロトタイプを定義しようとしていた場合
void *g_var;
void foo()
{
asm ("stx %%i7, [%0]"
:"=r" (g_var));
}
を:
asm(".global foo2\n\t"
"foo2:\n\t");
asm ("stx %%i7, [%0]"
:"=r" (g_var));
コンパイラのように私に次のエラーを与えます拡張されたasmはグローバルコンテキストでは使用できません。
foo.c:151:2: error: expected ')' before ':' token :"=r" (return_addr)); ^
次のように私はextened ASMを使用していないとき、コンパイラがコード承認することに注意してください:
asm(".global foo2\n\t"
"foo2:\n\t");
asm("jmpl %o7 + 8, %g0\n\t");
感謝を。 GCC Documentationから
Umm。 *なぜ*あなたはこれをやろうとしていますか? 'foo()'だけで何が問題になっていますか?特に、それをインラインとしてマークした場合。 –
@DavidWohlferd私はこれについても興味がありましたが、x86ではブートローダにとって便利ですが、x86は関数の_naked_属性をサポートしていないためです。彼はたぶん、プロローグとエピローグのコードを避けようとしています。 ARMでは、基本的なインラインアセンブリを含むネイキッド関数を作成できると確信しています。そのコードをバイナリで最初に表示させる必要がある場合、リンカスクリプトはあなたの親友です。 –
@DavidWohlferdそうです、私はプロローグとエピローグコードを避けようとしています。私は[ここ](http://stackoverflow.com/questions/2716884/using-the-naked-attribute-for-functions-in-gcc)に見られるように、sparcのための裸の関数を作成することはできません。私はあなたの提案を正確に理解していませんでしたが、別の方法を見つけました - 私はfoo()がアセンブリコードを生成し、元々は避けたかった部分を単に削除しました(私は明日投稿します)。ありがとう –