学汇编,记笔记(十一)《汇编语言》王爽著——内中断

244 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

学习教材:《汇编语言(第4版)》王爽著 此笔记是书中内容+自我总结,方便查阅和复习 请支持原著

章末实验12

一、内中断

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收到中断信息后引发中断过程

  1. 获取中断类型码N
  2. pushf
  3. TF=IF=0
  4. push CS
  5. push IP
  6. CS=4N+2,IP=4N
  7. 运行中断处理程序

三、中断处理程序和iret指令

中断处理程序类似子程序

  1. 保存主程序寄存器
  2. 中断处理
  3. 恢复寄存器
  4. iret返回主程序

其中:iret是部分中断过程的逆操作,等效于:

  1. pop IP
  2. pop CS
  3. popf

之后返回运行主程序断点的下一条指令

四、编程处理0号中断

当除法溢出时,显示溢出返回操作系统

注意:该程序需要放入一段不会被利用的空间,可选0000:0200~0000:02FF,共256字节

中断程序编写框架:

  1. 编写显示程序(作为子程序)
  2. 送入不会被利用的空间存储(安装)(作为主程序)
  3. 存储入口到对应号到表项中(设置中断向量)

Ⅰ、安装程序

  1. ds:si:指向显示程序(子程序)
  2. es:di:指向不会利用的空间
  3. cx:显示程序(子程序)的长度 通过在子程序首行设置标记、末行之后再添加nop和标记,通过offset做差获得
  4. cld:正向
  5. rep movsb:依次送入
  6. 子程序:显示字符

Ⅱ、显示程序

要显示的字符串存入显示程序的第二行,第一行使用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做差获取子程序代码长度