大数乘除的汇编代码
;******************
;A Kinds Production
;******************
;============================
;About MulK,IMulK,DivK,IDivK
;Work On 200410011507 At Home
;============================
data segment
aopr dw 0fffch
bopr dw 0ffch
copr dw ?
result dw ?,?
l1bit dw 1
cmpit dw 11b
l2bit01 dw 1
l2bit10 dw 2
af dw 0
bf dw 0
data ends
;****************************
stack segment stack
dw 256 dup(?)
tos label word
stack ends
;****************************
code segment
assume cs:code,ds:data
assume es:data,ss:stack
MulK macro opr1,opr2
mov ax,opr1
mov bx,opr2
sub dx,dx
mov cx,16d
lop1: test ax,l1bit
jz no
add dx,bx
jmp step1
no: add dx,0
step1: rcr dx,1
rcr ax,1
loop lop1
endm
IMulk macro opr1,opr2
mov ax,opr1
mov bx,opr2
sub dx,dx
test ax,1
jz step2
sub dx,bx
step2: sar dx,1
rcr ax,1
mov cx,15d
lop2: push ax
rcl ax,1
and ax,cmpit
cmp ax,l2bit01
jz yes01
cmp ax,l2bit10
jz yes10
jmp step3
yes01: add dx,bx
jmp step3
yes10: sub dx,bx
step3: pop ax
sar dx,1
rcr ax,1
loop lop2
mov result,ax
mov result+1,dx
endm
DivK macro opr1
mov bx,bopr
mov copr,bx
sub cx,cx
mov aopr,cx
lop3: push ax
sub ax,bopr
push dx
sbb dx,aopr
pop dx
pop ax
jb step4
inc cx
mov bx,copr
add bopr,bx
adc aopr,0
jmp lop3
step4:
sub bopr,bx
sub ax,bopr
mov aopr,ax
mov bopr,cx
endm
IDivK macro opr1,opr2
;上面是无符号除法,带符号除法只要对以上简单改进即可,详细如下:
;判断两个除数,分别置 af,bf 位
;若:af=0,bf=0,则直接计算
;af=1,bf=1,先对两除数求补,然后计算
;af=1,bf=0 or af=0,bf=1 先将负数求补,计算,然后将结果求补。
;省略
endm
start:
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
mov es,ax
mov ax,stack
mov ss,ax
mov sp,tos
;MulK aopr,bopr
;IMulK aopr,bopr
mov dx,0fch
mov ax,0fffch
DivK aopr bopr
mov ah,4ch
int 21h
code ends
;**************************
end start
具体的算法可以参考电子工业的《计算机组成与系统结构》。