鱼C论坛

 找回密码
 立即注册
查看: 1900|回复: 1

汇编语言外中断问题

[复制链接]
发表于 2012-11-27 14:09:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 我就是传奇 于 2012-11-27 14:25 编辑

键盘的外中断,书上是这样写的:
        键盘的输入到达60h端口时,相关的芯片就会向cpu发出中断类型码为9的可屏蔽中断信息。
        cpu检测到该中断信息后,如果IF=1,则相应中断,引发中断过程,转去执行int 9中断例程。
        BIOS提供int 9中断例程,用来进行基本的键盘输入处理,主要的工作如下:
        (1) 读出60h端口中的扫描码;      
        (2) 如果是字符键的扫描码,将该扫描码和它所对应的字符码(即ASCII码)送入内存中的BIOS键盘缓冲区。
               如果是控制键(比如ctrl)和切换键(比如 caislock)的扫描码,则将其转变为状态字节存储在内存中存储状态字节的单元;
        (3)  对键盘系统进行相关的控制,比如说,向相关芯片发出应答信息。
         BIOS键盘缓冲区是系统启动后,BIOS用于存放int 9中断例程所接收的键盘输入的内存区。
         该内存区可以存储15个键盘输入,因为int 9 中断例程除了接收扫描码外,还要产生和扫描码对应的字符码,
         所以在BIOS键盘缓冲区中,一个键盘输入用一个字单元存放,高位字节存放扫描码,低位字节存放字符码。        
编写新的int9中断例程时,第一步中,我们用:   in al,60h    al中存放着按键时的扫描码
问题1:既然al中存放有扫描码,为什么我们不直接进行 cmp al,1进行判断是否为ESC键,而要调用以前的int 9呢

            当然这样做是不行的,我在屏幕上显示的是个符号,并不是扫描码01.希望知道的朋友帮忙解答一下。
我们调用完以前的int 9中断例程后,进行了cmp al,1比较。         
问题2:我们调用完以前的int 9后,因为端口信息都是通过al或ax存放或传送的,所以BIOS缓冲区中存放有我们按键
            的扫描码和字符码,高位字节存放扫描码,低位字节存放字符码
            如果这样,为什么不是cmp ah,1而是 cmp al,1呢?毕竟高位字节存放扫描码,低位字节存放字符码。求解释
            当然我用cmp ah,1试过,结果是不行的,可是我是按照书上说的原理想的啊,为什么就错了呢?
         

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-12-6 04:40:37 | 显示全部楼层
1、我们不能干扰键盘的正常运作,因此需要int 9h(我们自己编写的int 9h无法实现键盘的正常运作),2、in al,60h,,呵呵,这和ah没有关系吧?而且你前面也说了,al中存放着按键时的扫描码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-8 00:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表