簡単な質問です。 Cのasm
関数は、コード内でインラインアセンブリを行うために使用されます。しかし、それは何を返すのですか?従来のeax
ですか、そうでない場合は何を返しますか?__asm {};を実行します。 eaxの値を返しますか?
答えて
__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;
}
ほとんどありません。 J3の実装定義行動下C99仕様、あたり:
asmキーワードは に直接トランスレータ出力(6.8)をアセンブリ言語を挿入するために使用されてもよいです。最も一般的な実装は、フォームの声明を経由する:
asm (character-string-literal);
だから、実装の両方が翻訳出力にアセンブリ言語を挿入し、また、生成したアプローチを思い付くしようとしているとは考えにくいのです戻り値として特定のレジスタを結ぶ追加の中間リンクコード。
これは機能ではなく、キーワードです。
など。 GCCは"=r"
型制約のセマンティクスを使用して、アセンブリ内で変数への書き込みアクセスを許可します。しかし、あなたは結果が正しい場所に確実に終わるようにします。
- 1. mov eaxを実行するとどうなりますか?
- 2. C++で__asmを使用してshort型の変数をEAXに移動する(VS 2010)
- 3. javascript関数から値を返し、その中でコードを実行します
- 4. Visual Studioで__asmを使用してフローティングスタックにdoubleを返す
- 5. __asmブロックの外部から__asm変数にアクセスできますか?
- 6. Subsonic 3 - どのように値を返すストアドプロシージャを実行しますか?
- 7. 1列のPython/Pandasで値の数を実行しますが、複数の列に値を返します
- 8. HTTPフォーム解析の実行 - 空のスライス/空の値を返しますか?
- 9. なぜGCCはmov%eax、%eaxを生成しましたか?それはどういう意味ですか?
- 10. PhanthomJS、スクリプトを実行し、JからCへの値を返す#
- 11. getTextは値を返しませんが、setValueを実行するとオブジェクトオブジェクトを返します
- 12. PHP:スクリプト実行を終了せずに値を返しますか?
- 13. 動的PL/SQLブロックを実行して合計を実行し、値を返す
- 14. jquery keypressは各ループを繰り返し実行しますか?
- 15. toggleGroupから実際の値を返します。javafx
- 16. ブール値が1つしかない行を返します
- 17. ループを実行して15より大きい値を返します
- 18. AppEngineの部分実行を繰り返してhttp.handlerを実行します
- 19. 「movl(%esi、%ecx、4)、eax」は何を意味しますか?
- 20. movl(%eax、%edx、4)、%ecx命令は何をしますか?
- 21. 関数が実行され、その関数がFalseを返すまでループ上の値を返します。 - Python
- 22. 実行C++を実行しますか?
- 23. 列内の値の行を繰り返しますか?
- 24. "foreach"はLinqの実行を繰り返しますか?
- 25. アプレットの値を返しますか?
- 26. エリクシルの値を返しますか?
- 27. VisualTreeHelper.GetChildrenCountはMainPage_Loadedから実行すると0を返します
- 28. 数値の行列を返しますか?
- 29. 最後の繰り返しのwhileループチェックを実行します
- 30. オペランドタイプエラーが正しくありません。__asm
それはコンパイラに依存しますが、私の知る限り、それは関数ではありません、それは何かを返すので、 'I = __asm__をint型はありません() 'は無効な構造体です – myaut
どのコンパイラ?どのプロセッサですか?ほとんどのプロセッサにはeaxレジスタがありません。 – atturri
真。それは、ビジュアルスタジオコンパイラ(それがどちらか分かりません)と32ビットのインテルプロセッサを想定しています。 – Delupara