基础知识
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过程如下: