fxch的使用 - 汇编代码 - AT& T语法

时间:2013-06-03 20:33:20

标签: c assembly

我正在尝试通过assembly code了解一些AT&T syntax

这是一个片段:

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

这是我从中理解的。

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

在第one:行中,我们将数据从注册表eax复制到ebx

同样,我们将数据从注册表eax复制到ecx

然而,我未能理解的是以下内容。 fxch如何运作?这是一个link,给出了一个例子。

   fxch    st(2)
   fsqrt
   fxch    st(2)

它说上面的代码采用sqrt的{​​{1}}。 如果我错了,请纠正我。 它将st(2)top of the stack交换,然后转移st(2) 我不明白这一点。

你能帮帮我吗?在我的案例和上述情况下,这是如何工作的?

1 个答案:

答案 0 :(得分:3)

mov指令确实复制了一个值,fsqrt取出了堆栈顶部的平方根,并将其顶部替换为其结果。因此,给定的代码序列有效地采用st(2)的平方根并将其放回到同一位置。

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

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

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

整数寄存器%eax%ebx等与浮点堆栈/寄存器st(0)st(1)等不同。所以mov指令是与fxch说明无关。可以在不影响结果的情况下更改这些指令的顺序。