作者ppttcc (ppttcc)
看板ASM
标题[问题] 关於键盘输入的问题
时间Fri Nov 5 16:24:36 2010
程式接受键盘输入一数(键盘上方的数字),并将此数除以另一数後将商及余数输出.
实际执行时,若从键盘输入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)