[問題] 關於除法指令div的問題

看板ASM (組合語言)作者 (ppttcc)時間14年前 (2010/11/04 15:01), 編輯推噓11(11015)
留言26則, 3人參與, 最新討論串1/2 (看更多)
關於除法指令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)

11/04 16:14, , 1F
你怎麼轉ASCII的
11/04 16:14, 1F

11/04 20:44, , 2F
轉ascii add 30h啊……
11/04 20:44, 2F

11/04 20:46, , 3F
我在tochar中加48到dl中轉成ASCII
11/04 20:46, 3F

11/04 20:59, , 4F
查了一下int 21h,show有覆蓋原本al的值
11/04 20:59, 4F

11/04 21:17, , 5F
一開始的dh是多少
11/04 21:17, 5F

11/04 21:56, , 6F
我沒有設定dh值,是否要作歸零的動作?
11/04 21:56, 6F

11/04 21:58, , 7F
系統搞不好有給他初值,你會用debug看暫存器吧
11/04 21:58, 7F

11/04 21:58, , 8F
在試的過程中有將ax歸零,其他暫存器則沒有
11/04 21:58, 8F

11/04 22:09, , 9F
那我用debug r看看好了,剛才試了下,有無將dx清0,確實會有影
11/04 22:09, 9F

11/04 22:10, , 10F
響,現在第一個字元正常了,後一個字元還要修正
11/04 22:10, 10F

11/04 22:13, , 11F
後一個字元的錯誤是因為int
11/04 22:13, 11F

11/04 23:22, , 12F
trace後的結果是如同您說的,的確是int21h搞的鬼.而且SP似乎
11/04 23:22, 12F

11/04 23:23, , 13F
最後回不去原來呼叫前的位址就中斷了...
11/04 23:23, 13F

11/04 23:25, , 14F
跳躍似乎不在near的範圍?
11/04 23:25, 14F

11/04 23:30, , 15F
int是far jump
11/04 23:30, 15F

11/04 23:33, , 16F
比較奇怪的是,我只用了int 21h的輸出功能,卻呼叫了一堆的函
11/04 23:33, 16F

11/04 23:34, , 17F
11/04 23:34, 17F

11/04 23:35, , 18F
int有點像call,只是改成跳到ISR的位址
11/04 23:35, 18F

11/04 23:36, , 19F
然後ISR再呼叫其他函式
11/04 23:36, 19F

11/04 23:37, , 20F
另一個比較奇怪的地方是,程式似乎沒有正常執行完就中斷
11/04 23:37, 20F

11/04 23:37, , 21F
因為我沒有看到SP有回到最頂端
11/04 23:37, 21F

11/04 23:41, , 22F
沒執行到iret?
11/04 23:41, 22F

11/04 23:54, , 23F
iret是什麼呢?離開debug前看到的指令是REPZ與一個db指令
11/04 23:54, 23F

11/04 23:56, , 24F
iret像副程式的ret,從ISR返回原來程式
11/04 23:56, 24F

11/05 00:07, , 25F
所以我還是定義個變數比較保險...
11/05 00:07, 25F

11/05 00:30, , 26F
我想是debug.exe的問題,我用-t也無法返回
11/05 00:30, 26F
文章代碼(AID): #1Cqbfcpz (ASM)
文章代碼(AID): #1Cqbfcpz (ASM)