📄 setprbor.asm
字号:
;; Borland assembler header;; Microsoft MASM subroutines for setting coprocessor precision;.286.287PREC_TEXT SEGMENT BYTE PUBLIC 'CODE'PREC_TEXT ENDSDGROUP group _DATA,_BSS assume cs:PREC_TEXT,ds:DGROUP_DATA segment word public 'DATA'd@ label byted@w label word_DATA ends_BSS segment word public 'BSS'b@ label byteb@w label word_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 ENDSPREC_TEXT segment byte public 'CODE' assume cs:PREC_TEXT,ds:DGROUP; Set coprocessor to single precision float PUBLIC _sprec_sprec PROC FAR fclex fwait finit fwait fldcw word ptr ctls fwait ret_sprec ENDP; set coprocessor to long double precision PUBLIC _ldprec_ldprec PROC far fclex fwait finit fwait fldcw word ptr ctlld fwait ret_ldprec ENDP; set coprocessor to double precision PUBLIC _dprec_dprec PROC far 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 far 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 far 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 far push bp mov bp,sp fnclex fwait pop bp ret_fpclear ENDP PUBLIC _noexcept_noexcept PROC far 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 FAR push bp mov bp,sp fld DWORD PTR [bp+6] fsqrt fwait 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 FAR push bp mov bp,sp fld QWORD PTR [bp+6] fsqrt fwait 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 FAR push bp mov bp,sp fld tbyte ptr [bp+6] fsqrt fwait mov sp,bp pop bp ret_sqrtl ENDPPREC_TEXT ends_DATA segment word public 'DATA's@ label byte_DATA endsPREC_TEXT segment byte public 'CODE'PREC_TEXT ends_s@ equ s@ public _sprec public _dprec public _ldprec end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -