【ASM】浮点数比较大小

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qingshuiaishui/article/details/83934250

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

猜你喜欢

转载自blog.csdn.net/qingshuiaishui/article/details/83934250