关于简单浮点加载指令的困惑

Confusion about simple floating point load instruction

我对以下浮点指令和正在传输到 f2(浮点寄存器)的“0”有疑问

fld f2,0(Rx)

根据我的研究,我对这条指令的了解是 fld 将 0(Rx) 的内容加载到 f2 并且我知道 Rx 是一个 integer/address 寄存器。我只是很困惑,如果数字 0 被存储到 f2 或 Rx 的内容在 0

这些操作数看起来有点像 MIPS l.d,而不是 x86。

AT&T 语法中的

x86 fld 看起来像 fld 0(%esi),隐式目标是 st0.

x87 堆栈寄存器名称为 st0..st7。 x86+x87 没有名为 f2 的寄存器。


另一方面,MIPS 有 integer/pointer 寄存器 r0..r31,FP 寄存器 f0..f31,imm16 + register 语法是(经典的)MIPS 的唯一寻址模式。


但它也不是 MIPS,因为 fld 不是 MIPS 助记符(它是 x87),而且大多数 MIPS assemblers 使用 $ 作为寄存器名称的前缀。

l.d $f2, 0()0($a0) 一样是正常的 MIPS 语法,它将 assemble 用于 GAS 或 MARS。 (并且 l.d 是用于双精度加载 2 个寄存器的伪指令。)

您想要的 MIPS 实际机器指令是 ldc1 $f2, 0(),用于将需要对齐的 64 位加载到 $f2 和 $f3。


如果它用于任何实际的 ISA,它可能不是 MIPS 或 x86,但我不认识具体的。

但无论如何,这个 asm 语法非常通用:它是一个 FP 寄存器的加载,源地址是 0 + Rx