看板 ASM 關於我們 聯絡資訊
關於除法指令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)
loveflames:你怎麼轉ASCII的 11/04 16:14
jason12308:轉ascii add 30h啊…… 11/04 20:44
ppttcc:我在tochar中加48到dl中轉成ASCII 11/04 20:46
loveflames:查了一下int 21h,show有覆蓋原本al的值 11/04 20:59
loveflames:一開始的dh是多少 11/04 21:17
ppttcc:我沒有設定dh值,是否要作歸零的動作? 11/04 21:56
loveflames:系統搞不好有給他初值,你會用debug看暫存器吧 11/04 21:58
ppttcc:在試的過程中有將ax歸零,其他暫存器則沒有 11/04 21:58
ppttcc:那我用debug r看看好了,剛才試了下,有無將dx清0,確實會有影 11/04 22:09
ppttcc:響,現在第一個字元正常了,後一個字元還要修正 11/04 22:10
loveflames:後一個字元的錯誤是因為int 11/04 22:13
ppttcc:trace後的結果是如同您說的,的確是int21h搞的鬼.而且SP似乎 11/04 23:22
ppttcc:最後回不去原來呼叫前的位址就中斷了... 11/04 23:23
ppttcc:跳躍似乎不在near的範圍? 11/04 23:25
loveflames:int是far jump 11/04 23:30
ppttcc:比較奇怪的是,我只用了int 21h的輸出功能,卻呼叫了一堆的函 11/04 23:33
ppttcc:式 11/04 23:34
loveflames:int有點像call,只是改成跳到ISR的位址 11/04 23:35
loveflames:然後ISR再呼叫其他函式 11/04 23:36
ppttcc:另一個比較奇怪的地方是,程式似乎沒有正常執行完就中斷 11/04 23:37
ppttcc:因為我沒有看到SP有回到最頂端 11/04 23:37
loveflames:沒執行到iret? 11/04 23:41
ppttcc:iret是什麼呢?離開debug前看到的指令是REPZ與一個db指令 11/04 23:54
loveflames:iret像副程式的ret,從ISR返回原來程式 11/04 23:56
ppttcc:所以我還是定義個變數比較保險... 11/05 00:07
loveflames:我想是debug.exe的問題,我用-t也無法返回 11/05 00:30