作者eentut (四叶幸运草)
看板ASM
标题Re: [问题] 关於键盘输入的问题
时间Fri Nov 5 23:25:32 2010
※ 引述《ppttcc (ppttcc)》之铭言:
: 程式接受键盘输入一数(键盘上方的数字),并将此数除以另一数後将商及余数输出.
: 实际执行时,若从键盘输入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字元.难道意味不能直接用扫描码去做运算?
看来你还是不知道什麽叫scan code
问问题前最好google深入点再发问
heater0718.wordpress.com/2010/10/26/%E9%9B%BB%E8%85%A6-keyboard-scan-code/
: 因为变数值视当时输入(只能看到变数的位址),若用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 键盘扫描码
存扫描码没意义 因为你只需要数字
InputNumber db 0
: asciicode db 0 ;储存al ASCII码
: call input ;从键盘输入被除数
: sub ax,ax ;将ax归零
; mov al,scancode;若以立即值取代变数scancode则输出正确结果,
;用变数就会加1
mov al, InputNumber
: 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
and al, 0Fh
mov InputNumber, al
最好在此判断若输入不是0-9的数字 显示错误讯息
: ret
: input endp
: tochar proc near ;转成ASCII的字元
: mov bl,48
: add dl,bl
: cmp dl,57
: jbe return
; add dl,7
这一行没意义, +7的意义是要转成英文字母 此程式只允许输入0-9
: return: ret
: tochar endp
: show proc near ;显示字元
: mov ah,02
: int 21h
: ret
: show endp
: ;--------------------------
: 输入7
: 执行结果227
: 输入8
: 执行结果308
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 219.85.221.123
1F:推 jason12308:大大好厉害,我记得我也有让你教过,谢谢 11/06 11:05