曲径通幽论坛

标题: 使用 FPU 堆栈 [打印本页]

作者: beyes    时间: 2010-3-2 23:55
标题: 使用 FPU 堆栈
下面程序演示如何将各种数据类型加载到 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 中的值到内存,但是后者还要把这个值弹出堆栈。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2