2

でいくつか理解しようとしてassembly codeAT&T syntaxます。

ここにスニペットがあります:

"mov %eax, %ebx; "\
"mov %eax, %ecx;"\
"fxch %st(1);"\

そこからわかったのがこれ。

movコピー (私は正しいですか?それとも移動しますか?) からへsource registerのデータdestination register

インラインone:で、データをレジストリeaxからにコピーしますebx

同様に、データをレジストリeaxからにコピーしますecx

しかし、私が理解できなかったのは次のことです。どのように機能しfxchますか?ここに例を示すリンクがあります。

   fxch    st(2)
   fsqrt
   fxch    st(2)

この上記のコードはsqrtof を取ると書かれていst(2)ます。私が間違っている場合は修正してください。それは を交換しtop of the stackst(2)から を取りますsqrt of what? 私はそれをはっきりと理解していません。

助けてもらえますか?私の場合と上記の場合、それはどのように機能しますか?

4

1 に答える 1

3

mov命令は実際に値をコピーしfsqrt、スタックの最上部の平方根を取り、スタックの最上部をその結果に置き換えます。したがって、指定されたコード シーケンスは、実質的に の平方根を取りst(2)、同じ場所に戻します。

以下の質問への回答です。2 つの命令は、レジスタの値をとmovにコピーします。したがって、別の を追加すると、この値 (から) も にコピーされます。%eax%ebx%ecxmov %eax,%edx%eax%edx

これは AT&T アセンブリにも当てはまることに注意してください。Intel アセンブリでは、値が逆にコピーされます。その場合%eax、まったく無駄に、他のレジスタの値を含むように繰り返し変更されました。

これは、 top のすぐ下にある要素とfxch st(1)スタックの一番上を交換します。同様に のすぐ下にあります。整数レジスタとは対照的に、x86 の浮動小数点レジスタはスタックに編成されており、浮動小数点レジスタは常にスタックの最上位要素で動作するため、これらの浮動小数点レジスタでの操作の命令長が短縮されます。これには、命令を使用して正しい値をスタックの一番上に置かなければならないというオーバーヘッドが伴います。st(0)st(1)st(2)st(1)fxch

整数レジスタなどは%eax、浮動小数点スタック/レジスタなど%ebxとは異なります。したがって、命令は命令とは関係ありません。これらの命令の順序は、結果に影響を与えずに変更できます。st(0)st(1)movfxch

于 2013-06-03T20:49:16.377 に答える