|
下面程序演示如何将各种数据类型加载到 FPU 堆栈中,还有处理 FPU 堆栈时使用的一些常见的堆栈功能,代码如下:
.section .data
value1:
.int 40
value2:
.float 92.4405
value3:
.double 221.40321
.section .bss
.lcomm int1, 4
.lcomm control, 2
.lcomm status, 2
.lcomm result, 4
.section .text
.global _start
_start:
nop
finit
fstcw control
fstsw status
filds value1
fists int1
flds value2
fldl value3
fst %st(4)
fxch %st(1)
fstps result
movl $1, %eax
movl $0, %ebx
int $0x80 说明:
1、finit 指令的作用是初始化 FPU ,它将控制寄存器和状态寄存器恢复为默认值,但不改变 FPU 数据寄存器中包含的数据。这个指令一般在程序使用 FPU 的程序开始时将其包含。
2、fstcw 指令将控制寄存器中的内容复制到内存位置 control 处。(记忆方法:f 为 fpu,st 为 store 存储,c 是 control ,w 是 word ,表示两个字节大小)
3、fstsw 指令将状态寄存器中的内容复制到内存位置 status 处。 (记忆方法:f 为 fpu,st 为 store 存储,s 是 status,w 是word,表示两个字节大小)
4、filds 指令将 value1 内存处的内容加载到 FPU 寄存器堆栈。(记忆方法:f 为 fpu,i 为 integer 整型,ld 是 load,s 是 single 表示单精度)
filds 指令只有一个操作数,而且是内存操作数,这个内存大小可以是 16,32,64位大小,加载到 80 位的寄存器堆栈后会被自动扩展为双精度浮点值。这个指令不能加载普通的寄存器值到 fpu 堆栈中,如果非得要加载,那必须先将普通寄存器中的值存放到内存中,然后再加载。
5、fists 指令将 fpu 寄存器堆栈中的值存放到内存中,原堆栈中的扩展双精度浮点数据类型被存放到内存中时,会自动还原为整型。
6、flds 指令将内存 value2 处的单精度浮点值加载到 fpu 寄存器堆栈。
7、fldl 指令将内存 value3 处的双精度浮点值加载到 fpu 寄存器堆栈。(指令中的 l 是 long,表示双精度)
7、fst 指令用于把 ST0 寄存器的数据传送到另一个 fpu 寄存器中,上面程序是 ST4。
8、fxch 指令交换 st0 寄存器和另外一个寄存器中的值,上面程序交换的是 ST1。
9、fstps 指令从 fpu 堆栈的 ST0 位置中的值创建一个存储在 4 个字节 (32为) 内存中的单精度浮点值,然后 ST0 中的值会从堆栈弹出(指令中的 p 是 pop 的意思)。
FST 和 FSTP 指令的作用一样,都是复制 FPU 寄存器 ST0 中的值到内存,但是后者还要把这个值弹出堆栈。 |
|