MOV BX,1234H
MUL BX;这样DX:AX中保存的就是两数的乘积,DX高16位,AX低16位
MOV AX,1234H
XOR DX,DX;DX:AX中保存被除数
MOV BX,0123H;除数
DIV BX;结果的商存在AX,余数存在DX输入输出的ASC转换我想你是会是,所以就不写了。我只提供32位运算程序。以下程序是试算通过的。
1、在数据段定义4个运算变量
;===============================
;32位运算变量
;===============================
data4 dw
data3 dw
data2 dw
data1 dw
2、以下是加、减、乘、除的4个子程序
;
;32位运算
;
;===============================
;32位符号数的加法运算
;入: DXAX=32位 *** 作数1
; CXBX=32位 *** 作数2
;出: DXAX=两 *** 作数的和
; OF=1: 溢出
; OF=0: 正常
;===============================
subn_add32 proc near
add ax,bx
adc dx,cx
ret
subn_add32 endp
;===============================
;32位符号数的减法运算
;入: DXAX=32位 *** 作数1
; CXBX=32位 *** 作数2
;出: DXAX= *** 作数1- *** 作数2的差
; OF=1: 溢出
; OF=0: 正常
;===============================
subn_sub32 proc near
sub ax,bx
sbb dx,cx
ret
subn_sub32 endp
;===============================
;32位符号数的乘法运算
;入: DXAX=32位 *** 作数1
; CXBX=32位 *** 作数2
;出: CXBXDXAX=两 *** 作数积
;===============================
subn_mul32 proc near
push di
xor di,di
test dh,80h
jz sss_1
mov di,1
not dx
not ax
add ax,1
adc dx,0
sss_1:
test ch,80h
jz sss_2
not cx
not bx
add bx,1
adc cx,0
xor di,1
sss_2:
call subn_32x32
test di,1
jz sss_out
not ax
not bx
not cx
not dx
add ax,1
adc dx,0
adc bx,0
adc cx,0
sss_out:
pop di
ret
subn_mul32 endp
;===============================
;32位符号数的除法运算
;入: DXAX=32位被除数
; CXBX=32位除数
;出:DXAX=商
; CXBX=余数(绝对值)
;===============================
subn_div32 proc near
push di
xor di,di
test dh,80h
jz sss_1
mov di,1
not dx
not ax
add ax,1
adc dx,0
sss_1:
test ch,80h
jz sss_2
not cx
not bx
add bx,1
adc cx,0
xor di,1
sss_2:
call subn_32v32
test di,1
jz sss_out
not ax
not dx
add ax,1
adc dx,0
sss_out:
pop di
ret
subn_div32 endp
;以下是内部子程序
;===============================
;无符号数的32位值乘32位值
;入: DXAX=被乘数
; CXBX=乘数
;出: cx=积的高64位
; bx=积的高48位
; dx=积的高32位
; ax=积的低16位
;===============================
subn_32x32 proc near
push si
push di
mov data1,0
mov data2,0
mov data3,0
mov data4,0
mov si,ax
mov di,dx
mul bx
mov data2,dx
mov data1,ax
mov ax,di
mul bx
add data2,ax
adc data3,dx
mov ax,si
mul cx
add data2,ax
adc data3,dx
adc data4,0
mov ax,di
mul cx
add data3,ax
adc data4,dx
mov cx,data4
mov bx,data3
mov dx,data2
mov ax,data1
pop di
pop si
ret
subn_32x32 endp
;===============================
;无符号数的32位值除以16位值
;入:DXAX=被除数
; CX=除数
;出:DXAX=商
; BX=余数
;===============================
subn_32v16 proc near
push ax
mov ax,dx
mov dx,0
div cx
mov bx,ax
pop ax
div cx
xchg bx,dx
ret
subn_32v16 endp
;===============================
;无符号数的32位值除以32位值
;入:DXAX=被除数
; CXBX=除数
;出:DXAX=商
; CXBX=余数
;===============================
subn_32v32 proc near
test cx,cx
jnz sss_1
mov cx,bx
call subn_32v16
xor cx,cx
ret
sss_1:
push di
xor di,di
sss_lp1:
sub ax,bx
sbb dx,cx
jc sss_out
inc di
jmp sss_lp1
sss_out:
add bx,ax
adc cx,dx
mov ax,di
mov dx,0
pop di
ret
subn_32v32 endp
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)