內中断
中断类型码为 1 byte 的数据,可以表示 256 种中断信息的来源,但是实际上装载好的远少于 256 种。
在 8086CPU 中,中断向量表存放在 0000:0000~0000:03E8
单元中,一个表项占 2 word ,偏移地址 word 存在低地址,段地址 word 存在高地址中。
中断过程如下:
- 取得中断类型码 N
pushf
TF = 0, IF = 0
push CS
push IP
IP = (N * 4), CS = (N * 4 + 2)
在编写中断处理程序时,需在结尾使用 iret
指令返回,作用与 ret
相似。
CPU 在执行完一条指令之后,如果检测到 TF = 1
,就会产生类型码为 1 的单步中断,转去执行 1 号中断处理程序,从而为单步跟踪程序的执行提供了可能。
但是为了避免出现 1 号中断程序的套娃现象,需要在每次进入中断程序之前需要将 TF 置为 0 。
特殊情况:在执行完 ss 寄存器传送数据的指令后,即便发生中断,CPU 也不会响应。
-> 我们应该将设置 ss 和 sp 的指令连续存放。
Lab 12
编写 0 号中断的处理程序
1 | assume cs:code |
Lab 13
显示用 0 结束的字符串
1 | assume cs:code |
完成 loop 指令的功能
1 | assume cs:code |
显示四句英文诗
1 | assume cs:code |
端口
CPU 通过主线相连的芯片除了各种存储器之外,还有以下 3 种芯片:
- 各种接口卡的芯片
- 主板上的接口芯片,用来访问外设
- 其他芯片,存储系统相关信息或进行相关输入输出
in 和 out 指令
CPU 使用地址线和控制线向端口发送指令,从而与芯片进行交互,间接访问芯片的存储单元。
在 in
和 out
指令中,只能使用 ax 或 al 来存放端口读/写的数据,其中访问 8 位端口时用 al ,访问 16 位端口时用 ax 。
shl 和 shr 指令
它们都是逻辑位移指令,都会将最后移出的一位写入 CF 中,如果移动位数大于 1 ,则需要将移动位数放在 cl 中。
Lab 14
访问 CMOS RAM
1 | assume cs:code |
外中断
外中断信息来自 CPU 外部,外中断源一共有两种:
- 可屏蔽中断
- 如果
IF = 0
,则会禁止进入可屏蔽中断。 - 进入内中断时会将 IF 置为 0 。
- 如果在內中断过程中需要处理可屏蔽中断,则需要用指令将 IF 置为 1 。
sti
: IF = 1cli
: IF = 0
- 如果
- 不可屏蔽中断
- 中断类型码固定为 2
- 中断过程与內中断一致,除了最后是
(IP) = (8), (CS) = (0AH)
Lab 15
安装新的 int9 中断例程
1 | assume cs:code |
Author: f1a3h
Permalink: https://blog.rbkou.me/Study-Notes/Assembly/asm7/
文章默认使用 CC BY-NC-SA 4.0 协议进行许可,使用时请注意遵守协议。
Comments