如何在 fpu 中编辑 st(x?当 x>0



例如,我想编辑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]会更有意义。

相关内容

  • 没有找到相关文章

最新更新