『香`草の゛芭芙 发表于 2012-7-16 13:11:59

关于DIV,,,求助~~~~

assume cs:code
code segment
ks: mov ax,317ah
mov bx,0
mov bl,10d
div bl
mov ax,4c00h
int 21h
code ends
end ks

课本上写着 除数 能用 8位 寄存器存放 且 被除数 可用ax 寄存器存放的话,   需要进行 8位的除法....

可是上面的ax, 和bl 满足条件了啊,,,,为什么 debug中 "Divide error"呢? {:5_96:}

wAterLoo 发表于 2012-7-16 13:12:00

本帖最后由 wAterLoo 于 2012-7-17 00:10 编辑

『香`草の゛芭芙 发表于 2012-7-16 21:42 static/image/common/back.gif
嗯,那有什么办法可以快速 判断 需要16位除法 或者 8位 除法呢,,,总不能每次都得用计算器 事先 算一下 ...
可以换成16位的除法
xor dx,dx
xor bx,bx
mov ax,317AH
mov bl,0AH
div bx

书中也提到过解决方法,好像是重新定义一个除法的方法
貌似是这样子实现的
把被除数的高8位和低8位分开,分别除以8位数的除数,最后将高8位保存在ah,低8位保存在al
这样,ax保存的就是你要的结果了

不知道我这样说你明白了没有,表达能力有限 - -





LLCK910 发表于 2012-7-16 14:14:02

mov bl,10d   调试了一下 大概是这句出了问题...... 10d转换成10进制是269大于8位寄存器存储的最大值 255 要不楼主换个数来试下

wAterLoo 发表于 2012-7-16 14:16:45

除法溢出,317aH/10d=4F2H,al不能容纳4F2H 8位数的除法,商保存在al,余数保存在ah,如果商大于al的最大容纳量,就会发生出发溢出的错误

LLCK910 发表于 2012-7-16 14:18:03

呵呵 学到了楼上才是正解

PiraHzq 发表于 2012-7-16 21:18:19

3楼 正解= =

『香`草の゛芭芙 发表于 2012-7-16 21:42:42

wAterLoo 发表于 2012-7-16 14:16 static/image/common/back.gif
除法溢出,317aH/10d=4F2H,al不能容纳4F2H 8位数的除法,商保存在al,余数保存在ah,如果商大于al的最大容 ...

嗯,那有什么办法可以快速 判断 需要16位除法 或者 8位 除法呢,,,总不能每次都得用计算器 事先 算一下商是几位的吧? 还是统一都用16位 除法不会出错呢?(没试过){:5_99:}

『香`草の゛芭芙 发表于 2012-7-17 00:47:26

xor dx,dx   ; 我的debug 怎么认不出来这个 ,,,提示无效的符号,,,,我改成mov dx,0了
xor bx,bx
mov ax,317AH
mov bl,0AH
div bx      ; div bx的话,,,就变成了 16位除法了,,,,不会出错,,,,bx改成bl 就又溢出
1001/100 用8位除法 AX会 010AH,,,用16位除法   DX=0001H,,,AX=000AH 2个结果都没错, 只是存储位置变了....总结得出 16位除法能代替8位除法 {:5_96:}
页: [1]
查看完整版本: 关于DIV,,,求助~~~~