4

インラインアセンブリの学習を開始することにしましたが、明確な答えを見つけることができない簡単な質問が残っています。

簡単な追加を実行するチュートリアルで見つけた次の簡単な例を見てください。

int one,two,out;

one = 1;
two = 2;

__asm__ ( "add eax, ebx;" : "=a" (out) : "a" (one) , "b" (two) );

しばらくの間 intel 構文を使用した後、私自身の正気を保つために、AT&T の代わりに intel 構文を使用するように GCC を構成したことに注意してください。

ここで、"out" 変数を省略して、代わりに出力を "one" (または重要な場合は "two") に格納するとします。

どうすればいいですか?

4

2 に答える 2

5

使用する

 __asm__ __volatile__(" add %0, %2": "=r" (one): "0"(one), "r" (two) )

"=r" と "r" を使用することで、コンパイラに特定のレジスタを不必要に使用させることがなくなり、レジスタの割り当てが容易になります。"0" は "(出力) 引数 0 と同じものを使用する" ことを意味します。

Edit3:two引数は%2ではなく にあり、これは( と同じレジスタ)%1の 2 番目のコピーにすぎません。また、シングルを使用する必要があるときにダブルを修正しました。one%0%

Edit2:__volatile__コンパイラがアセンブラコードを移動または省略しないようにするためにも追加しました。これは、コンパイラがコードが有用であると判断しない場合に発生する可能性があります[通常、コンパイラが後で使用する出力を生成しないため]. コンパイラを使用__volatile__すると、アセンブラ コードを移動または削除しないことが保証されます。

Edit1: 構文を修正します。

于 2013-04-13T23:14:04.837 に答える
3
__asm__ ( "add eax, ebx;" 
            : "+a" (one) 
            : "b" (two) );

"+"修飾子は、「読み取り/書き込み」オペランドを示します (出力制約で使用する必要があります) 。

于 2013-04-13T23:27:04.193 に答える