鱼C论坛

 找回密码
 立即注册
查看: 2470|回复: 6

X86汇编求教个除法的问题

[复制链接]
发表于 2013-5-14 22:38:19 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 s0512 于 2013-5-25 15:23 编辑

mov ax,12666
mov cx,5
s: mov dx,0
   mov bx,10
   div bx
   loop s
如上代码,这样的是可以循环的
但是改成这样
   mov ax,12666
   mov cx,5
s: mov bl,10
   div bl
   loop s
这样就不能循环了呢??CX在哪里发生了改变??
上面的代码,逻辑上应该是对的吧?
被除数AX16位,除数bl为8位


经过本人自己测试,是不是因为div溢出的原因?因为12666/10 = 1266 ....6而1266无法在al中保存?
所以这个要用16位除法?
不知道我想的对不对?




最佳答案

查看完整内容

首先,看div的定义,如果除数为8位,则被除数是16位,除数为16位,则被除数为32位 结果:除数为8位,则AL存商,AX存余数。 除数为16位,则AX存商,DX存余数。 首先看楼主的第一段代码,因为除数为16位,所以是32位除以16位的除法。 12666/10 商为1266,余数为6 。此时ax = 1266 dx = 6; 再来看楼主的第二段代码 ,因为除数为8位,所以是16位除以8位的除法。12666/10,12666/10 商为1266,余数为6 。商为ah ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-5-14 22:38:20 | 显示全部楼层
首先,看div的定义,如果除数为8位,则被除数是16位,除数为16位,则被除数为32位

结果:除数为8位,则AL存商,AX存余数。
         除数为16位,则AX存商,DX存余数。


首先看楼主的第一段代码,因为除数为16位,所以是32位除以16位的除法。 12666/10  商为1266,余数为6 。此时ax = 1266 dx = 6;

再来看楼主的第二段代码 ,因为除数为8位,所以是16位除以8位的除法。12666/10,12666/10  商为1266,余数为6 。商为ah,ah是8位的,最多能表示的数字为255。1266>255 越界了。
其实是程序除法越界了,然后触发了中断例程,所以你的程序就没有继续跑了

评分

参与人数 1鱼币 +2 收起 理由
s0512 + 2 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-15 01:08:10 | 显示全部楼层
撸过拿分~~~~~~~~~~~~~楼下会帮你的!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-5-15 22:59:57 | 显示全部楼层

我昨天测试大概也想到了这个原因,可能是div溢出的原因,但是说到什么中断的还没学到..:(
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-16 00:07:27 | 显示全部楼层
z351522453 发表于 2013-5-15 22:59
我昨天测试大概也想到了这个原因,可能是div溢出的原因,但是说到什么中断的还没学到..

后面会说到中断例程。这里可以稍微说一下,就是,当程序发生异常时,cpu优先处理异常例程,程序就会被中断挂起。共同学习,加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-19 19:30:29 | 显示全部楼层
真是被感动的痛哭流涕……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-24 18:58:45 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 12:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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