作者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