957
技術社區[雲棲]
[原創]匯編實現大數乘除運算的雛形
大數乘除的匯編代碼
;******************
;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
;上麵是無符號除法,帶符號除法隻要對以上簡單改進即可,詳細如下:
;判斷兩個除數,分別置 af,bf 位
;若:af=0,bf=0,則直接計算
;af=1,bf=1,先對兩除數求補,然後計算
;af=1,bf=0 or af=0,bf=1 先將負數求補,計算,然後將結果求補。
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
最後更新:2017-04-02 00:06:21