📄 extarith.asm
字号:
model large extend_text,pascal
include extend.inc
.code Extend_Text
Break proc far
uses si,di
push ss
pop es
sub dx,dx
cld
mov cx,4
rep movsw
lodsw
shl ax,1
rcl dx,1
shr ax,1
stosw
xchg ax,dx
stosw
ret
Break endp
CheckNan proc near Num:dword
les bx,Num
cmp word ptr es:[bx+8],7fffh
jne @@2
les bx,Num
cmp word ptr es:[bx+6],8000h
jne @@1
les bx,Num
cmp word ptr es:[bx],0
jne @@1
les bx,Num
cmp word ptr es:[bx+2],0
jne @@1
les bx,Num
cmp word ptr es:[bx+4],0
je @@2
@@1: mov ax,1
jmp short @@3
@@2: xor ax,ax
@@3: jmp short @@4
@@4: ret
CheckNan endp
Argm Flag,byte,1
Argm A,dword,1
Argm B,dword,1
Loc Temp2,word,6
Loc Temp1,word,6
Loc J,byte,1
Loc I,byte,1
Entry AddSub
push si di
push ds
lds si,A
lea di,Temp1
call Break
lds si,B
lea di,Temp2
call Break
pop ds
lea si,Temp1
lea di,Temp2
mov al,byte ptr Flag
xor al,byte ptr Temp2[10]
mov byte ptr Temp2[10],al
xor al,byte ptr Temp1[10]
mov byte ptr Flag,al
mov ax,Temp1[8]
mov bx,Temp2[8]
cmp ax,7fffh
jae @@3
cmp bx,7fffh
jae @@2
cmp ax,bx
jae @@1
mov cl,byte ptr Temp2[10]
mov byte ptr Temp1[10],cl
mov Temp1[8],bx
xchg ax,bx
xchg si,di
@@1: or bx,bx
ja @@5
jmp short @@4
@@2: mov si,di
mov ax,Temp2[8]
mov Temp1[8],ax
mov ax,Temp2[10]
mov Temp1[10],ax
@@3: mov ax,Temp1[8]
cmp ax,Temp2[8]
jne @@4
mov ax,Temp1[10]
cmp ax,Temp2[10]
je @@4
mov Temp1[10],0
mov ax,0
mov bx,0
mov cx,0
mov dx,0c000h
jmp @@16
@@4: mov ax,ss:[si]
mov bx,ss:[si+2]
mov cx,ss:[si+4]
mov dx,ss:[si+6]
jmp @@16
@@5: sub ax,bx
cmp ax,64
jg @@4
mov I,al
mov ax,ss:[di]
mov bx,ss:[di+2]
mov cx,ss:[di+4]
mov dx,ss:[di+6]
mov J,0
sub I,8
jl @@7
@@6: mov J,al
mov al,ah
mov ah,bl
mov bl,bh
mov bh,cl
mov cl,ch
mov ch,dl
mov dl,dh
mov dh,0
sub I,8
jge @@6
@@7: and I,7
jz @@9
@@8: shr dx,1
rcr cx,1
rcr bx,1
rcr ax,1
rcr J,1
dec I
jnz @@8
@@9: sub di,di
cmp Flag,0
jne @@10
add ax,ss:[si]
adc bx,ss:[si+2]
adc cx,ss:[si+4]
adc dx,ss:[si+6]
jnc @@14
rcr dx,1
rcr cx,1
rcr bx,1
rcr ax,1
rcr J,1
inc Temp1[8]
jmp short @@14
@@10: xor byte ptr Temp1[10],1
sub ax,ss:[si]
sbb bx,ss:[si+2]
sbb cx,ss:[si+4]
sbb dx,ss:[si+6]
jnc @@11
xor byte ptr Temp1[10],1
not dx
not cx
not bx
not ax
neg J
cmc
adc ax,di
adc bx,di
adc cx,di
adc dx,di
@@11: mov si,64
or dh,dh
js @@14
@@12: dec si
jz @@13
shl J,1
rcl ax,1
rcl bx,1
rcl cx,1
adc dx,dx
jns @@12
sub si,64
add Temp1[8],si
jmp @@14
@@13: mov Temp1[8],0
mov byte ptr Temp1[10],0
jmp short @@16
@@14: shl J,1
adc ax,di
adc bx,di
adc cx,di
adc dx,di
jnc @@15
rcr dx,1
inc Temp1[8]
@@15: cmp Temp1[8],7fffh
jae @@17
cmp Temp1[8],0
je @@18
@@16: les di,A
cld
stosw
xchg ax,bx
stosw
xchg ax,cx
stosw
xchg ax,dx
stosw
mov ax,Temp1[8]
shl ax,1
or al,byte ptr Temp1[10]
ror ax,1
stosw
jmp short @@20
@@17: mov Temp1[8],7fffh
jmp short @@19
@@18: mov Temp1[8],0
@@19: sub ax,ax
mov bx,ax
mov cx,ax
mov dx,ax
jmp @@16
@@20: pop di si
Exit
Argm A,dword,1
Argm B,dword,1
Entry ExtAdd
mov al,0
push ax
push A
push B
call AddSub
Exit
Argm A,dword,1
Argm B,dword,1
Entry ExtSub
mov al,1
push ax
push A
push B
call AddSub
Exit
Argm A,dword,1
Argm B,dword,1
Loc Temp2,word,6
Loc Temp1,word,6
Entry ExtMul
push si di
push ds
lds si,A
lea di,Temp1
call Break
lds si,B
lea di,Temp2
call Break
pop ds
mov cl,byte ptr Temp2[10]
xor byte ptr Temp1[10],cl
mov bx,Temp2[8]
mov ax,Temp1[8]
cmp ax,7fffh
jae @@5
cmp bx,7fffh
jae @@9
cmp ax,bx
jb @@1
xchg ax,bx
@@1: or ax,ax
jz @@3
add ax,bx
sub ax,3ffeh
jb @@3
jmp @@13
@@2: mov di,7fffh
mov dx,8000h
jmp short @@4
@@3: sub di,di
mov dx,0
@@4: sub ax,ax
mov bx,ax
mov cx,ax
jmp @@22
@@5: cmp Temp2[8],0
je @@6
push ss
lea ax,Temp1
push ax
call CheckNan
or ax,ax
jz @@7
@@6: jmp short @@12
@@7: les bx,A
and word ptr es:[bx+8],7fffh
test Temp1[10],0ffh
jz @@8
les bx,A
xor word ptr es:[bx+8],8000h
@@8: jmp @@23
@@9: cmp Temp1[8],0
je @@10
push ss
lea ax,Temp2
push ax
call CheckNan
or ax,ax
jz @@11
@@10: jmp short @@12
@@11: mov di,7fffh
mov ax,Temp2[0]
mov bx,Temp2[2]
mov cx,Temp2[4]
mov dx,Temp2[6]
jmp @@22
@@12: mov dx,0c000h
mov di,7fffh
jmp @@4
@@13: mov Temp1[8],ax
sub di,di
mov cx,di
mov si,di
test byte ptr Temp2[3],80h
jz @@14
mov cx,Temp1[0]
mov si,Temp1[2]
@@14: test byte ptr Temp1[3],80h
jz @@15
add cx,Temp2[0]
adc si,Temp2[2]
adc di,di
test byte ptr Temp2[3],80h
jz @@15
dec di
@@15: sub bx,bx
mov ax,Temp2[0]
mul Temp1[4]
add cx,ax
adc si,dx
adc di,0
mov ax,Temp2[4]
or ax,ax
jz @@16
mul Temp1[0]
add cx,ax
adc si,dx
adc di,0
mov ax,Temp2[4]
mul Temp1[2]
add si,ax
adc di,dx
adc bx,0
@@16: mov ax,Temp2[0]
mul Temp1[6]
add si,ax
adc di,dx
adc bx,0
mov ax,Temp2[2]
mul Temp1[4]
add si,ax
adc di,dx
adc bx,0
mov ax,Temp2[6]
or ax,ax
jz @@17
mul Temp1[0]
add si,ax
adc di,dx
adc bx,0
@@17: sub cx,cx
push si
mov si,cx
mov ax,Temp2[2]
mul Temp1[6]
add di,ax
adc bx,dx
adc cx,0
mov ax,Temp2[4]
or ax,ax
jz @@18
mul Temp1[4]
add di,ax
adc bx,dx
adc cx,0
mov ax,Temp2[4]
mul Temp1[6]
add bx,ax
adc cx,dx
adc si,0
@@18: mov ax,Temp2[6]
or ax,ax
jz @@19
mul Temp1[2]
add di,ax
adc bx,dx
adc cx,0
adc si,0
mov ax,Temp2[6]
mul Temp1[4]
add bx,ax
adc cx,dx
adc si,0
mov ax,Temp2[6]
mul Temp1[6]
add cx,ax
adc si,dx
@@19: mov dx,si
xchg ax,di
pop si
mov di,Temp1[8]
or dx,dx
js @@20
dec di
shl si,1
rcl ax,1
rcl bx,1
rcl cx,1
rcl dx,1
@@20: shl si,1
adc ax,0
adc bx,0
adc cx,0
adc dx,0
jnc @@21
rcr dx,1
inc di
@@21: cmp di,7fffh
jb @@22
jmp @@2
@@22: mov si,di
les di,A
cld
stosw
xchg ax,bx
stosw
xchg ax,cx
stosw
xchg ax,dx
stosw
xchg ax,si
shl ax,1
or al,byte ptr Temp1[10]
ror ax,1
stosw
@@23: pop di si
Exit
Argm A,dword,1
Argm B,dword,1
Loc M,byte,1
Loc N,byte,1
Loc K,word,1
Loc Q,word,1
Loc P,word,1
Loc Acc,word,4
Loc Temp2,word,6
Loc Temp1,word,6
Entry ExtDiv
push si di
mov K,0
push ds
lds si,A
lea di,Temp1
call Break
lds si,B
lea di,Temp2
call Break
pop ds
mov al,byte ptr Temp1[10]
xor al,byte ptr Temp2[10]
mov byte ptr Q,al
mov si,Temp2[8]
mov ax,Temp1[8]
cmp si,7fffh
jae @@3
cmp ax,7fffh
jae @@5
or si,si
jz @@1
or ax,ax
jz @@5
add ax,3ffeh
sub ax,si
jb @@3
jmp @@7
@@1: mov dx,7fffh
mov si,8000h
or ax,ax
jnz @@4
@@2: mov dx,7fffh
mov si,0c000h
jmp short @@4
@@3: sub dx,dx
sub si,si
cmp ax,7fffh
je @@2
@@4: sub ax,ax
mov bx,ax
mov cx,ax
jmp @@20
@@5: les bx,A
and word ptr es:[bx+8],7fffh
test Q,0ffh
jz @@6
les bx,A
xor word ptr es:[bx+8],8000h
@@6: jmp @@21
@@7: mov P,ax
sub cx,cx
mov dx,Temp1[6]
mov si,Temp2[6]
cmp si,dx
ja @@8
sub dx,si
inc cx
@@8: mov ax,Temp1[4]
div si
adc ax,1
adc cl,ch
mov M,cl
mov Acc[6],ax
push ax
mov ax,Temp2[0]
mov bx,Temp2[2]
jcxz @@10
mov dx,Temp2[4]
@@9: sub Temp1[0],ax
sbb Temp1[2],bx
sbb Temp1[4],dx
sbb Temp1[6],si
loop @@9
@@10: pop si
mul si
mov K,ax
xchg ax,dx
xchg ax,bx
mul si
add bx,ax
adc cx,dx
mov ax,Temp2[4]
mul si
add cx,ax
adc dx,0
xchg ax,dx
xchg ax,si
mul Temp2[6]
add ax,si
adc dx,0
sub bx,Temp1[0]
sbb cx,Temp1[2]
sbb ax,Temp1[4]
sbb dx,Temp1[6]
mov Temp1[0],bx
mov Temp1[2],cx
mov Temp1[4],ax
mov si,Temp2[6]
div si
xchg ax,cx
div si
sub dx,dx
stc
adc ax,dx
adc cx,dx
sub dx,ax
mov Acc[4],dx
sbb Acc[6],cx
sbb M,0
push ax
mov ax,Temp2[0]
mov bx,Temp2[2]
jcxz @@12
mov dx,Temp2[4]
@@11: sub K,ax
sbb Temp1[0],bx
sbb Temp1[2],dx
sbb Temp1[4],si
loop @@11
@@12: pop si
mul si
xchg ax,dx
xchg ax,bx
mul si
add bx,ax
adc cx,dx
mov ax,Temp2[4]
mul si
add cx,ax
adc dx,0
xchg ax,dx
xchg ax,si
mul Temp2[6]
add ax,si
adc dx,0
sub bx,K
sbb cx,Temp1[0]
sbb ax,Temp1[2]
sbb dx,Temp1[4]
mov K,bx
mov Temp1[0],cx
mov Temp1[2],ax
mov si,Temp2[6]
div si
xchg ax,cx
div si
sub dx,dx
stc
adc ax,dx
adc cx,dx
mov Acc[2],ax
add Acc[4],cx
adc Acc[6],dx
adc M,dl
xchg ax,si
mov dx,Temp2[2]
xchg ax,dx
mov bx,Temp2[4]
jcxz @@14
@@13: sub K,ax
sbb Temp1[0],bx
sbb Temp1[2],dx
loop @@13
@@14: mul si
xchg ax,dx
xchg ax,bx
mul si
add bx,ax
adc cx,dx
mov ax,Temp2[6]
mul si
add ax,cx
adc dx,0
sub bx,K
sbb ax,Temp1[0]
sbb dx,Temp1[2]
mov K,bx
mov Temp1[0],ax
mov si,Temp2[4]
add si,si
mov si,Temp2[6]
adc si,0
jnc @@15
xchg bx,dx
jmp short @@16
@@15: shl bx,1
rcl ax,1
rcl dx,1
div si
xchg ax,bx
div si
shr bx,1
rcr ax,1
rcr dh,1
@@16: mov cx,-1
mov si,cx
mov dl,cl
not bx
not ax
neg dh
cmc
adc ax,0
adc bx,Acc[2]
adc cx,Acc[4]
adc si,Acc[6]
adc dl,M
shr dl,1
jnc @@17
rcr si,1
rcr cx,1
rcr bx,1
rcr ax,1
rcr dh,1
inc P
@@17: sub di,di
add dh,dh
adc ax,di
adc bx,di
adc cx,di
adc si,di
adc dl,0
mov dx,P
jz @@18
mov si,8000h
inc dx
@@18: cmp dx,7fffh
jb @@19
jmp @@1
@@19: cmp dx,7fffh
jb @@20
jmp @@1
@@20: les di,A
cld
stosw
xchg ax,bx
stosw
xchg ax,cx
stosw
xchg ax,si
stosw
xchg ax,dx
shl ax,1
or al,byte ptr Q
ror ax,1
stosw
@@21: pop di si
Exit
Argm A,dword,1
Argm B,dword,1
Entry ExtCmp
push si di
push ds
lds si,A
les di,B
mov ax,[si+8]
mov dx,es:[di+8]
sub bx,bx
shl ax,1
rcr bl,1
shl dx,1
rcr bh,1
mov cx,ax
or cx,dx
jcxz @@1
cmp bl,bh
jg @@6
jl @@4
cmp ax,dx
jb @@3
ja @@5
mov ax,[si+6]
cmp ax,es:[di+6]
jne @@2
mov ax,[si+4]
cmp ax,es:[di+4]
jne @@2
mov ax,[si+2]
cmp ax,es:[di+2]
jne @@2
mov ax,[si]
cmp ax,es:[di]
jne @@2
@@1: sub ax,ax
jmp short @@7
@@2: ja @@5
@@3: or bl,bl
jnz @@6
@@4: mov ax,-1
jmp short @@7
@@5: or bl,bl
jnz @@4
@@6: mov ax,1
@@7: or ax,ax
pop ds
jmp short @@8
@@8: pop di si
Exit
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -