[問題] 關於鍵盤輸入的問題

看板ASM (組合語言)作者 (ppttcc)時間14年前 (2010/11/05 16:24), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/2 (看更多)
程式接受鍵盤輸入一數(鍵盤上方的數字),並將此數除以另一數後將商及餘數輸出. 實際執行時,若從鍵盤輸入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)
文章代碼(AID): #1Cqxz7nJ (ASM)
討論串 (同標題文章)
文章代碼(AID): #1Cqxz7nJ (ASM)