第十五章:外中断03
让编程改变世界
Change the world by program
继续编写int 9中断例程
第三步:如果是Esc键的扫描码,改变显示的颜色后返回。。。。。。
那么,下一个问题:如何改变显示的颜色?
显示的位置是屏幕的中间,即第12行40列,显存中的偏移地址为:160*12+40* 2。所以字符的ASCII码要送入b800:160*12+40*2处。 而b800:160*12+40*2+1 处是字符的属性,我们只要改变此处的数据就可以改变在b800:160*12+40*2 处显示的字符的颜色了。 该程序的最后一个问题是,要在程序返回前,将中断向量表中的ini 9中断例程的入口地址恢复为原来的地址。否则程序返回后,别的程序将无法使用键盘。 经过分析,整理得到完整的程序代码:相关代码下载(http://bbs.fishc.com) 注意,本章中所有关于键盘的程序,因要直接访问真实的硬件,则必须在DOS实模式下运行。 在Windows 2000 的DOS 方式下运行,会出现一些和硬件工作原理不符合的现象。
检测点15.1
安装新的 int 9中断例程
下面,我们将安装一个新的int 9中断例程,使得原int 9中断例程的功能得到扩展。 任务:安装一个新的int 9中断例程 功能:在DOS下,按F1键后改变当前屏幕的显示颜色,其他的键照常处理。
我们进行一下分析:
(1)改变屏幕的显示颜色 怎么改变屏幕的颜色呢? 学习win 32 的朋友立马百度:有相应的函数吗? 其实,我们认真考虑下原理应该不难:改变从B800 开始的4000 个字一节中的所有奇地址单元中的内容,当前屏幕的显示颜色即发生改变。 实现 - - - - > > >
改变屏幕的显示颜色程序[codesyntax lang="asm"]
mov ax,0b800h
mov es,ax
mov bx,1
mov cx,2000
s:
inc byte ptr es:[bx]
add bx,2
loop s
[/codesyntax] (2)对于其他键则照常处理,我们可以调用原int 9中断处理程序,来处理其他的键盘输入。 (3)原int 9 中断例程入口地址的保存 因为在编写的新int 9中断例程中要调用原int 9中断例程,所以,要保存原int 9中断例程的入口地址。保存在哪里?显然不能保存在安装程序中, 因为安装程序返回后地址将丢失。我们因此又将目标锁定在0:200单元处。 (4)新int 9中断例程的安装 这个问题在前面己经详细讨论过。 我们可将新的int 9中断例程安装在0:204 处。
这一章中,我们通过对键盘输入的处理,讲解了CPU 对外设输入的通常处理方法。即:
(1)外设的输入送入端口; (2)向CPU 发出外中断(可屏蔽中断)信息; (3)CPU检测到可屏蔽中断信息,如果IF=1,CPU在执行完当前指令后响应中断,执行相应的中断例程; (4)可在中断例程中实现对外设输入的处理。
实验15 安装新的int 9 中断例程
注意:端口和中断机制,是CPU 进行I/O的基础。 安装一个新的 int 9 中断例程。 功能:在DOS 下,按下“A”键后,除非不再松开,如果松开,就显示满屏幕的“A”;其他的键照常处理。
指令系统总结
我们对8086CPU 的指令系统进行一下总结。 读者若要详细了解8086 指令系统中的各个指令的用法 ,可以查看有关的指令手册。
8086CPU提供以下几大类指令:
1、数据传送指令
比如:mov、push、pop、pushf、popf、xchg等都是数据传送指令,这些指令实现寄存器和内存、寄存器和寄存器之间的单个数据传送。
2、算术运算指令
比如:add、sub、adc、sbb、inc、dec、cmp、imul、idiv、aaa等都是算术运算指令,这些指令实现寄存器和内存中的数据的算数运算。 它们的执行结果影响标志寄存器的:sf、zf、of、cf、pf、af位。
3、逻辑指令
比如:and、or、not、xor、test、shl、shr、sal、sar、rol、ror、rcl、rcr 等都是逻辑指令。 除了not指令外,它们的执行结果都影响标志寄存器的相关标志位。
4、转移指令
可以修改IP ,或同时修改CS 和IP 的指令统称为转移指令。转移指令分为以下几类: (1)无条件转移指令,比如:jmp; (2)条件转移指令,比如:jcxz、je、jb、ja、jnb、jna等; (3)循环指令,比如:loop; (4)过程,比如:call、ret、retf; (5)中断,比如int、iret。
5、处理机控制指令
这些指令对标志寄存器或其他处理机状态进行设置,比如:cld、std、cli、sti、nop、clc、cmc、stc、hlt、wait、esc、lock等都是处理机控制指令。
6、串处理指令
这些指令对内存中的批量数据进行处理 比如:movsb、movsw、cmps、scas、lods、stos等。 若要使用这些指令方便地进行批量数据的处理,则需要和rep、repe、repne等前缀指令配合使用。 [buy]
获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LILZVPKHEGKD']视频下载[/Downlink]