FPU计算通过指令 fcmp/fcmpp比较两个数的大小,其结果通过指令fstsw获取,再由SAHF设置标志寄存器,然后通过 jc:f1 <f2
jz:f1==f2 。
FPU的比较指令会改变状态寄存器C3和C0位。关系如下:
C3 C0 result
0 0 st(0)>源操作数
0 1 st(0)<源操作数
1 0 st(0)=源操作数
1 1 st(0)不可比较
例子:
float_cmp proc stdcall f1:REAL8,f2:REAL8
sub esp,2
finit
fld f2
fld f1
fcompp
fstsw WORD PTR [ebp]
mov ax,WORD PTR [ebp]
SAHF
jc f1_l_f2
jz f1_equ_f2
mov al,62;>
jmp f_cmp_end
f1_l_f2:
mov al,60;<
jmp f_cmp_end
f1_equ_f2:
mov al,61;=
jmp f_cmp_end
f_cmp_end:
mov BYTE PTR [ebp],al
mov BYTE PTR [ebp+1],0
sub al,61
movsx eax,al
push eax
lea eax,[ebp]
push eax
sub esp,8
fld f2
fstp QWORD PTR [esp]
sub esp,8
fld f1
fstp QWORD PTR [esp]
push offset szfmt
call crt_printf
add esp,24
pop eax
ret 16
float_cmp endp
;调用
;invoke float_cmp,f_1,f_2
返回值:
1:f1>f2
0:f1=f2
-1:f1<f2
-----------------------------------------------------------------------------------------------------------
其它指令:
ftst: st(0)与0进行比较。
fld1:1.0压栈
fldz: 0.0压栈
fldpi:圆周率压栈
fld2t:log210(log2为底10的对数)
fldl2e:log2e (log 2为底e的对数
fldlg2:log102(log 10为底2的对数)
fldln2:loge2 (log e为底2的对数)