指令 | 描述 |
FCOM | 比较ST0和ST1寄存器 |
FCOM ST(x) | 比较 ST0 寄存器和另外一个 FPU 寄存器 |
FCOM source | 比较 ST0 寄存器和32位或64位的内存值 |
FCOMP | 比较ST0和ST1寄存器,并且弹出堆栈 |
FCOMP ST(X) | 比较ST0和另外一个FPU寄存器,并且弹出堆栈 |
FCOMP source | 比较ST0和32位或64位的内存值,并且弹出堆栈 |
FCOMPP | 比较ST0寄存器和ST1寄存器,并且两次弹出堆栈 |
FTST | 比较寄存器和值0.0 |
条件 | C3 | C2 | C0 |
ST0>source | 0 | 0 | 0 |
ST0<source | 0 | 0 | 1 |
ST0=source | 1 | 0 | 0 |
.section .data
value1:
.float 3.5532
value2:
.float 4.5532
.section .text
.global _start
_start:
nop
flds value1
fcoms value2
fstsw
sahf
ja greater
jb lessthan
movl $1, %eax
movl $0, %ebx
int $0x80
greater:
movl $1, %eax
movl $2, %ebx
int $0x80
lessthan:
movl $1, %eax
movl $1, %ebx
int $0x80
eflags 0x200213 [ CF AF IF ID ]
$ ./fcom
$ echo $?
1
关于相等性比较的一点说明:
当把浮点值加载到 FPU 寄存器中时,它被转换为扩展双精度浮点值。这一处理可能导致一些舍入错误。单精度或者双精度值在加载到 FPU 寄存器之后有可能不等于原始值。检测浮点值的完全相等性不是一个好主意,而要检测它们是否在预期值的小误差之内。
指令 | 描述 |
FCOMI | 比较ST0寄存器和ST(x)寄存器 |
FCOMIP | 比较ST0寄存器和ST(x)寄存器,并且弹出堆栈 |
FUCOMI | 在比较之前检查无序值 |
FUCOMIP | 在比较之前检查无序值,并且在比较之后弹出堆栈 |
条件 | ZF | PF | CF |
ST0>ST(X) | 0 | 0 | 0 |
ST0<ST(X) | 0 | 0 | 1 |
ST0=ST(X) | 1 | 0 | 0 |
.section .data
value1:
.float 10.923
value2:
.float 4.5532
.section .text
.global _start
_start:
nop
flds value2
flds value1
fcomi %st(1), %st(0)
ja greater
jb lessthan
movl $1, %eax
movl $0, %ebx
int $0x80
greater:
movl $1, %eax
movl $2, %ebx
int $0x80
lessthan:
movl $1, %eax
movl $1, %ebx
int $0x80
$ ./fcomi
$ echo $?
2
指令 | 描述 |
FCMOVB | 如果ST(0)小于ST(x),则进行传送 |
FCMOVE | 如果ST(0)等于ST(x),则进行传送 |
FCMOVBE | 如果ST(0)小于或者等于ST(x),则进行传送 |
FCMOVU | 如果ST(0)无序,则进行传送 |
FCMOVNB | 如果ST(0)不小于ST(x),则进行传送 |
FCMOVNE | 如果ST(0)不等于ST(x),则进行传送 |
FCMOVNBE | 如果ST(0)不小于或者等于ST(x),则进行传送 |
FCMOVNU | 如果ST(0)非无序,则进行传送 |
fcmovxx source, destination
.section .data
value1:
.float 20.5
value2:
.float 10.90
.section .text
.global _start
_start:
nop
finit
flds value1
flds value2
fcomi %st(1), %st(0)
fcmovb %st(1), %st(0)
movl $1, %eax
movl $0, %ebx
int $0x80
st0 20.5 (raw 0x4003a400000000000000)
st1 20.5 (raw 0x4003a400000000000000)
欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) | Powered by Discuz! X3.2 |