目录:https://blog.csdn.net/qq_43098197/article/details/124532401
int 指令
-
格式:
int n
-
n 为中断码
-
作用:引发中断过程,引发 n 号中断的中断过程。
-
执行过程:
- 去中断类型码 n
- 标志寄存器入栈,IF=0,TF=0
- CS、IP 入栈
- (IP)=(n*4),(CS)=(n*4+2)
-
使用场景之一:可以供应用程序调用已经编写好的中断例程。
使用 iret 实现 loop 指令功能
程序:在屏幕中间显示 80 个 “!” 。
assume cs:code
code segment
start: mov ax,0b800h ; 向8086CPU显存的地址
mov di,160 * 12 ; 显示位置
mov bx, offset s - offset se; 跳转的位移(偏移量)
mov cx,80 ; 循环次数
s: mov byte ptr es:[di], '!'
add di, 2
int 7ch ; 进入中断处理程序
se: nop
mov ax,4c00h
int 21h
code ends
end start
使用 iret 实现 loop:
lp: push bp
mov bp,sp
dec cx
jcxz lpret
add [bp+2], bx
lpret: pop bp
iret
当执行 int 7ch
后会执行中断过程,中断过程完成后,栈中内容如下:
进入中断例程,因为用到了 bp,因此入栈保存它,程序完成后在还原。然后 dec cx
,循环次数减一,jcxz lpret
当循环次数为 0 时,不再进行偏移(循环),不为 0,则 [bp+2]
指向栈中 ip
,并且根据偏移量 bx
修改它,接着还原 bp,最后将栈中数据 iret
,从而根据修改 ip
达到循环的效果。
BIOS 和 DOS 所提供的中断例程
BIOS(基本输入输出系统),主要包含以下几部分内容:
- 硬件系统的检测和初始化程序。
- 外部中断和内部中断的中断例程。
- 用于对硬件设备进行 IO 操作的中断例程。
- 其它和硬件系统相关的中断例程。
BIOS 和 DOS 所提供的中断例程包含了许多子程序,可以用 int 指令直接调用。
在 DOS 的在所提供的中断例程中,和硬件设备相关的中断例程,一般都调用了 BIOS 的中断例程。
BIOS 和 DOS 中断例程的安装过程
一般来说: 自己编写中断例程,需要先将程序放到一段连续的内存空间中,然后才可以使用它。
BIOS 和 DOS 中断例程的安装过程:
-
系统开机,CPU 一通电,初始化 CS=0FFFH, IP=0, 自动从 FFFF:0000 单元开始执行程序。
-
FFFF:0000
处有一条跳转指令,转去执行 BIOS 中的硬件系统检测和初始化程序。 -
初始化程序:建立 BIOS 的中断向量表。
BIOS 所提供的中断例程都是固化到 ROM 中的程序,一直存在内存中,因此只需要记录程序入口即可。
-
硬件系统检测和初始化完成后,调用
int 19h
进行操作系统的引导。从此计算机交由操作系统控制。 -
DOS 启动后,除完成其它工作外,还将它所提供的中断例程装入内存,并建立相应的中断向量。
BIOS 中断例程应用
一般来说,一个供程序员调用的中断例程往往包含多个子程序,中断例程内部用传递进来的参数来决定执行哪一个子程序。
BIOS 和 DOS 提供的中断例程,都用 ah 来传递内部子程序的编号。
int 10h
- 包含多个和屏幕输出相关的子查询。
来传递内部子程序的编号。
int 10h
- 包含多个和屏幕输出相关的子查询。