|
沙发

楼主 |
发表于 2010-2-28 11:19:53
|
只看该作者
控制寄存器
控制寄存器
控制寄存器控制 FPU 内的浮点功能,使用一个 16 位寄存器,相应位的含义为:
控制位
| 描述
| 0
| 非法操作异常掩码
| 1
| 非格式化操作数异常掩码
| 2
| 除数位零异常掩码
| 3
| 溢出异常掩码
| 4
| 下溢异常掩码
| 5
| 精度异常掩码
| 6-7
| 保留
| 8-9
| 精度控制
| 10-11
| 舍入控制
| 12
| 无穷大控制
| 13-15
| 保留
|
前面 6 位用于控制使用状态寄存器中的哪些异常标志。当这些位中的一位被设置时,就会防止状态寄存器中对应的异常标志被设置。默认情况下,所有的掩码位都被设置,即屏蔽所有异常。
精度控制位可以设置 FPU 中用于数学计算的浮点精度,可以该白 FPU 计算浮点值花费的时间,这是非常有用的控制特性,精度控制设置如下:
默认情况下,FPU 精度位扩展双精度,这是最为精确的值,但也是最为耗费时间。如果不打算使用这么高的精度,可以设置为单精度以加快浮点值的计算速度。
舍入控制位可以设置 FPU 如何舍入浮点计算的结果。舍入控制位的可能设置如下:
默认情况下,舍入控制位被设置为舍入到最近值。
控制寄存器的默认值是 0x037F 。可以使用 FSTCW 指令加载控制寄存器中的内容到内存中以查看其内容。也可以使用 FLDCW 指令改变设置,这条指令把内存中值加载到控制寄存器中。下面程序使用 FLDCW 指令把 FPU 的精度设置从扩展双精度改为单精度:
.section .data
newvalue:
.byte 0x7f, 0x00
.section .text
.lcomm control, 2
.section .text
.global _start
_start:
nop
fstcw control
fldcw newvalue
fstcw control
movl $1, %eax
movl $0, %ebx
int $0x80 通过调试器可以看到设置成功了:12 fstcw control
Current language: auto
The current source language is "auto; currently asm".
(gdb) n
13 fldcw newvalue
(gdb) x/x &control
0x804909c <control>: 0x0000037f
(gdb) n
14 fstcw control
(gdb) n
16 movl $1, %eax
(gdb) x/x &control
0x804909c <control>: 0x0000007f |
|