作者ppttcc (ppttcc)
看板ASM
标题[问题] 关於除法指令div的问题
时间Thu Nov 4 15:01:55 2010
关於除法指令div的问题
程式目的:将一数除以另一数後将商及余数转成ASCII的数字後输出,
发生一些问题:
1.除数若在13以下显示的结果就会变成divide overflow,但若超过就没有此问题.
2.转成ASCII後完全不是该数字,如20/14後,应是1余6,但转成ASCII输出後,会变成2b,
30/14後,应是2余2,但转成ASCII输出後,会变成字元 < l (L的小写),整个都乱掉
3.若不呼叫 tochar, 则31/14没有输出任何字元.31/17输出3行空白, 35/20输出两颗心号
(ASCII数值为3)
似乎找不到任何规则可debug?
我在怀疑是否有暂存器的数值没清乾净归零,但我用的指令是mov不是add阿?
或者没有初始化暂存器为0?但好像也没效果...
麻烦帮我看看哪里错了,感谢!感谢!
程式码:
mov dl,20
mov ax,dx
mov cl,14
div cl
mov dl,ah ;6
call tochar
call show
mov dl,al ;1
call tochar
call show
exit: mov ah,4ch
int 21h
;--------------------------
tochar proc near
mov bl,48
add dl,bl
ret
tochar endp
show proc near
mov ah,2
int 21h
ret
show endp
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.38.9.137
※ 编辑: ppttcc 来自: 114.38.9.137 (11/04 15:22)
1F:推 loveflames:你怎麽转ASCII的 11/04 16:14
2F:推 jason12308:转ascii add 30h啊…… 11/04 20:44
3F:→ ppttcc:我在tochar中加48到dl中转成ASCII 11/04 20:46
4F:推 loveflames:查了一下int 21h,show有覆盖原本al的值 11/04 20:59
5F:推 loveflames:一开始的dh是多少 11/04 21:17
6F:→ ppttcc:我没有设定dh值,是否要作归零的动作? 11/04 21:56
7F:推 loveflames:系统搞不好有给他初值,你会用debug看暂存器吧 11/04 21:58
8F:→ ppttcc:在试的过程中有将ax归零,其他暂存器则没有 11/04 21:58
9F:→ ppttcc:那我用debug r看看好了,刚才试了下,有无将dx清0,确实会有影 11/04 22:09
10F:→ ppttcc:响,现在第一个字元正常了,後一个字元还要修正 11/04 22:10
11F:推 loveflames:後一个字元的错误是因为int 11/04 22:13
12F:→ ppttcc:trace後的结果是如同您说的,的确是int21h搞的鬼.而且SP似乎 11/04 23:22
13F:→ ppttcc:最後回不去原来呼叫前的位址就中断了... 11/04 23:23
14F:→ ppttcc:跳跃似乎不在near的范围? 11/04 23:25
15F:推 loveflames:int是far jump 11/04 23:30
16F:→ ppttcc:比较奇怪的是,我只用了int 21h的输出功能,却呼叫了一堆的函 11/04 23:33
17F:→ ppttcc:式 11/04 23:34
18F:推 loveflames:int有点像call,只是改成跳到ISR的位址 11/04 23:35
19F:推 loveflames:然後ISR再呼叫其他函式 11/04 23:36
20F:→ ppttcc:另一个比较奇怪的地方是,程式似乎没有正常执行完就中断 11/04 23:37
21F:→ ppttcc:因为我没有看到SP有回到最顶端 11/04 23:37
22F:推 loveflames:没执行到iret? 11/04 23:41
23F:→ ppttcc:iret是什麽呢?离开debug前看到的指令是REPZ与一个db指令 11/04 23:54
24F:推 loveflames:iret像副程式的ret,从ISR返回原来程式 11/04 23:56
25F:→ ppttcc:所以我还是定义个变数比较保险... 11/05 00:07
26F:→ loveflames:我想是debug.exe的问题,我用-t也无法返回 11/05 00:30