关于int指令
1.关于int指令
格式:int n
n为中断类型码;
作用:
调用n号中断程序;
指令“int n”的执行过程:
1】获取中断类型码n
2】标志寄存器入栈,IF、TF置0
3】cs、ip入栈
4】ip=4*n;cs=4*n+2;
总之,int指令的作用和call指令相似,都是用来调用一段程序;
int指令专门用来调用中断程序;
2.用中断例程模拟loop指令
loop s 是循环指令,作用是如果cx不为0,则跳转到s标号处;
分析:
loop指令需要两个条件:循环次数、到标号s处的位移;
可以将这两个条件作为参数,cx来存放循环次数,bx存放位移;
到标号处的位移计算公式为:位移=调用中断例程的下一条指令处的偏移 - 标号s处的偏移;
将计算得到的偏移量存入bx,作为参数传递到中断例程中;
为了实现转移到标号s处,需要修改cs:ip;
cs:ip的修改可以通过iret指令来实现,在中断例程调用iret返回时将用栈中的值来设置cs:ip,可以将栈中ip的值加上bx存放的偏移量,即为s处的偏移地址;
例如:利用中断实现循环,打印80个感叹号“!”
业务代码:
assume cs:code
code segment
start: mov ax,0b800h
mov es,ax
mov di,160*12 ;在屏幕12行显示
mov bx,offset s-offset se ;bx存放偏移量,作为参数传入中断处理程序
mov cx,3 ;循环次数
s: mov byte ptr es:[di],"!" ;输入感叹号
add di,2
int 7ch ;调用7c处的中断处理程序,作用是循环,如果cx != 0,跳到标号s处
se: nop
mov ax,4c00h
int 21h
code ends
end start
安装中断函数:
assume cs:code
code segment
start: mov ax,code ;利用movsb来安装中断函数
mov ds,ax
mov si,offset xh ;设置ds:[si]的值
mov ax,0
mov es,ax
mov di,200h ;设置es:[di]的值,用来将中断函数安装道0000:0200处
mov cx,offset xhe-offset xh ;中断函数的字节数由编译器计算
cld ;df标志位值0,表示正向复制
rep movsb ;循环复制
mov word ptr es:[4*7ch],200h ;修改中断向量表
mov word ptr es:[4*7ch+2],0
mov ax,4c00h
int 21h
xh: push bp
s: dec cx ;循环一次cx减一
jcxz ok ;如果cx=0则结束程序
mov bp,sp ;获取栈中ip的值,并将其加上参数bx传过来的偏移量,已达到跳转的目的
add [bp+2],bx
ok: pop ax
iret
xhe: nop ;中断函数结束
code ends
end start
结果:
3.BIOS和DOS提供的中断例程
关于bios:
bios是输入输出系统的英文缩写;
是系统板rom中存放的一套程序;
bios的作用:
1】硬件系统的检测和初始化程序
2】外部中断和内部中断例程
3】对硬件设备进行io操作的中断例程
4】其它和硬件系统相关的中断例程
bios和dos提供的中断例程中包含了许多子程序,在编程时可以用int命令来调用;
1)bios和dos中断例程的安装
自己编写的中断处理程序安装过程:
1】将中断程序放入安装程序
2】运行安装程序,将中断程序安装到指定内存区,该内存区不会被其它程序修改;
对于bios和dos中的中断例程的安装过程如下:
1】开机后,cpu通电,初始化cs:ip=0FFFFH:0;使得cpu从0FFFFH:0处的内存单元处开始执行程序;
0FFFFH:0处有一条跳转指令,cpu执行该指令后跳转去执行bios中的硬件系统检测和初始化程序;
2】初始化程序将bios中断例程的入口地址登记再中断向量表中;
因为bios中断例程是固化到ROM中的程序,会一直存在于内存中,所以只需要修改中断向量表即可;
3】硬件系统检测和初始化完成后,调用int 19h,进行操作系统引导,从此将计算机给操作系统控制;
4】操作系统启动后,例如dos,除了完成其它工作外,还会将它所提供的中断例程装入内存,并建立相应的中断向量;
2)关于bios中断例程
例如:int 10h 时bios提供的中断例程;
作用是和屏幕输出有关;
ah用来传递调用的子程序编号;
调用int 10h在5行列显示字符‘a’:
assume cs:code
code segment
start: mov ah,2 ;参数ah用来传递调用的子程序,2号子程序为放置光标
mov bh,0 ;第0页,参数bh传递页数
mov dh,5 ;第5行,dh放行号
mov dl,12 ;第12列,dl放列号
int 10h ;调用中断例程
mov ah,9 ;10h例程的9号子程序,用来在光标位置显示字符
mov al,'a' ;目标字符
mov bl,11001010b ;字符的颜色属性
mov bh,0 ;第0页
mov cx,3 ;字符重复3次
int 10h ;调用中断例程
mov ax,4c00h; 退出程序
int 21h
code ends
end start
结果:
3)关于dos中断例程
例如:int 21h 中断例程是由dos提供;
ah用来传送子程序编号;
比如 4ch号子程序用来返回程序;
mov ah,4ch
mov al,0
int 21h
相当于
mov ax,4c00h
int 21h
int 21h的第9号子程序可实现在光标处输出字符串;
ds:dx执行字符串,字符串以美元符“$”结尾;
例如:实现输出"hello world!"
assume cs:code,ds:data
data segment
db "hello world","$"
data ends
code segment
start:mov ax,data
mov ds,ax
mov dx,0
mov ah,9
int 21h
mov ax,4c00h
int 21h
code ends
end start
结果: