奥普瓯江 发表于 2018-10-16 11:14:06

divdw原理疑问寻求解答

assume cs:code

code 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的

erh 发表于 2018-10-18 17:31:17

因为dx要参与运算,第一次运算没有余数,要清零。第二次余数是要参加运算的,不能清零
页: [1]
查看完整版本: divdw原理疑问寻求解答