王爽汇编语言之处理除法溢出问题

基础知识

div指令是除法指令,除法指令需要注意以下问题。

  • 除数

    除数有8位和16位两种,在一个reg或内存单元中。

  • 被除数

    被除数默认放在 AX 或者 在 DX 和AX中 ,如果除数为8位,则被除数为16位,被除数默认放在AX中。 如果除数为16位,被除数则为32位,被除数分两个寄存器存放,高16位放在DX中,低16位放在AX中。

子程序描述

名称:divdw

功能:进行不会溢出的除法运算,被除数为dword型,除数为 word型,结果为dword型。

参数:(ax) = dword型数据的低16位

(dx) = dword型数据的高16位

(cx) = 除数

返回:(dx) = 结果的高16位

(ax) = 结果的低16位

(cx) = 余数

应用举例:计算1000000/10 (F4240H/0AH)

程序如下:

assume cs:code
	
	code segment
		mov ax,4240h
		mov dx,0fh
		mov cx,0ah
		call divdw
		
		mov ax,4c00h
		int 21h
		
divdw:  push ax
		mov ax,dx  
		mov dx,0  ;被除数的高16位先除,所以将dx置零的原因所在
		
		div cx   ;结果低16位ax存放商,高16位dx存放余数
		mov bx,ax   ;商的高16位放入bx保存,因为题目要求高16位放在dx
		pop ax     ;恢复低16位的被除数,
		div cx    ;结果低16位ax存放商,高16位DX存放余数
		
		mov cx,dx  ;第一次除的结果放在dx中,第二次除默认是放在ax中
		mov dx,bx   ;余数存放在cx
		
		ret
		
	code ends
	end 
		
		
		
		

解题思路

首先将被除数F4240H 分为两部分看待,划分为 0FH 和4240H.

先让0FH 除以除数

divdw:  push ax
		mov ax,dx  
		mov dx,0  
		
		div cx

再让4240H 除以除数

mov bx,ax   
pop ax    
div cx   

注意:这里除完之后,结果的低16位刚好在ax中

最后根据题目要求赋值以下寄存器内容即可

mov cx,dx  
mov dx,bx

ret ;返回主程序

运行结果如下:

 xp系统 debug过程如下:

  • 12
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值