关于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
结果:
 
 
 
posted @ 2019-07-19 16:31  L丶银甲闪闪  阅读(677)  评论(0编辑  收藏  举报