汇编语言 第15章编程及监测点15.1

编程 在屏幕中间依次显示’a’ ~ ‘z’,并可以让人看清。在显示过程中,按下Esc键后,改变颜色。
分析
PC键盘输入的处理过程:
1 键盘产生扫描码
2 扫描码送入60h端口
3 引发9号中断
4 CPU执行执行9号中断例程处理键盘输入

注意这里的前4步仅仅完成了只是对键盘的输入的处理(具体处理过程参见教材 P274~P276),而并没有针对Esc按键进行颜色的变化,处理完前4步后 需要对键盘输入的扫描码进行分析 是否为Esc按键,如果是就进行颜色变换,而第一步和第二步是硬件帮我们直接完成的,所以我们只需要做一下工作即可
1 从60h端口读取扫描码 in al,60h
2 引发9号中断 对于int 9 中断过程 的模拟为 (注意这里是对中断过程的模拟,还没到中断例程的执行)
(1) 获取中断号,这里我们已经知道就是9号
(2) 标志寄存器入栈,pushf IF=0,TF=0
(3) push CS push IP
(4) (IP) = (n4) (CS) = (n4 + 2)
3 执行中断例程,可以使用call dword ptr ds:[0],来模拟 当然需要提前将9号中断的中断向量也就是中断例
程的入口放到 ds:[0] ds:[1]和 ds:[2] ds:[3] 处,这样调用call dword ptr ds:[0]时
(IP) = ((ds)*16+0) (CS)=((ds)*16 +2) ,这里完成了对键盘输入的处理
4 针对键盘的按键Esc时 变换字符的颜色 只需要修改显示的字符的属性即可(参见教材实验9材料)

监测点15.1
1 其实在我们的int9中断例程中,模拟int指令调用原来int9中 中断例程的程序段时可以精简的,因为在进入中断例程后,IF和TF都已经置为零了,就没有必要再进行设置了,对于程序段
pushf
pushf ;开始模拟中断例程第一步 标志寄存器入栈
pop bx
and bh,11111100b;设置TF=0 IF=0 IF第9位 TF第8位
push bx
popf ;注意可以用 popf来设置标志寄存器的值
call dword ptr ds:[0] ;对int指令进行模拟,调用原来的int9中断例程
可以优化为
pushf
call dword ptr ds:[0] ;对int指令进行模拟,调用原来的int9中断例程
这里之前有两个疑惑点
其一 题目中说在调用我们的新的int9中断例程时已经进入了中断例程,这个中断例程是指按下Esc键产生的中断例程(想了好久才想通…)
其二 简化之后的pushf是为了与 执行完我们的新的int9中断例程后 itret相照应 防止栈数据错乱

2 在主程序中,如果在执行设置int 9中断例程的段地址和偏移地址的指令之间,发生了键盘中断,则CPU将转去一个错误的地址执行,将发生错误。找出这样的程序段,改写它们,排除潜在的问题。
程序分析:

【1】关于设置中断向量表的指令,在程序中就2段。

mov word ptr es:[9*4], offset int9

mov es:[9*4+2], cs ;将新的int9入口地址写入中断向量表中

; 将中断向量回写回中断向量表中

    mov ax, 0
    mov es, ax                  ;将es指向0000段内存中断向量表
    push ds:[0]
    pop es:[9*4]
    push ds:[2]
    pop es:[9*4+2] 

   如果在指令执行在这2段中间,引发了键盘中断事件,由于正在设置中断向量表,故(ip)和(cs)值可能不确定。为了避免这2段代码不受到中断事件的干扰,将中断屏蔽了。

【2】sti和cli指令的用法:
cli 禁止中断发生 IF=0
sti 允许中断发生 IF=1
【3】这二段代码前后加上cli和sti指令即可:

;在中断向量表中设置新的中断入口地址的时候不让其发生中断
cli
mov word ptr es:[94],offset int9
mov word ptr es:[9
4+2],cs
sti

恢复中断向量表int9的源地址时:
cli
push ds:[0]
pop es:[94]
push ds:[2]
pop es:[9
4+2]
sti

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值