我正在尝试通过assembly code
了解一些AT&T syntax
。
这是一个片段:
"mov %eax, %ebx; "\
"mov %eax, %ecx;"\
"fxch %st(1);"\
这是我从中理解的。
mov
副本(我是正确的吗?还是移动?)数据从source register
到destination 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)
我不明白这一点。
答案 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
说明无关。可以在不影响结果的情况下更改这些指令的顺序。