曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 5287|回复: 0
打印 上一主题 下一主题

使用 FPU 堆栈

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2010-3-2 23:55:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面程序演示如何将各种数据类型加载到 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 中的值到内存,但是后者还要把这个值弹出堆栈。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-14 05:19 , Processed in 0.078410 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表