Assembly 如何将存储在扩展寄存器(eax)中的值加载到浮点堆栈的st0中?

Assembly 如何将存储在扩展寄存器(eax)中的值加载到浮点堆栈的st0中?,assembly,x86,nasm,x87,Assembly,X86,Nasm,X87,如何将存储在扩展寄存器(eax)中的值加载到浮点堆栈的st0中 fld dword [eax] 当我使用上述指令时,可能因为括号符号与内存地址有关,而与内容无关,所以在传输中没有得到所需的更改。 不过,我不确定。FLD指令只能从内存中读取,因此您需要将EAX的值保存到内存位置,然后进行内存上载 a_memory_place dd ? . mov dword ptr [a_memory_place],eax fld dword ptr [a_memory_place] ;

如何将存储在扩展寄存器(eax)中的值加载到浮点堆栈的st0中

fld dword [eax]
当我使用上述指令时,可能因为括号符号与内存地址有关,而与内容无关,所以在传输中没有得到所需的更改。
不过,我不确定。

FLD指令只能从内存中读取,因此您需要将EAX的值保存到内存位置,然后进行内存上载

a_memory_place    dd     ?
.
mov dword ptr [a_memory_place],eax
fld dword ptr [a_memory_place]      ; loads a 32 bit data into ST(0)
相信这会有帮助

  fld     dword ptr [eax]
这个代码很好用! 但是eax必须指向有效的32位实数! 如果您使用的是64位实数,请使用:

  fld     qword ptr [eax]
使用此指令加载EAX的尝试不会达到您认为的效果:

fld dword [eax]
这将从EAX指向的内存位置加载32位浮点值(这是)。我相信您希望用EAX的值来加载ST(0)


如果必须使用x87 FPU指令而不是SSE指令,那么我建议将值临时存储在堆栈上的EAX中,而不是像@quasar66这样的固定内存位置。将其放在堆栈上也可以使代码变得更简单

如果代码位于已经为临时对象分配空间的函数中,只需增加堆栈分配,允许向其存储另一个32位值,并将EAX移动到该堆栈位置,然后使用
fld
从那里加载

最终,32位代码可能会产生与以下类似的效果:


在遵循System V 64位ABI(不适用于64位Windows)的64位操作系统上,您可以直接将数据移动到堆栈中,而无需担心数据被破坏。这样的64位代码可能如下所示:

mov [rsp-4], eax   ; Temporarily place EAX in the stack's red zone beneath current RSP
fld dword[rsp-4]   ; Load it into ST0
; do other stuff here
                   ; No need for stack cleanup
不要在32位代码中尝试此操作,因为异步事件(信号等)可能会在
mov
之后和
fld
之前冲击堆栈上的值



您的问题中不清楚的是EAX中的值是整数还是正好是32位浮点值。如果它是一个整数,则在我的回答中必须替换为,以便在加载到FPU堆栈时将整数值转换为浮点值。

dword ptr
是MASM,OP标记的NASM将是
mov dword
fld dword
,没有
ptr
标记。静态存储位置对于通用用途来说是一个不好的选择。更好:保留一些堆栈空间并使用
[esp]
(或者
[ebp-something]
,如果您制作了堆栈框架)。或者像Michael建议的那样推eax。eax是整数还是已经包含浮点值?FreeBSD的x86-64用户空间ABI使用与Linux相同的红色区域。有没有其他BSD没有,你刚才说的?
mov [rsp-4], eax   ; Temporarily place EAX in the stack's red zone beneath current RSP
fld dword[rsp-4]   ; Load it into ST0
; do other stuff here
                   ; No need for stack cleanup