引言
无
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.编写供应用程序调用的中断例程
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
|