[問題] 關於鍵盤輸入的問題
程式接受鍵盤輸入一數(鍵盤上方的數字),並將此數除以另一數後將商及餘數輸出.
實際執行時,若從鍵盤輸入7,除以另一數3,結果應是2餘1,但結果卻是2餘2
若輸入9,得到3餘1...
曾經嘗試若不轉成數字的ascii碼,即不呼叫tochar,直接輸出值,若餘數應是0,
則會輸出一個空心的笑臉(ascii值1),所以副程式應該沒有問題
但若不由鍵盤輸入,改以立即值,則可輸出正確的結果.
觀察後,似乎只要是由鍵盤輸入,值都會自動被加1,輸入7就會變8,輸入9會變10...
或者將mov al,scancode改成mov al,asciicode,若輸入7(55),也會得到兩個代表
18及1的ASCII字元.難道意味不能直接用掃描碼去做運算?
因為變數值視當時輸入(只能看到變數的位址),若用debug程式看不出dl值如何變化,
且debug執行到tochar後就沒再回到主程式而離開debug....
因為我輸出執行檔的格式為*.com,是否與這有關?
麻煩幫我看一下,感謝!
補充:在網路上找到有關掃描碼的文章,其中掃描碼對應的鍵盤數字正好是多1!
其中又有掃描碼及擴展碼...但鍵7的掃描碼為8,擴展碼為37h(等於ASCII55),兩者不等
那掃描碼又是什麼?
http://blog.csdn.net/xqan/archive/2008/01/17/2048959.aspx
程式如下
start:
call reset ;將所有暫存器歸0
divide db ?;
divisor db 3 ;設定除數為3
quo db 0 ;初始商為0
remain db 0 ;初始餘數為0
scancode db 0 ;儲存ah 鍵盤掃描碼
asciicode db 0 ;儲存al ASCII碼
call input ;從鍵盤輸入被除數
sub ax,ax ;將ax歸零
mov al,scancode;若以立即值取代變數scancode則輸出正確結果,
;用變數就會加1
div divisor
mov remain,ah ;儲存餘數
mov quo,al ;儲存商
mov dl,quo ;印出商
call tochar
call show
mov dl,remain ;印出餘數
call tochar
call show
mov dl,asciicode;印出輸入的字元
call show
exit: mov ah,4ch
int 21h
;----------------------------------------
reset proc near ;歸零所有暫存器
sub ax,ax
sub bx,bx
sub cx,cx
sub dx,dx
ret
reset endp
input proc near ;取得鍵盤輸入
mov ah,0
int 16h
mov scancode,ah
mov asciicode,al
ret
input endp
tochar proc near ;轉成ASCII的字元
mov bl,48
add dl,bl
cmp dl,57
jbe return
add dl,7
return: ret
tochar endp
show proc near ;顯示字元
mov ah,02
int 21h
ret
show endp
;--------------------------
輸入7
執行結果227
輸入8
執行結果308
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.38.20.201
※ 編輯: ppttcc 來自: 114.38.20.201 (11/05 16:33)
※ 編輯: ppttcc 來自: 114.38.20.201 (11/05 16:33)
※ 編輯: ppttcc 來自: 114.38.20.201 (11/05 18:26)
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
ASM 近期熱門文章
PTT數位生活區 即時熱門文章