2016-11-23 6 views
1

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から

+2

Umm。 *なぜ*あなたはこれをやろうとしていますか? 'foo()'だけで何が問題になっていますか?特に、それをインラインとしてマークした場合。 –

+0

@DavidWohlferd私はこれについても興味がありましたが、x86ではブートローダにとって便利ですが、x86は関数の_naked_属性をサポートしていないためです。彼はたぶん、プロローグとエピローグのコードを避けようとしています。 ARMでは、基本的なインラインアセンブリを含むネイキッド関数を作成できると確信しています。そのコードをバイナリで最初に表示させる必要がある場合、リンカスクリプトはあなたの親友です。 –

+0

@DavidWohlferdそうです、私はプロローグとエピローグコードを避けようとしています。私は[ここ](http://stackoverflow.com/questions/2716884/using-the-naked-attribute-for-functions-in-gcc)に見られるように、sparcのための裸の関数を作成することはできません。私はあなたの提案を正確に理解していませんでしたが、別の方法を見つけました - 私はfoo()がアセンブリコードを生成し、元々は避けたかった部分を単に削除しました(私は明日投稿します)。ありがとう –

答えて

4

Note that extended asm statements must be inside a function. Only basic asm may be outside functions (see Basic Asm). Functions declared with the naked attribute also require basic asm (see Function Attributes).

だからあなたの質問への答えがあることである - いいえ、グローバルな文脈で関数の外の拡張アセンブラのテンプレートを使用することはできません。あなたが見つけたので、基本的なアセンブラ文が許可されています。

関連する問題