第十三章 int指令

13.1 int指令

int指令的使用格式:int nn表示中断类型码,它的作用是引发中断,它的中断流程如下所示:

  1. 取中断类型码n
  2. 标志寄存器入栈
  3. 设置IF=0、TF=0
  4. 压入CS、IP
  5. 设置IP = (4 * n),CS = (4 * n + 2) [表示取对应地址上的内容]

从而转去执行n号中断处理程序

13.2 编写供应用程序调用的中断例程

编写中断例程主要分为三步:

  1. 编写实现 要求的程序;
  2. 安装程序,将其安装在0:200(也可以放在其他位置,但是要考虑不被其他程序覆盖)
  3. 设置中断向量表,将程序的入口地址保存在 中断类型码 所在的表项,使我们编写的程序变为中断7ch的中断例程。

比如13.2的问题一:

  1. 编写一个 求平方数 的程序
  2. 安装程序,将其安装在0:200
  3. 设置中断向量表,这里题目要求设置在 7ch处,所以我们应该在中断向量表的7ch处设置程序的入口地址。

13.3 对int、ret和栈的深入理解

这一步简单来说就是执行int n指令后,对CSIP的处理流程:

  1. 将标志寄存器压入栈中
  2. 将IF、TF设置为0
  3. 按顺序将CS、IP压入栈中

对int的理解
当进入中断例程时,SP指向的位置即是IP所在位置,SP + 2 指向的位置即是CS所在的位置。

13.4 BIOS和DOS所提供的中断例程

系统版的ROM中存放着一套程序,称为BIOS(基本输入输出系统),BIOS主要包含以下几部分内容:

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

除此之外操作系统DOS也会提供了一些中断例程,这些中断例程就是操作系统向程序员提供的编程资源。

👉 BIOS中断大全

👉 DOS中断大全

13.5 BIOS和DOS中断例程的安装过程

  1. 开机后,CPU一加电,自动初始化 (CS)=0FFFFH (IP)= 0FFFF:0处有一条跳转指令,CPU执行跳转指令后,转去执行BIOS中的硬件系统检测和初始化程序。
  2. 初始化程序,建立BIOS所支持的中断向量。该部分只需要将中断例程的入口地址登记到中断向量表即可,因为程序是固话到ROM里面的,一直会存在。【这一部分对应的是bootsect.s,有兴趣的小伙伴可以去看看】
  3. 调用int 19进行操作系统的引导,从此将计算机交由操作系统控制。
  4. DOS启动后,除完成其他工作外,还将它所提供的中断例程装入内存,并建立相应的中断向量。

中断例程应用

BIOS的int 10h的2、9号功能:

; int 10h 第2号功能
mov ah, 2 ; 调用2号功能,即设置光标
mov bh, 0 ; 设置当前页为第0页
mov dh, 5 ; 设置光标到ah行
mov dl, 12 ; 设置光标到指定列
int 10h
; int 10h 第9号功能
mov ah, 9 ; 调用9号功能
mov al, 'a' ; 设置字符
mov bl, 7 ; 设置颜色属性
mov bh, 0 ;设置显示的页码
mov cx, 3 ; 字符重复个数
int 10h 

DOS的int 21h的4CH、 9号功能

; int 21h 的4CH号功能
mov ah, 4cH ; 调用4ch号功能
mov al, 0   ; 程序的返回值
int 21h
; int 21h 的9号功能

; TODO 
; 设置ds:dx指向字符串起始地址(这里的data只是举个例子,总之要设置ds:dx到字符串起始地址上)
mov ax, data
mov ds, ax
mov dx, 0
mov ah, 9 ; 调用9号功能
int 21h

总结

用库的感觉很爽,回到了高级语言调调API的时候,hhhhhh

还需要再接再厉。

posted @ 2019-06-18 20:45  CoDeleven  阅读(1485)  评论(0编辑  收藏  举报