关于得到键盘扫描码和ASCII码问题!

beijingbeerman 2006-07-04 11:02:04
assume cs:code

stack segment
db 128 dup (0)
stack ends

code segment
start:mov ax,stack
mov ss,ax
mov sp,128

push cs
pop ds

mov ax,0
mov es,ax

mov si,offset int9
mov di,204h
mov cx,offset int9end-offset int9
cld
rep movsb

push es:[9*4]
pop es:[200h]
push es:[9*4+2]
pop es:[202h]

cli
mov word ptr es:[9*4],204h
mov word ptr es:[9*4+2],0
sti

mov cx,120
lp:mov ah,0 ;进行120次读取BIOS键盘缓冲区的操作,
int 16h ;以辅助读者在程序运行时方便进行相关的按键操作。
loop lp

mov ax,4c00h
int 21h

int9:push ax
push bx
push cx
push dx

in al,60h

pushf
call dword ptr cs:[200h]

;cmp al,3bh ;F1的断码为3bh
cmp al,9eh ;A的断码为9eh
jne int9ret

mov ax,0b800h
mov es,ax
mov bx,0
;mov bx,1
mov cx,2000
s:mov byte ptr es:[bx],65;
;inc byte ptr es:[bx]
add bx,2
loop s

int9ret: pop es
pop cx
pop bx
pop ax
iret
int9end:nop


code ends
end start

这个程序当按“A”键是全屏显示A
其中用到了mov ah,0
int 16h
中断程序得到键盘的扫描码和ASCII码,但是如果去掉in al 60h将得不到任何键盘码。为什麽?
...全文
604 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
beijingbeerman 2006-07-08
  • 打赏
  • 举报
回复
ok,多谢指点!
zyl910 2006-07-07
  • 打赏
  • 举报
回复
BIOS的键盘按键处理过程:挂接IRQ1(Int9),从60h端口读取扫描码,再转换成按键编码(对于字母键、数字键就是ASCII码)将其放置到键盘缓冲区中
Int16h的实现原理:从键盘缓冲区中读取数据
daipeanut 2006-07-07
  • 打赏
  • 举报
回复
UP
fhb13 2006-07-04
  • 打赏
  • 举报
回复
你的程序把int 9h中断覆盖了,int 16h是调用int 9h中断获的扫描码再转换成ASCII码并同时返回扫描码和ASCII码。
如果你把in al 60h屏蔽,int 9h就不会取到扫描码,故导致int 16h没办法获的扫描码和ASCII码。
beijingbeerman 2006-07-04
  • 打赏
  • 举报
回复
用in al 60h
只能得到键盘的扫描码
mov ah,0
int 16h
不是自动得到键盘的扫描码和ASCII码吗?
fhb13 2006-07-04
  • 打赏
  • 举报
回复
你的程序好像把中断改写了,就是说int 16实际上是执行你的后半部指令,你把in al 60h去掉也等于是把int 16的读取扫描码和ASCII码的功能去掉了。
fhb13 2006-07-04
  • 打赏
  • 举报
回复
in al 60h
这个是从端口把扫描码读入,你去掉当然得不到扫描码。
fhb13 2006-07-04
  • 打赏
  • 举报
回复
in al 60h 读出来的是扫描码,至于ASCII码可以根据表格把扫描码转换为ASCII码,同理可以进行互转。
beijingbeerman 2006-07-04
  • 打赏
  • 举报
回复
谢谢!终于明白了。但是我怎麽得到键盘的扫描码?因为in al 60h只能得到ASCII码

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧