📄 setprec.87
字号:
;; Microsoft MASM subroutines for setting coprocessor precision;.286.287_TEXT SEGMENT BYTE PUBLIC 'CODE'_TEXT ENDSCONST SEGMENT WORD PUBLIC 'CONST'CONST ENDS_BSS SEGMENT WORD PUBLIC 'BSS'_BSS ENDS_DATA SEGMENT WORD PUBLIC 'DATA'_DATA ENDSDGROUP GROUP CONST, _BSS, _DATA ASSUME CS: _TEXT, DS: DGROUP, SS: DGROUP, ES: DGROUPEXTRN __fac:QWORD_BSS SEGMENTEXTRN __fltused:NEAR_BSS ENDS; exception masks (1 = masked); 1 invalid operation; 2 denormalized operand; 4 zero divide; 8 overflow; 10 underflow; 20 precision_DATA SEGMENT; double precision setting;;ctlwrd dw 01230h ; note this traps on denormal operands!;;ctld dw 0133fh ; this doesn't trapctld dw 01230h; single precisionctls dw 01030h; long double precisionctlld dw 01320h_DATA ENDS ASSUME CS: _TEXT_TEXT SEGMENT; Set coprocessor to single precision float PUBLIC _sprec_sprec PROC NEAR fclex fwait finit fwait fldcw word ptr ctls fwait ret_sprec ENDP; set coprocessor to long double precision PUBLIC _ldprec_ldprec PROC NEAR fclex fwait finit fwait fldcw word ptr ctlld fwait ret_ldprec ENDP; set coprocessor to double precision PUBLIC _dprec_dprec PROC NEAR fclex fwait finit fwait fldcw word ptr ctld fwait ret_dprec ENDP; get a double promoted to long double size; getld( &doub, &ldoub ); PUBLIC _getld_getld PROC NEAR push bp mov bp,sp push bx mov bx, word ptr [bp+4]; fld st(0) fld qword ptr [bx] mov bx, word ptr [bp+6] fstp tbyte ptr [bx] mov bx, word ptr [bp+4] fld qword ptr [bx] mov bx, word ptr [bp+8] fstp qword ptr [bx] pop bx pop bp ret_getld ENDP PUBLIC _getprec_getprec PROC NEAR push bp mov bp,sp sub sp,4 fstcw [bp-4] fwait mov ax,[bp-4] add sp,4 pop bp ret_getprec ENDP PUBLIC _fpclear_fpclear PROC NEAR push bp mov bp,sp fnclex fwait pop bp ret_fpclear ENDP PUBLIC _noexcept_noexcept PROC NEAR push bp mov bp,sp push ax sub sp,4 fnclex fwait fstcw [bp-4] fwait mov ax,[bp-4] and ax,0FFC0h or ax,003fh mov [bp-4],ax fldcw [bp-4] add sp,4 pop ax pop bp ret_noexcept ENDP;; single precision square root;; assumes coprocessor precision already set up;; return value in static __fac; PUBLIC _sqrtf;_sqrtf PROC NEAR; push bp; mov bp,sp; fld DWORD PTR [bp+4]; fsqrt; fwait ; fstp DWORD PTR __fac; mov ax,OFFSET __fac; mov sp,bp; pop bp; ret;_sqrtf ENDP;;;; double precision square root;; assumes coprocessor precision already set up;; return value in static __fac; PUBLIC _sqrt;_sqrt PROC NEAR; push bp; mov bp,sp; fld QWORD PTR [bp+4]; fsqrt; fwait ; fstp QWORD PTR __fac; mov ax,OFFSET __fac; mov sp,bp; pop bp; ret;_sqrt ENDP;;;; long double precision square root;; assumes coprocessor precision already set up;; return value in fp register; PUBLIC _sqrtl;_sqrtl PROC NEAR; push bp; mov bp,sp; fld tbyte ptr [bp+4]; fsqrt; fwait ; mov sp,bp; pop bp; ret;_sqrtl ENDP;_TEXT ENDSEND
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -