|
FLD 与 FST 指令
FLD 指令用于把浮点值传送入和传送出 FPU 寄存器。FLD 指令的格式是:其中 source 可以是 32 位、64位 或者 80位的内存位置。下面的程序测试这条指令:
.section .data
value1:
.float 12.34
value2:
.double 2353.631
.section .bss
.lcomm data, 8
.section .text
.global _start
_start:
nop
flds value1
fldl value2
fstl data
mov $1, %eax
mov $0, %ebx
int $0x80 上面程序中,FLDS 加载单精度浮点数; FLDL 加载双精度浮点数。
类似的,FST 指令用于获取 FPU 寄存器堆栈中顶部的值,并且把这个值存放到内存位置中。也分为 FSTS 和 FSTL 两种,对于单精度数字,使用 FSTS 指令,对于双精度数字使用 FSTL 。
在运行 flds value1 指令后,可以看到 ST0 寄存器的值:(gdb) print $st0
$2 = 12.340000152587890625
在运行 flds value2 指令后,可以看到 ST0 寄存器的值:(gdb) print $st0
$1 = 2353.6309999999998581188265234231949 这个值已经被替换为新加载的双精度值(并且调试器正确地把这个值显示为双精度浮点值)。
用 info all 命令查看 STx 寄存器堆栈:st0 2353.6309999999998581188265234231949 (raw 0x400a931a189374bc6800)
st1 12.340000152587890625 (raw 0x4002c570a40000000000) 正如期望的,当加载新值时,ST0 中的值就被移到 ST1 寄存器中。
执行 FSTL 指令后,现在查看 data 标签值:(gdb) x/gf &data
0x80490a0 <data>: 2353.6309999999999 FSTL 指令把 ST0 寄存器中的值加载到 data 标签指向的内存位置中。 |
|