鱼C论坛

 找回密码
 立即注册
查看: 2003|回复: 1

divdw原理疑问寻求解答

[复制链接]
发表于 2018-10-16 11:14:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. assume cs:code

  2. code segment
  3. start: mov ax, 4240H
  4.          mov dx, 000FH
  5.          mov cx, 0AH
  6.          
  7.          call divdw
  8.         
  9.          mov ax, 4c00h
  10.         int 21h

  11. divdw: push ax             ;先计算高位所以先把低位的压入栈中
  12.          mov ax, dx          ;把高位中的数据导入ax中以备div预算时使用
  13.          mov dx, 0           ;先把dx初始化为0这个应该hi必须的,因为我尝试了不初始化debug会自动终端程序的运转,在这里我想问一下为什么呢,难道cpu中还有一定的判断机制么因为他编译的时候是通过的,只有运行的时候会崩溃
  14.          
  15.          div cx                  ;用div计算cx是除数ax中储存着背除数,在这里除数是16位的同样被被除数掉用了32位的,也就是掉用了ax和dx两个寄存器用作被除数的储存,不知道我这么理解对不
  16.          mov bx, ax           ;把计算好的ax先放在bx中储存,因为我们下面还需要执行div命令还需掉用ax寄存器
  17.          pop ax                  ;把栈中一开始储存进去的低位数取出放入ax中
  18.          
  19.          div cx                    ;继续执行div命令,这里我有些问题没有弄明白,第一这个为什么上一个div命令剩下的余数可以在这里背掉用,这个程序上一个div余数是5他被用到了这个div命令中这个diiv是54240H除以0AH这是为什么呢难道是有这种公式么?
  20.          mov cx, dx            ;把最后得到的余数传给cx
  21.          mov dx, bx            ;把高位得到的商传给dx,低位得到的商已在div计算的时候传给了ax
  22.          
  23.          ret                        ;返回divdw
  24. code ends
  25. end start
复制代码

这里我还有一个疑问为什么第一次dx中不是零确不能计算,但是第二次确可以计算因为第二次执行div命令的时候,dx中是有余数5的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-18 17:31:17 | 显示全部楼层
因为dx要参与运算,第一次运算没有余数,要清零。第二次余数是要参加运算的,不能清零
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 12:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表