本文已参与「新人创作礼」活动,一起开启掘金创作之路。
前言
学习教材:《汇编语言(第4版)》王爽著 此笔记是书中内容+自我总结,方便查阅和复习 请支持原著
一、内中断
CPU对当前代码处理完后检测到中断信息就会暂停执行下一行代码,而转入中断程序运行。中断信息到来源为中断源,通常为一些事件。
列举以下四种中断信息和类型码:
| 中断信息 | 中断码 |
|---|---|
| 除法错误 | 0 |
| 单步执行 | 1 |
| 执行into命令 | 4 |
| 执行int命令 | n |
中断向量表存储各中断程序的地址,低位偏移地址高位段地址,按照中断码从0开始向高位存储。
中断向量表在0000:0000~0000:03FF共1024个单元,一共可以存储256种中断程序入口,不会被改变
检测点12.1
(1)3号中断处理程序的入口
答案:0070:018B
- 一个表项两个字,8个16进制位
(2)存储N号中断程序入口的内存单元
答案:偏移地址:4N,段地址:4N+2
二、中断过程
CPU收到中断信息后引发中断过程
- 获取中断类型码N
- pushf
- TF=IF=0
- push CS
- push IP
- CS=4N+2,IP=4N
- 运行中断处理程序
三、中断处理程序和iret指令
中断处理程序类似子程序
- 保存主程序寄存器
- 中断处理
- 恢复寄存器
- iret返回主程序
其中:iret是部分中断过程的逆操作,等效于:
- pop IP
- pop CS
- popf
之后返回运行主程序断点的下一条指令
四、编程处理0号中断
当除法溢出时,显示溢出返回操作系统
注意:该程序需要放入一段不会被利用的空间,可选0000:0200~0000:02FF,共256字节
中断程序编写框架:
- 编写显示程序(作为子程序)
- 送入不会被利用的空间存储(安装)(作为主程序)
- 存储入口到对应号到表项中(设置中断向量)
Ⅰ、安装程序
- ds:si:指向显示程序(子程序)
- es:di:指向不会利用的空间
- cx:显示程序(子程序)的长度 通过在子程序首行设置标记、末行之后再添加nop和标记,通过offset做差获得
- cld:正向
- rep movsb:依次送入
- 子程序:显示字符
Ⅱ、显示程序
要显示的字符串存入显示程序的第二行,第一行使用jmp short跳转到第三行真正的入口
...
do0:
jmp short do0start
db ‘overflow!’
do0start:
mov ax,cs
...
Ⅲ、设置中断向量
0号表项存入00:00~00:03
mov ax,0
mov es,ax
mov word ptr es:[4*0],segment addr. do0start
mov word ptr es[4*0+2],offset addr. do0end
五、单步中断
当TF=1,执行完代码后就会暂停等待
在进入中断处理程序之前,TF=IF=0,避免一直循环中断处理程序的1第一行
Debug的t指令正是手动置TF=1实现的
六、不会响应中断的情况
即使发生中断也不会做出反应而是接着运行下一行
例如:执行向ss传送数据后
mov ss,reg后会直接执行下一行代码,这是由于只设定了栈段但并未设定栈顶时入栈会产生错误。因此:强烈建议sp紧接着ss后设定
后记
- 实验2中的(3)运行过程未出现sp的传送数据,就是特殊情况直接运行
- do0中字符串写入第二行,第一行写入jmp矢为了避免字符串被覆盖,而字符串不是可执行代码,要跳过
- 安装程序并未运行do0,只是将其复制到空内存
- 设置头尾标记,获取offset做差获取子程序代码长度