13.1 int指令
int指令的使用格式:int n
,n
表示中断类型码,它的作用是引发中断,它的中断流程如下所示:
- 取中断类型码n
- 标志寄存器入栈
- 设置IF=0、TF=0
- 压入CS、IP
- 设置IP = (4 * n),CS = (4 * n + 2) [表示取对应地址上的内容]
从而转去执行n号中断处理程序
13.2 编写供应用程序调用的中断例程
编写中断例程主要分为三步:
- 编写实现 要求的程序;
- 安装程序,将其安装在0:200(也可以放在其他位置,但是要考虑不被其他程序覆盖)
- 设置中断向量表,将程序的入口地址保存在 中断类型码 所在的表项,使我们编写的程序变为中断7ch的中断例程。
比如13.2的问题一:
- 编写一个 求平方数 的程序
- 安装程序,将其安装在0:200内
- 设置中断向量表,这里题目要求设置在 7ch处,所以我们应该在中断向量表的7ch处设置程序的入口地址。
13.3 对int、ret和栈的深入理解
这一步简单来说就是执行int n
指令后,对CS
和IP
的处理流程:
- 将标志寄存器压入栈中
- 将IF、TF设置为0
- 按顺序将CS、IP压入栈中
当进入中断例程时,SP指向的位置即是IP
所在位置,SP + 2 指向的位置即是CS
所在的位置。
13.4 BIOS和DOS所提供的中断例程
系统版的ROM中存放着一套程序,称为BIOS(基本输入输出系统),BIOS主要包含以下几部分内容:
- 硬件系统的检测和初始化程序
- 外部中断和内部中断的中断例程
- 用于对硬件设备进行I/O操作的中断例程
- 其他和硬件系统相关的中断例程
除此之外操作系统DOS也会提供了一些中断例程,这些中断例程就是操作系统向程序员提供的编程资源。
? BIOS中断大全
? DOS中断大全
13.5 BIOS和DOS中断例程的安装过程
- 开机后,CPU一加电,自动初始化 (CS)=0FFFFH (IP)= 0,FFFF:0处有一条跳转指令,CPU执行跳转指令后,转去执行BIOS中的硬件系统检测和初始化程序。
- 初始化程序,建立BIOS所支持的中断向量。该部分只需要将中断例程的入口地址登记到中断向量表即可,因为程序是固话到ROM里面的,一直会存在。【这一部分对应的是bootsect.s,有兴趣的小伙伴可以去看看】
- 调用
int 19
进行操作系统的引导,从此将计算机交由操作系统控制。 - 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
还需要再接再厉。