汇编-13.0-int指令

1.int指令

int指令的格式为:int n,n为中断类型码,它的功能是引发中断过程。

执行int n指令,相当于引发一个中断号为n的中断过程。

(1).取中断类型码n;

(2).标志寄存器入栈,IF=0,TF=0;

(3).CS、IP入栈;

(4).(IP)=(n*4),(CS)=(n*4+2).

int指令的最终功能是和call指令相似,都是调用子程序。

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

(1).

功能:求一word型数据的平方。

参数:(ax)= 要计算的数据。

返回值:dx、ax中存放结果的高16位和低16位。

应用举例:求2*3456^2

assume cs:code
code segment
start:mov ax,3456                     ;(ax)=3456
        int 7ch                              ;调用中断7ch的中断过程,计算ax中数据的平方
        add ax,ax
        adc dx,dx                           ;dx:ax存放结果,将结果乘以2
        mov ax,4c00h
        int 21h
code ends
end start

(2).中断例程

*编写实现要求平方的程序;

*安装程序,将其安装在0:200处;

*设置中断向量表,将程序的入口地址保存在7ch表项中,使其成为中断7ch的中断例程。

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 ssqrend-offset sqr    ;设置cx为传输长度
         cld                                 ;设置传输方向,标志寄存器的DF位置0
   rep movsb

        mov ax,0
        mov es,ax
        mov word ptr es:[7ch*4],200h
        mov word ptr es:[7ch*4+2],0        ;设置中断向量表
 
        mov ax,4c00h
        int 21h
 
sqr:   mul ax
         iret
sqrend:nop

code ends
end start
      

在中断例程的最后,要使用iret指令,返回程序原来正在执行的位置。

3. 对int、iret指令的深入理解

loop s的执行需要两个信息,循环次数和到s的位移,所以,7ch中断例程完成loop指令的功能,也需要这两个信息

作为参数。

assume cs:code
code segment
start:mov ax,0b800h
        mov es,ax
        mov di,160*12

        mov bx,offset s-offset se         ;设置从标号se到标号s的转移位移
        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

int 7ch引发中断过程后,进入7ch中断过程,在中断过程中,当前的标志寄存器、CS和IP都要压栈,此时压栈的CS和IP

的内容,分别是调用程序的段地址(可以认为是标号s的段地址)和int 7ch后的第一条指令的偏移地址(即标号se的偏移地址)。

 

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

标号s的偏移地址。

 

可以利用iret指令,我们将栈中的se的偏移地址加上bx 的转移位移,则栈中的se的偏移地址就变为了s的偏移地址。再使用iret指令,

用栈中的内容设置CS、IP,实现转移到s的标号处

lp:    push bp
        mov bp,sp
        dec cx

        jcxz lpret

        add [bp+2],bx

lpret:pop bp

        iret

因为要访问栈,使用了bp,在程序开始处将bp入栈,结束时出栈恢复。当要修改栈中se的偏移地址时,栈中的情况:

栈顶时bp原来的值,下面是se的偏移地址,在下面是s的段地址,再下面是标志寄存器的值。

此时,bp中为栈顶的偏移地址,所以((ss)*16+(bp)+2)处为se的偏移地址,将它加上bx中的转移位移就变为s的

偏移地址。最后用iret出栈,CS:IP即从标号S处返回开始执行指令。

如果cx=0,则不需要修改栈中se的偏移地址,直接返回即可。

4.BIOS和DOS所提供的中断例程

在系统板的ROM中存放着一套程序,称为DIOS(基本输入输出系统),BIOS中主要包含以下几部分:

(1).硬件系统的检测和初始化程序;

(2).外部中断和内部中断;

(3).用于对硬件设备进行I/O操作的中断例程;

(4).其他硬件系统相关的中断例程。

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

 

6.BIOS中断例程应用

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

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

7.DOS中断例程应用

int 21h中断例程是DOS提供的中断例程,其中包括了DOS提供给程序员编程时调用的子程序。

一般使用int 21h中断例程的4ch号功能,即程序返回功能:

mov ah,4ch      ;程序返回
mov al,0          ;返回值
int 21h

(ah)=4表示调用第21号中断例程4ch号子程序,功能为程序返回,可以提供返回值作为参数。

 

posted @ 2018-08-17 18:24  西贡小傻  Views(440)  Comments(0Edit  收藏  举报