现在的位置: 首页 > 综合 > 正文

解决除法溢出问题

2018年01月22日 ⁄ 综合 ⁄ 共 887字 ⁄ 字号 评论关闭

王爽汇编语言第二版实验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

 

抱歉!评论已关闭.