【ASM】浮点数比较大小

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的对数)
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值