解决除法溢出问题

王爽汇编语言第二版实验10.2


一、实验要求

      当用div指令进行8位除法运算时结果大于8位,或进行16位除法运算结果大于16位时,会出现除法溢出的错误。要求编写一个子程序,实现支持结果不会出现溢出的除法运算


二、算法概述

      通过一个公式将可能产生溢出的运算X/N,转变为多个不会产生溢出的除法运算。公式中,等号右边的所有除法运算都可以用div指令来实现,并且不会产生除法溢出

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

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

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

H:X的高16位

L:X的低16位

int():描述性运算符,取商

ram():描述性运算符,取余数

 

 


三、程序接口

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


四、实现代码

divdw:  ;子程序定义开始

       push bx

      

       push ax

       mov ax,dx

       mov dx,0

       div cx

       mov bx,ax

       pop ax

       div cx

       mov cx,dx

       mov dx,bx

 

       pop bx

       ret


五、测试代码

assume cs:codesg,ss:stacksg


stacksg segment


dw 8 dup (0)


stacksg ends


codesg segment
start:


mov ax,stacksg
mov ss,ax
mov sp,16
 
mov ax,4240h
mov dx,000fh
mov cx,0ah
call divdw
 
mov ax,4c00h
int 21h

codesg ends

end start


六、测试结果

在执行后,测试除法命令的商为dx*16+ax,余数cx

207

posted @ 2009-12-27 19:34  石莹  阅读(2132)  评论(0编辑  收藏  举报