Kaito's Blog

致力成为一枚silver bullet.

0%

汇编总结(2):中断、端口、直接定址表

1、中断

CPU具有一种能力,可以在执行完当前指令之后,检测从内部产生或外部发来的特殊信息,并立即对其进行处理,这种特殊的信息,叫做中断信息

中断即CPU不再接着刚执行完的指令向下执行,而是转去处理特殊信息。

中断分为:

  • 内中断,CPU内部产生的特殊信息
  • 外中断,CPU外部产生的特殊信息

1.1、内中断

中断信息必须包含标识来源的编码,叫做中断类型码。中断类型码为一个字节型数据,可表示256种中断信息来源。

产生中断信息的事件,即中断信息的来源,叫做中断源

内中断分类:

  • 除法错误,类型码0,如div指令产生溢出
  • 单步执行,类型码1,即单步调试
  • into指令,类型码4
  • int指令,指令格式为int n,类型码为n

CPU在收到中断信息后,需要对中断信息进行处理,这可以由我们编程来决定,我们编写的处理中断信息的程序叫做中断处理程序

CPU要想执行中断处理程序,则必须知道这个程序的入口,即CS:IP指向这个入口,CPU用8位中断类型码通过中断向量表找到对应中断程序的入口地址。

中断向量表在内存中保存,对于8086CPU机,其必须存放在0000:0000~0000:03FF处,这是规定好的。

中断向量表中每个中断类型码对应中断程序的段地址和偏移地址,共占2个字节。

CPU通过中断类型码,然后在中断向量表中找到中断处理程序的段地址和偏移地址,设置CS和IP,CPU开始执行中断处理程序。这个操作是CPU自动完成的,这个过程叫做中断过程

具体过程如下:

  • 从中断信息中取得中断类型码N
  • pushf:标志寄存器的值入栈(中断过程中会改变标志寄存器的值,所以先保存之前的值)
  • TF=0,IF=0:设置标志寄存器第8位TF第9位IF的值为0
  • PUSH CSCS内容入栈
  • PUSH IPIP内容入栈
  • (IP)=(N*4),(CS)=(N*4+2):从内存地址为中断类型码*4中断类型码*4+2的两个字中读取中断处理程序入口地址,设置CS和IP
  • 执行中断处理程序

中断处理程序编写步骤

  • 保存用到的寄存器
  • 处理中断
  • 恢复用到的寄存器
  • iret指令返回

iret指令功能:

  • pop IP
  • pop CS
  • popf

引发中断的具体事件:

  • 除法错误:如果在执行div指令时,发生溢出错误,将产生中断类型码为0的中断信息,CPU检测到此信息然后引发中断过程,转去执行0号中断所对应的中断处理程序;
  • 单步中断:CPU执行完一条指令后,如果检测到TF位是1,则产生单步中断,转去执行1号中断处理程序,CPU提供单步中断功能,为单步跟踪程序执行过程提供了实现机制;
  • int指令引发中断:可自定义调用中断处理程序,例如int n将调用n号中断处理程序;

在主板的ROM中存放的程序,叫做BIOS(基本输入输出系统),主要包含以下内容:

  • 硬件系统的检测和初始化程序;
  • 外部中断和内部中断的中断例程;
  • 用于对硬件设备进行I/O操作的中断例程;
  • 其他和硬件系统相关的中断例程;

操作系统DOS也提供了中断例程,DOS中断例程就是操作系统向程序员提供的编程资源。int 21h中断例程就是DOS提供的,即程序返回功能。

在执行完向ss寄存器传送数据指令后,即使发生中断,CPU也不会响应。因为ss:sp联合指向栈顶,应该持续完成,否则将发生错误。

1.2、外中断

CPU能响应外设的输入,并向它们进行输出,这个过程叫做外中断

外设的输入不直接送入内存和CPU,而是送入相关的接口芯片端口中。CPU向外设输出也不是直接送入外设,而是先送入端口,再由芯片送到外设。CPU通过端口和外设进行联系。

外中断源分为2类:

  • 可屏蔽中断:CPU可以不响应的外中断,由标志寄存器IF决定,如果IF=1则响应,否则屏蔽中断;
    • 中断过程将IF设置为0,就是保证在进入中断处理程序后,禁止其他的可屏蔽中断
    • 8086CPU提供修改IF的指令:sti:IF=1, cli:IF=0
  • 不可屏蔽中断:
    • CPU必须响应的外中断
    • 中断类型码固定为2

几乎所有由外设引发的外中断,都是可屏蔽中断。

2、端口

在计算机中,各种存储器和CPU的地址总线、数据总线、控制总线相连,CPU控制它们时,都把它们当做内存来对待。除了各种存储器之外,还与很多芯片相连:

  • 各种接口卡(网卡、显卡)上的接口芯片,它们控制接口卡工作;
  • 主板上的接口芯片,CPU通过它们对部分外设进行访问;
  • 其他芯片,存储相关系统信息,或进行相关的输入输出处理;

这些芯片中,都有一组可以由CPU读写的寄存器,CPU把这些寄存器都当做端口,对它们进行统一编址,从而建立一个统一的端口地址空间。

访问端口:

  • in al 60h:从60h号端口读入一个字节
  • out 20h,al:往20h端口写入一个字节

PC机中,有一个CMOS RAM芯片,一般称为CMOS,特征如下:

  • 包含一个实时钟和一个有128个存储单元的RAM存储器;
  • 此芯片靠电池供电,可保证实时钟持续工作,RAM中信息不丢失;
  • 128个字节的RAM中,内部实时钟占用0~0dh保存时间信息,其他单元保存系统配合信息,供系统启动时BIOS程序读取,也可通过BIOS配置CMOS RAM中的系统信息;
  • 此芯片内部有2个端口:70h和71h,CPU通过这2个端口读写CMOS RAM;
  • 70h为地址端口,存放要访问CMOS RAM单元的地址;71h为数据端口,存放从选定CMOS RAM单元中读取的数据,或要写入其中的数据;

在CMOS RAM中,存放着当前的时间:年、月、日、时、分、秒。每个长度为1个字节,这些数据以BCD码方式存放。

BCD码是以4位二进制数表示十进制数的编码方法。

3、直接定址表

假如a、b标号代表2组数据空间,那么有如下写法既可以标记存储数据的单元地址,还可以标记其长度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
指令:mov ax,b
相当于:mov ax,cs:[8]

指令:mov b,2
相当于:mov word ptr cs:[8],2

指令:inc b
相当于:inc word ptr cs:[8]

指令:mov al,a[si]
相当于:mov al,cs:0[si]

指令:mov al,a[3]
相当于:mov al,cs:0[3]

指令:mov al,a[bx+si+3]
相当于:mov al,cs:0[bx+si+3]

通过数据能直接计算出所要找的元素的位置的表,叫做直接定址表

直接定址表的好处:

  • 使算法清晰简洁
  • 加快运算速度
  • 程序易于扩展
如果此文章能给您带来小小的工作效率提升,不妨小额赞助我一下,以鼓励我写出更好的文章!