2016-04-22 6 views
2

簡単な質問です。 Cのasm関数は、コード内でインラインアセンブリを行うために使用されます。しかし、それは何を返すのですか?従来のeaxですか、そうでない場合は何を返しますか?__asm {};を実行します。 eaxの値を返しますか?

+3

それはコンパイラに依存しますが、私の知る限り、それは関数ではありません、それは何かを返すので、 'I = __asm__をint型はありません() 'は無効な構造体です – myaut

+3

どのコンパイラ?どのプロセッサですか?ほとんどのプロセッサにはeaxレジスタがありません。 – atturri

+1

真。それは、ビジュアルスタジオコンパイラ(それがどちらか分かりません)と32ビットのインテルプロセッサを想定しています。 – Delupara

答えて

3

__asm__自体は値を返しません。 C標準では、__asm__が戻り値をどのように処理するかを定義していないため、コンパイラ間で動作が異なる場合があります。 Visual Studioの例は有効ですが、Visual Studioは__asmを使用しています。 __asm__は、少なくともGCCによって使用されます。 Cプログラムで結果を得るために

のVisual Studio

、あなたはアセンブリコードでeaxに戻り値を配置し、関数から返す必要があります。呼び出し元は戻り値としてeaxの内容を受け取ります。

Visual Studio 2015 documentation

int power2(int num, int power) 
{ 
    __asm 
    { 
     mov eax, num ; Get first argument 
     mov ecx, power ; Get second argument 
     shl eax, cl  ; EAX = EAX * (2 to the power of CL) 
    } 
    // Return with result in EAX 
} 

GCC

GCC inline assembly HOWTO同様の例が含まれていません。これはおそらく、Visual Studioのように暗黙のリターンを使用できないことを意味します。しかし、HOWTOでは、アセンブリブロック内のC変数に結果を格納し、アセンブリブロックが終了した後にその変数の値を返すことができることを示しています。 destの値を返す

文字列のコピー機能の例、:

static inline char * strcpy(char * dest,const char *src) 
{ 
int d0, d1, d2; 
__asm__ __volatile__( "1:\tlodsb\n\t" 
         "stosb\n\t" 
         "testb %%al,%%al\n\t" 
         "jne 1b" 
        : "=&S" (d0), "=&D" (d1), "=&a" (d2) 
        : "0" (src),"1" (dest) 
        : "memory"); 
return dest; 
} 
2

ほとんどありません。 J3の実装定義行動下C99仕様、あたり:

asmキーワードは に直接トランスレータ出力(6.8)をアセンブリ言語を挿入するために使用されてもよいです。最も一般的な実装は、フォームの声明を経由する:

asm (character-string-literal);

だから、実装の両方が翻訳出力にアセンブリ言語を挿入し、また、生成したアプローチを思い付くしようとしているとは考えにくいのです戻り値として特定のレジスタを結ぶ追加の中間リンクコード。

これは機能ではなく、キーワードです。

など。 GCCは"=r"型制約のセマンティクスを使用して、アセンブリ内で変数への書き込みアクセスを許可します。しかし、あなたは結果が正しい場所に確実に終わるようにします。

関連する問題