基本上都直接通过实验的代码分析来回顾。
第13章
int指令
int指令也属于内中断的一种,格式为 int n
,其中n为中断类型码,跟前面的中断执行过程差不多,不过直接给出了中断类型码,可以任意指定进行的中断处理程序。执行过程:获取中断类型码n->标志寄存器入栈,IF=0,TF=0->CS,IP入栈->(IP)=(n4),(CS)=(n4+2)->执行处理程序。
BIOS
在系统板上的BIOS(基本输入输出系统)主要提供:硬件系统的检测和初始化程序;外部中断和内部中断的中断例程;用于对硬件设备进行I/O操作的中断例程;其他和硬件系统相关的中断例程。操作系统DOS也提供中断例程。
BIOS和DOS的中断例程包含了许多子程序,这些子程序实现了程序员在编程的时候常常需要用到的功能。程序员在编程的时候可以直接用int调用其中的中断例程。
BIOS和DOS的安装过程为:开机后CPU加电,初始化(CS)=0FFFFH,(IP)=0,在FFFF:0处有一条跳转指令,执行后进行BIOS的硬件系统检测和初始化程序 -> 初始化程序建立BIOS的中断向量并将入口地址登记在中断向量表 -> 系统硬件检测和初始化完成后调用 int 91h,进行操作系统的应道,计算机交由操作系统 -> DOS启动后还会将其提供的中断例程装入内存,建立中断向量。
实验13
1.编写并安装 int 7ch 中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。
1 | assume cs:code |
给了个测试程序吧相当于
1 | assume cs:code |
调试结果如下
在开始时sp为0000,int 7c后sp被设置并且入栈标志寄存器和CS,IP,并且跳转指令
中断例程执行完后栈恢复
2.编写并安装 int 7ch 中断例程,功能为完成loop指令的功能
1 | assume cs:code |
给出的调试的程序
1 | assume cs:code |
效果图
3.下面的程序,在屏幕的第2,4,6,8行显示4句英文诗
1 | assume cs:code |
效果图
第14章
端口
在pc机上各种接卡口,主板上的接口芯片,其他芯片等都与CPU总线相连,CPU通过控制线向他们所在芯片发出端口读写指令。在CPU角度,将这些寄存器都当作端口,对他们进行统一编址,从而建立统一的端口地址空间。
端口的读写指令只有两条:in,out分别为从端口读取和向端口写入。在读取和写入时只能用ax或者al来存放数据,8位端口用al,16位用ax。
shr & shl
shr和shl为逻辑移位符,shr为右移,shl左移。shl 1
为例:将一个寄存器或者内存单元中的数据左移一位->将最后移出的一位写入CF中-> 缺失位补0。
实验14
以“年/月/日 时:分:秒”的格式,显示当前日期时间。在CMOS RAM中实时钟存储时间的单元为秒0分2时4日7月8年9。
1 | assume cs:code |
效果图
看一个我忘了push cx导致的错误示范图,蛮好玩的
第15章
外中断
CPU的外部有需要处理的事情发生时会产生外中断的中断信息,外中断源有两种:可屏蔽中断,不可屏蔽中断。
可屏蔽中断的判断为IF=1,则在执行完该指令后中断。在中断过程中将IF置0就是为了防止其他可屏蔽中断。而sti指令可以将IF=1;cli指令可以将IF=0.
PC机的键盘输入
键盘的每个键相当于一个开关,按下和松开产生扫描码,按下称为通码,松开称为断码。断码=通码+80h。扫描码会被送往60h端口,键盘的输入到达60h后相关芯片会往CPU发出中断类型码为9的可屏蔽中断信息。
实验15
安装一个 int 9h ,效果为按下‘A’后再松开就会出现满屏‘A’。
1 | assume cs:code |
关于简化的部分是在模拟原来的int指令的调用过程,因为此处调用的原int 9h已经不是int指令了。即取中断类型码->标志寄存器入栈->IF,TF置零->CS,IP入栈->跳转指令。
最后两步和call指令效果类似,标志寄存器入栈可以用pushf,对于置零可以由一下指令完成。
1 | pushf |
由于在上面的程序中已经在进入中断程序时将IF,TF置零了,不需要这一堆只用pushf和call。
效果图如下,图一为按住A不放,图二为放开后
说真的边敲代码边开着饭拍的凤凰传奇音乐节live非常提神醒脑,美中不足是没办法控制抖腿。