为什么这个除法会溢出...

moliliang 2009-07-21 04:36:45

;ax = 12666 (十进制的) 下面的循环用于取得其中的商和余数,并将余数+30h 得到ASCII码
mov bx,10 ;除数
s:
div bx ;ax/10 余数放入dx 商放入ax
mov cx,ax ;将ax放入cx,便于后面的jcxz指令
jcxz overJmpByS
add dx,30h
mov ds:[si],dl ;将转换后的字符串放入 data
inc si
jmp short s


AX=04F2 BX=000A CX=04F2 DX=0036 SP=FFFE BP=0000 SI=0001 DI=0000
DS=0BC2 ES=0BB2 SS=0BC2 CS=0BC3 IP=002B NV UP EI PL NZ NA PO NC
0BC3:002B EBF2 JMP 001F
-t

AX=04F2 BX=000A CX=04F2 DX=0036 SP=FFFE BP=0000 SI=0001 DI=0000
DS=0BC2 ES=0BB2 SS=0BC2 CS=0BC3 IP=001F NV UP EI PL NZ NA PO NC
0BC3:001F F7F3 DIV BX
-t

Divide overflow

Program terminated normally

源代码在最上面..这个是我用debug 调试, 在进行第二次除法的时候(也就是12666 / 10 ax=1266=04F2h) 的时候,
DIV BX 就提示 除法溢出..然后程序结束..我觉得没有溢出吧..- -?
...全文
153 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
moliliang 2009-07-21
  • 打赏
  • 举报
回复
原来如此....谢谢楼上!!
gemini_star 2009-07-21
  • 打赏
  • 举报
回复
除数BX是16位的,所以DIV指令的被除数是DX:AX。 所以你的被除数不是12666,而是 0x3604F2,除以10当然AX放不下了。

把DX清零试试。

mov bx,10 ;除数
s:
xor dx, dx
div bx ;ax/10 余数放入dx 商放入ax
mov cx,ax ;将ax放入cx,便于后面的jcxz指令
jcxz overJmpByS
add dx,30h
mov ds:[si],dl ;将转换后的字符串放入 data
inc si
jmp short s

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧