divdw原理疑问寻求解答
assume cs:codecode segment
start: mov ax, 4240H
mov dx, 000FH
mov cx, 0AH
call divdw
mov ax, 4c00h
int 21h
divdw: push ax ;先计算高位所以先把低位的压入栈中
mov ax, dx ;把高位中的数据导入ax中以备div预算时使用
mov dx, 0 ;先把dx初始化为0这个应该hi必须的,因为我尝试了不初始化debug会自动终端程序的运转,在这里我想问一下为什么呢,难道cpu中还有一定的判断机制么因为他编译的时候是通过的,只有运行的时候会崩溃
div cx ;用div计算cx是除数ax中储存着背除数,在这里除数是16位的同样被被除数掉用了32位的,也就是掉用了ax和dx两个寄存器用作被除数的储存,不知道我这么理解对不
mov bx, ax ;把计算好的ax先放在bx中储存,因为我们下面还需要执行div命令还需掉用ax寄存器
pop ax ;把栈中一开始储存进去的低位数取出放入ax中
div cx ;继续执行div命令,这里我有些问题没有弄明白,第一这个为什么上一个div命令剩下的余数可以在这里背掉用,这个程序上一个div余数是5他被用到了这个div命令中这个diiv是54240H除以0AH这是为什么呢难道是有这种公式么?
mov cx, dx ;把最后得到的余数传给cx
mov dx, bx ;把高位得到的商传给dx,低位得到的商已在div计算的时候传给了ax
ret ;返回divdw
code ends
end start
这里我还有一个疑问为什么第一次dx中不是零确不能计算,但是第二次确可以计算因为第二次执行div命令的时候,dx中是有余数5的 因为dx要参与运算,第一次运算没有余数,要清零。第二次余数是要参加运算的,不能清零
页:
[1]