引言

1.int 指令

1.CPU指令int n 指令,相当于引发一个 n 号中断的中断过程,执行过程如下:

1
2
3
4
5
1.取中断类型码 n ;
2.标志寄存器入栈,IF=0 TF=0
3.CS,IP入栈
4.(IP)=(N*4),(CS)=(N*4+2)
从此转去执行n号中断的中断处理程序

2.int指令和call指令类似,但是int是调试中断指令,但是call是函数

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

image-20230416230210682

1
2
3
1.编写实现平方功能的程序
2.安装程序,我们将其安装在0:200中
3.设置中断向量表,将程序的入口地址保存在7ch表项中,使其成为中断7ch的中断例程
1
2
3
4
5
6
7
8
9
10
11
12
assume cs:code 
code segment
start:
mov ax,3456 ;(ax)=3456
int 7ch ;调用中断7ch的中断例程,计算ax中的数据的平方

add ax,ax
adc dx,dx ;将结果乘以2
mov ax,4c00H
int 21h
code ends
end start
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
;编写:安装中断7ch的中断例程
;功能:求-word型数据的平方
;参数:(ax) = 要计算的数据
;返回值:dx,ax中存放结果的高和低16位

assume cs:code

code segment
start:
mov ax,cs
mov ds,ax
mov si,offset sqr ;设置ds和si的值,指向源程序
mov ax,0
mov es,ax
mov di,200H ;设置es:di指向目的地址;也就是那个安全空空间,在安全空间里面写入指令,然后让向量表指向这个写了代码的安全空间
mov cx,offset sqrent - offset sqr

cld
rep movsb ;ds:si的传入es:bi

mov ax,0
mov es,ax
mov word ptr es:[7ch*4],200H ;设置中断向量表,
mov word ptr es:[7ch*4+2],0 ;修改了7ch所指定的地址到了我们写入的安全空间

mov ax,4c00H
int 21h

sqr:mul ax ;mul指令是乘法指令,它默认的是al或ax中的值和某一个8/16位单元中乘法,放在ax 或者dx和ax中
iret ;iret是返回中断【int】,ret是返回普通的【call】

sqrend: nop

code ends
end start

3.对int,iret和栈的深入理解

int 7ch 引发中断过程后,它会把flag,ip和cs都压入栈中,此时压入的CS和IP中的内容,分辨是调用程序的段地址(可以认为是标号s的段地址)和int 7ch后一条指令的偏移地址(也就是标号se的偏移地址)

可见,在中断例程中,可以从栈里面取得标号s的段地址和标号se的偏移地址,而用se的偏移地址加上bx中存放的转移位移就可以得到s的偏移地址

1
2
3
4
5
6
7
8
9
10
11
12
;中断例程如下:
lp:
push bp
mov bp,sp
dec cx
jcxz lpret ;当cx为0的时候跳转
add [bp+2],bx 在使用bp的时候是默认是用ss段地址
;这里bp+2是因为,对于8086CPU每一个都占用2个字节
;
lpret:
pop bp
iret

这里因为要访问栈,使用bp,在程序开始处将bp入栈,结束的时候出栈恢复。当要修改栈中se的偏移地址的时候,栈中的情况是:栈顶处是bp原来的数值,下面是se的偏移地址,在下面是s的段地址,在下面是标志寄存器的值。而此时,bp中为栈顶的偏移地址,所以((ss)*16+(bp)+2)处是se的偏移地址,将他加上bx中的位移也就变成了s的偏移地址。最后用iret出栈返回,CS:IP即从标号s处开始执行

1
2
int 入栈的时候相当于是push 
它是往上走的
1
2
3
1.pop IP
2.pop CS
3.popf

4.BIOS和DOS中断例程的安装过程

int 10H中断例程是bios提供的中段例程,其中包含了多个屏幕输出相关的子程序

一般来说,一个供程序员调用的中断例程中往往包含多个子程序,中断例程内部用传递进来的参数来决定执行那个子程序

bios 和 dos 提供的中断例程,都是用ah来传递内部子程序的编号

int 10H中断例程的设置光标位置功能

1
2
3
4
5
mov ah,2	2号子程序
mov bh,0 行号
mov dh,5 列号
mov dl,12 页数
int 10h