汇编:fld st(0) 如何复制以下代码中的栈顶值?
Assembly: How does fld st(0) duplicates the top stack value in the following code?
在下面的代码中,我想知道fld ST(0)
的作用。我听说它复制了堆栈中的最高值,但我不知道它在以下代码中将该值带到哪里?
fild dword ptr [L1000F140]
fstp qword ptr [esp+20h]
fld ST(0)
fdiv qword ptr [L1000F148]
fmul qword ptr [L1000A520]
我的解释是上面的代码以符号方式表示:
value[esp+20h]= value[L1000F140]
new stack top value=value[esp+20h]/value[L1000F148]*value[L1000A520]
我说得对吗?
我想知道为什么 fstp
没有弹出加载的值,所以 fld
复制了 value[L1000F140]
它?
有一篇很好的guide to x87 FPU by Raymond Filiatreault. Chapter 1解释了 FPU 寄存器堆栈的工作原理。
是的,fld st(0)
将副本压入栈顶。 Intel insn ref 手册明确提到 fld st(n)
的这种特殊情况使用
我相信你是对的 fstp
确实在 fild
之后弹出。
第一个 fild / fstp
对将全局 int
(在 L1000F140)转换为堆栈上的浮点数。
然后 fld st(0)
复制堆栈的顶部(即 fild/fstp
之前的值)。
- 然后将该值除以另一个全局值,再乘以另一个值。
- 最终堆栈:
st(0)=orig / global1 * global2
st(1)=orig
在下面的代码中,我想知道fld ST(0)
的作用。我听说它复制了堆栈中的最高值,但我不知道它在以下代码中将该值带到哪里?
fild dword ptr [L1000F140]
fstp qword ptr [esp+20h]
fld ST(0)
fdiv qword ptr [L1000F148]
fmul qword ptr [L1000A520]
我的解释是上面的代码以符号方式表示:
value[esp+20h]= value[L1000F140]
new stack top value=value[esp+20h]/value[L1000F148]*value[L1000A520]
我说得对吗?
我想知道为什么 fstp
没有弹出加载的值,所以 fld
复制了 value[L1000F140]
它?
有一篇很好的guide to x87 FPU by Raymond Filiatreault. Chapter 1解释了 FPU 寄存器堆栈的工作原理。
是的,fld st(0)
将副本压入栈顶。 Intel insn ref 手册明确提到 fld st(n)
我相信你是对的 fstp
确实在 fild
之后弹出。
第一个
fild / fstp
对将全局int
(在 L1000F140)转换为堆栈上的浮点数。然后
fld st(0)
复制堆栈的顶部(即fild/fstp
之前的值)。- 然后将该值除以另一个全局值,再乘以另一个值。
- 最终堆栈:
st(0)=orig / global1 * global2
st(1)=orig