例如,我想编辑st(2)
fstp [00777700]
fstp [00777800]
fstp [00777900]
mov [00777900],xxx
fld [00777900]
fld [00777800]
fld [00777700]
那是我的错误方式St (0,1,2) = qnan
如果x87寄存器堆栈尚未满(所有8个regs),您可以将新值加载到st0中,然后在x87寄存器之间复制。
; requires that st7 is free before this
fld qword [new_val] ; requires that at most 7 st regs were in use
fstp st(3) ; replace st3 which was originally st2, and pop
最后一条指令将st0复制到st3,然后弹出x87堆栈以丢弃st0,将st3,2,1降至其原始位置st2,1,0。
有关x87寄存器堆栈如何工作的详细信息,以及指令的作用,请参阅http://www.ray.masmcode.com/tutorial/index.html,并提供示例。
一般情况下,您可以使用fxch
将值交换到st0
,在那里您可以修改它,如fadd
。或者在这里,丢弃它并加载一个新值,即使是st0..
fxch st(2) ; swap st0 and st2
fstp st(0) ; discard it with a pop after storing to itself
fld qword [new_value] ; push a new value into st0
fxchg st(2) ; swap it back to st2
如果你在fld
,中没有期望得到QNaN,这通常是你不平衡x87堆栈的标志.fld
,当目的地已经"在使用中";将设置st0 = NaN。正如http://www.ray.masmcode.com/tutorial/fpuchap4.htm所说:
如果ST(7)数据寄存器将成为新的ST(0)不为空,则SF钉I检测到无效的操作异常,在状态字中设置两个标志。状态字中的TOP寄存器指针仍然会递减,ST(0)中的新值将是INDEFINITE NAN(这是一个QNaN)。
同样,如果您确实需要存储到内存中,那么您不太可能希望将每个dword或qword分开256字节存储。(如果这些都是十六进制?你没有使用后面的h
或前面的0x
)。qword [esp+0]
/qword [esp+4]
/qword [esp+8]
会更有意义。