《汇编语言》 王爽版 实验10-2应用实例

问题描述:解决除法溢出的问题

功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型 
参数:(ax)=dword型数据的低16位 
  (dx)=dword型数据的高16位 
  (cx)=除数 
返回:(ax)=商的低16位 
  (dx)=商的高16位 
  (cx)=余数

公式:X/N = int(H/N)*65536+[rem(H/N)*65536+L]/N

X:被除数,范围:[0, FFFFFFFF]

N:除数,范围:[0, FFFF]

H:X高16位,范围:[0, FFFF]

L:X低16位,范围:[0, FFFF]

int():描述性运算符,取商,比如,int(38/10)=3

rem():描述性运算符,取余数,比如,rem(38/10)=8


注意:1.以cx存储除数,除数为16位,根据div使用,ax存储商,dx存储余数

         2.公式解析:65536=10000H=2^16

            格式中*65536意思是向左移16位,即移向高位。因此,int(H/N)为计算结果的高位,根据要求,结果存入dx。rem(H/N)*65536将高位运算中的余数放入低位运算中的高位上,即进行[rem(H/N)*65536+L]/N运算是

将rem(H/N)放入dx中,将L放入ax中的div运算。

            结果:DX中存放int(H/N),AX中存放(rem(H/N)*65536+L)/N的商,CX中存放(rem(H/N)*65536+L)/N的余数

       

assume cs:code

code segment
start:
mov ax,4240H
mov dx,000FH
mov cx,0AH
call divdw
mov ax,4c00h
int 21h

;;解决除法溢出问题,注意入栈出栈顺序
divdw:
push ax  ;将ax入栈,这样进行除法运算时,更改ax数值对后面ax计算没有影响
mov ax,dx
mov dx,0
div cx
mov bx,cx
mov cx,dx
mov dx,ax
pop ax
push dx  ;将dx入栈,因为进行16位除数运算时,dx存储余数
mov dx,cx
div bx
mov cx,dx
pop dx
ret


code ends
end start

           

链接中文章讲得更清楚

http://www.cnblogs.com/cxjchen/archive/2013/03/19/2968824.html



猜你喜欢

转载自blog.csdn.net/carrie17/article/details/78444296