【实验十】2.解决除法溢出问题
本帖最后由 Beng! 于 2012-4-20 00:50 编辑绞尽脑汁想出来的方法{:5_99:}
有点繁琐,不知道谁有比较好的方法 学习一下
我的程序如下:
;X/N=int(H/N)*10000H+/N
assume cs:code
stack segment
dw 10 dup (0)
stack ends
code segment
start:mov ax,stack
mov ss,ax
mov sp,20
mov ax,0
mov ax,4240h
mov dx,000fh
mov cx,0ah
call divdw ;(sp)=(x)
mov ax,4c00h
int 21h
divdw:push ax;(sp)=(x-2)
push dx;(sp)=(x-4)
;思路是先计算 int(H/N)*10000H的值,再计算/N 的值。
;int(H/N)*10000H=int(H/N)*8000H*2
pop ax ;取出H ;(sp)=(x-2)
mov dx,0 ;初始化DX
div cx ;H/N 取商ax=1,dx=5
mov bx,8000h
mul bx ;高位dx,低位ax
sub sp,2 ;(sp)=(x-4)
push dx ;保存高位dx,(sp)=(sp-6)
mov bx,2
mul bx ;高位dx1,低位ax1(一定为0)
pop ax ;取出dx,(sp)=(x-4)
push dx ;保存dx1,(sp)=(sp-6)
mul bx ;高位dx2(一定为0),低位ax2
pop bx ;(sp)=(x-4)
add ax,bx ;完成 int(H/N)*1000H
push ax ;保存 int(H/N)*1000H 的值,(sp)=(x-6)
add sp,2 ;(sp)=(x-4)
pop ax ;取出H(sp)=(x-2)
div cx ;取余数 dx
mov ax,dx
mov bx,8000h
mul bx ;高位dx,低位ax
sub sp,4 ;(sp)=(x-6)
push dx ;保存高位dx,(sp)=(x-8)
mov bx,2
mul bx ;高位dx1,低位ax1(一定为0)
pop ax ;取出dx,(sp)=(x-6)
push dx ;保存dx1,(sp)=(x-8)
mul bx ;高位dx2(一定为0),低位ax2
pop bx ;(sp)=(x-6)
add ax,bx ;完成 rem(H/N)*1000H
add sp,4 ;(sp)=(x-2)
mov dx,ax ;将高位转移到dx
pop ax ;取出L(sp)=(x),完成
div cx ;/N
sub sp,6 ;(sp)=(x-6)
pop dx ;(sp)=(x-4)
add sp,4;(sp)=(x)
ret
code ends
end start
本帖最后由 hxs554f 于 2012-4-20 12:36 编辑
;半年前写的,拿来分享一下
;设计一个子程序,用于解决除法溢出问题。被除数为dword型,除数为word型
assume cs:code,ds:date
date segment
dd 33333333h ;放置被除数
dw 2222h ;放置除数
db 16 dup (0);用于存放结果,低8位放商,高8位放余数
date ends
code segment
start: mov ax,date
mov ds,ax
call s
mov ax,4c00h
int 21h
s: mov bx,0
mov cx, ;放置除数 注意这是数字,两个数字为一个字节
mov ax, ;将被除数的高8位放在ax中
mov dx,0 ;将dx置零
div cx
push ax ;将高位的除法结果保护起来
mov ax, ;将被除数的低8位放在ax中
div cx ;注意,16位除法默认dx放高位,ax放低位。
;而之前除法的余数是放在dx中 公式:X/N=int(H/N)*65536+/N
mov ,dx ;将结果的余数放入
mov ,ax ;将商的低位放入
pop ax
mov ,ax ;将商的高位放入
ret
code ends
end start hxs554f 发表于 2012-4-20 12:35 static/image/common/back.gif
;半年前写的,拿来分享一下
;设计一个子程序,用于解决除法溢出问题。被除数为dword型,除数为word型
ass ...
终于看明白内个公式是怎么回事了~
谢谢亲{:5_106:}
页:
[1]