📄 mpmath_a.asm
字号:
jno NoOverflow
Overflow:
mov MPOverflow, 1
ZeroAns:
xor ax, ax
xor dx, dx
mov Ans.Exp, dx
jmp StoreMant
NoOverflow:
mov Ans.Exp, ax
mov dx, WORD PTR [xMant+2]
mov ax, WORD PTR [xMant]
or dx, dx
jz ZeroAns
mov cx, WORD PTR [yMant+2]
mov bx, WORD PTR [yMant]
or cx, cx
jz Overflow
cmp dx, cx
jl Divide
shr dx, 1
rcr ax, 1
add Ans.Exp, 1
jo Overflow
Divide:
div cx
mov si, dx
mov dx, bx
mov bx, ax
mul dx
xor di, di
cmp dx, si
jnc RemReallyNeg
xchg ax, di
xchg dx, si
sub ax, di
sbb dx, si
shr dx, 1
rcr ax, 1
div cx
mov dx, bx
shl ax, 1
adc dx, 0
jmp StoreMant
RemReallyNeg:
sub ax, di
sbb dx, si
shr dx, 1
rcr ax, 1
div cx
mov dx, bx
mov bx, ax
xor ax, ax
xor cx, cx
shl bx, 1
rcl cx, 1
sub ax, bx
sbb dx, cx
jno StoreMant
shl ax, 1
rcl dx, 1
dec Ans.Exp
StoreMant:
mov WORD PTR Ans.Mant, ax
mov WORD PTR Ans.Mant+2, dx
lea ax, Ans
mov dx, ds
ret
MPdiv086 ENDP
MPcmp386 PROC uses si di, xExp:WORD, xMant:DWORD, yExp:WORD, yMant:DWORD
mov si, 0
mov di, si
.386
mov ax, xExp
mov edx, xMant
mov bx, yExp
mov ecx, yMant
or ax, ax
jns AtLeastOnePos
or bx, bx
jns AtLeastOnePos
mov si, 1
and ah, 7fh
and bh, 7fh
AtLeastOnePos:
cmp ax, bx
jle Cmp1
mov di, 1
jmp ChkRev
Cmp1:
je Cmp2
mov di, -1
jmp ChkRev
Cmp2:
cmp edx, ecx
jbe Cmp3
mov di, 1
jmp ChkRev
Cmp3:
je ChkRev
mov di, -1
ChkRev:
or si, si
jz ExitCmp
neg di
ExitCmp:
mov ax, di
.8086
ret
MPcmp386 ENDP
d2MP386 PROC uses si di, x:QWORD
mov si, WORD PTR [x+6]
.386
mov edx, DWORD PTR [x+4]
mov eax, DWORD PTR [x]
mov ebx, edx
shl ebx, 1
or ebx, eax
jnz NonZero
xor si, si
xor edx, edx
jmp StoreAns
NonZero:
shl si, 1
pushf
shr si, 4
popf
rcr si, 1
add si, (1 SHL 14) - (1 SHL 10)
shld edx, eax, 12
stc
rcr edx, 1
StoreAns:
mov Ans.Exp, si
mov Ans.Mant, edx
lea ax, Ans
mov dx, ds
.8086
ret
d2MP386 ENDP
MP2d386 PROC uses si di, xExp:WORD, xMant:DWORD
sub xExp, (1 SHL 14) - (1 SHL 10)
.386
jo Overflow
mov bx, xExp
and bx, 0111100000000000b
jz InRangeOfDouble
Overflow:
mov MPOverflow, 1
xor eax, eax
xor edx, edx
jmp StoreAns
InRangeOfDouble:
mov bx, xExp
mov ax, bx
shl bx, 5
shl ax, 1
rcr bx, 1
shr bx, 4
mov edx, xMant
shl edx, 1
xor eax, eax
shrd eax, edx, 12
shrd edx, ebx, 12
StoreAns:
mov DWORD PTR Double+4, edx
mov DWORD PTR Double, eax
lea ax, Double
mov dx, ds
.8086
ret
MP2d386 ENDP
MPmul386 PROC uses si di, xExp:WORD, xMant:DWORD, yExp:WORD, \
yMant:DWORD
mov ax, xExp
mov bx, yExp
.386
xor ch, ch
shl bh, 1
rcr ch, 1
shr bh, 1
xor ah, ch
sub bx, (1 SHL 14) - 2
add ax, bx
jno NoOverflow
Overflow:
or WORD PTR [xMant+2], 0
jz ZeroAns
or WORD PTR [yMant+2], 0
jz ZeroAns
mov MPOverflow, 1
ZeroAns:
xor edx, edx
mov Ans.Exp, dx
jmp StoreMant
NoOverflow:
mov Ans.Exp, ax
mov eax, xMant
mov edx, yMant
or eax, eax
jz ZeroAns
or edx, edx
jz ZeroAns
mul edx
or edx, edx
js StoreMant
shld edx, eax, 1
sub Ans.Exp, 1
jo Overflow
StoreMant:
mov Ans.Mant, edx
lea ax, Ans
mov dx, ds
.8086
ret
MPmul386 ENDP
MPadd386 PROC uses si di, xExp:WORD, xMant:DWORD, yExp:WORD, \
yMant:DWORD
mov si, xExp
.386
mov eax, xMant
mov di, yExp
mov edx, yMant
mov cx, si
xor cx, di
js Subtract
jz SameMag
cmp si, di
jg XisGreater
xchg si, di
xchg eax, edx
XisGreater:
mov cx, si
sub cx, di
cmp cx, 32
jge StoreAns
shr edx, cl
SameMag:
add eax, edx
jnc StoreAns
rcr eax, 1
add si, 1
jno StoreAns
Overflow:
mov MPOverflow, 1
ZeroAns:
xor si, si
xor edx, edx
jmp StoreAns
Subtract:
xor di, 8000h
mov cx, si
sub cx, di
jnz DifferentMag
cmp eax, edx
jg SubtractNumbers
je ZeroAns
xor si, 8000h
xchg eax, edx
jmp SubtractNumbers
DifferentMag:
or cx, cx
jns NoSwap
xchg si, di
xchg eax, edx
xor si, 8000h
neg cx
NoSwap:
cmp cx, 32
jge StoreAns
shr edx, cl
SubtractNumbers:
sub eax, edx
bsr ecx, eax
neg cx
add cx, 31
shl eax, cl
sub si, cx
jo Overflow
StoreAns:
mov Ans.Exp, si
mov Ans.Mant, eax
lea ax, Ans
mov dx, ds
.8086
ret
MPadd386 ENDP
MPdiv386 PROC uses si di, xExp:WORD, xMant:DWORD, yExp:WORD, \
yMant:DWORD
mov ax, xExp
mov bx, yExp
.386
xor ch, ch
shl bh, 1
rcr ch, 1
shr bh, 1
xor ah, ch
sub bx, (1 SHL 14) - 2
sub ax, bx
jno NoOverflow
Overflow:
mov MPOverflow, 1
ZeroAns:
xor eax, eax
mov Ans.Exp, ax
jmp StoreMant
NoOverflow:
mov Ans.Exp, ax
xor eax, eax
mov edx, xMant
mov ecx, yMant
or edx, edx
jz ZeroAns
or ecx, ecx
jz Overflow
cmp edx, ecx
jl Divide
shr edx, 1
rcr eax, 1
add Ans.Exp, 1
jo Overflow
Divide:
div ecx
StoreMant:
mov Ans.Mant, eax
lea ax, Ans
mov dx, ds
.8086
ret
MPdiv386 ENDP
fg2MP386 PROC x:DWORD, fg:WORD
mov bx, 1 SHL 14 + 30
sub bx, fg
.386
mov edx, x
or edx, edx
jnz ChkNegMP
mov bx, dx
jmp StoreAns
ChkNegMP:
jns BitScanRight
or bh, 80h
neg edx
BitScanRight:
bsr ecx, edx
neg cx
add cx, 31
sub bx, cx
shl edx, cl
StoreAns:
mov Ans.Exp, bx
mov Ans.Mant, edx
.8086
lea ax, Ans
mov dx, ds
ret
fg2MP386 ENDP
PUBLIC MPcmp, MPmul, MPadd, MPdiv, MP2d, d2MP, fg2MP
fg2MP:
cmp cpu, 386
je Use386fg2MP
jmp fg2MP086
Use386fg2MP:
jmp fg2MP386
MPcmp:
cmp cpu, 386
je Use386cmp
jmp MPcmp086
Use386cmp:
jmp MPcmp386
MPmul:
cmp cpu, 386
je Use386mul
jmp MPmul086
Use386mul:
jmp MPmul386
d2MP:
cmp cpu, 386
je Use386d2MP
jmp d2MP086
Use386d2MP:
jmp d2MP386
MPadd:
cmp cpu, 386
je Use386add
jmp MPadd086
Use386add:
jmp MPadd386
MPdiv:
cmp cpu, 386
je Use386div
jmp MPdiv086
Use386div:
jmp MPdiv386
MP2d:
cmp cpu, 386
je Use386MP2d
jmp MP2d086
Use386MP2d:
jmp MP2d386
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -