2

我试图assembly codeAT&T syntax.

这是一个片段:

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

这是我从中了解到的。

mov副本(我是正确的吗?还是它会移动?)数据source registerdestination register

我们将数据从one:注册表复制eaxebx.

同样,我们将数据从注册表复制eaxecx.

但是,我无法理解的是以下内容。如何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)并将其放回同一位置。

在下面回答您的问题。这两mov条指令将寄存器中的值复制%eax%ebx%ecx。因此,如果您添加另一个mov %eax,%edx,则此值(来自%eax)也将复制到%edx.

请注意,这适用于 AT&T 组装。在英特尔汇编中,值以相反的方式复制。在那种情况下%eax,非常无用地反复更改以包含其他寄存器的值。

交换堆栈的fxch st(1)顶部,即st(0)与 top 正下方的元素st(1)。同样st(2)是下面st(1)。与整数寄存器相反,x86 上的浮点寄存器被组织在一个堆栈中,减少了对这些浮点寄存器的操作指令长度,因为它们总是在堆栈的顶部元素上工作。这带来了必须使用fxch指令将正确的值放在堆栈顶部的开销。

整数寄存器%eax%ebx与浮点堆栈/寄存器等不同st(0)st(1)因此mov指令与指令无关fxch。可以更改这些指令的顺序而不影响结果。

于 2013-06-03T20:49:16.377 回答