汇编语言 实验10.2(王爽 第三版) 2.编写子程序-解决除法溢出的问题

其他两个子程序:
1.编写子程序-显示字符串 https://blog.csdn.net/qq_41700629/article/details/89426234
3.编写子程序-数值显示 https://blog.csdn.net/qq_41700629/article/details/89447439

2.编写子程序-解决除法溢出的问题

子程序描述
名称:divdw
功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
参数:(ax)=dword型数据的低16位
(dx)=dword型数据的高16位
(cx)=除数
返回:(dx)=结果的高16位,(ax)=结果的低16位
(cx)=余数
应用举例:计算1000000/10(FA240H/0AH)
提示
结出一个公式:
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
公式:X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N
这里的65536为10000H,也就是说,int(H/N)*10000H为高16位的商,而[rem(H/N)*65536+L]/N得到的是低16位的商和余数;
这个公式将可能产生溢出的除法运算:X/N,转变为多个不会产生溢出的除法运算公式中,等号右边的所有除法运算都可以用div指令来做,肯定不会导致溢出。

参考代码:

assume cs:code
data segment

data ends

stack segment 
	dw 0,0,0,0,0,0,0,0
stack ends

code segment
	start:	mov ax,stack
			mov ss,ax
			mov sp,10h      ;设置栈
			
			mov ax,4240h
			mov dx,000fh
			mov cx,0ah
			call divdw
			mov cx,4200h
			int 21h
	divdw:	  
			push ax			;保存被除数低16位
			mov ax,dx
			mov dx,0h
			div cx			;高16位先除
			
			mov si,ax		;高16位先除的商放在si,商还在dx中,当做低16位除的高16位
			pop ax			;恢复低16位到ax中
			div cx
			mov cx,dx		;最终商的余数
			mov dx,si		;高16位先除的商也是最终商的高16位,最终商的低16为就在ax中
			ret
			
code ends
end start

结果图:
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值