若余相思 发表于 2017-12-2 19:58:53

第十三章 int指令

本帖最后由 若余相思 于 2017-12-2 19:58 编辑

本章主要讲int指令引发的中断

13.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)

我们习惯将中断处理程序称为中断例程

13.2节   编写共应用程序调用的中断例程

问题一、编写、安装中断7cH的中断例程
             功能:求word型数据的平方
          参数: ax = 要计算的数值
          返回值Ldx,ax中存放结果的高16位和低16位

代码如下:
assume cs: code

code segment

start:        mov ax, cs
                        mov ds, ax
                        mov si, offset sqr
                       
                        mov ax, 0
                        mov es, ax
                        mov di, 0200H
                       
                        mov cx, offset sqrend - offset sqr
                       
                        cld
                        rep movsb
                       
                        mov ax, 0
                        mov es, ax
                       
                        mov word ptr es:, 0200H
                        mov word ptr es:, 0
                       
                        mov ax, 4c00H
                        int 21H
                       
        sqr:        mul ax
                        iret
                       
sqrend:        nop

                        mov ax, 4c00H
                        int 21H
                       
code ends
end start
                       
                       

问题二、编写、安装中断7cH的中断例程
        功能:将一个全是字母,以0结尾的字符串,转化为大写(即8bit位中的第五位)
        参数:ds:si指向字符串的首地址
       

代码如下:
assume cs: code

code segment

start:                mov ax, cs
                                mov ds, ax
                                mov si, offset capital
                               
                                mov ax, 0
                                mov es, ax
                                mov di, 0200H
                               
                                mov cx, offset capitalend - offset capital
                               
                                cld
                                rep movsb
                               
                                mov ax, 0
                                mov es, ax
                                mov word ptr es:, 0200H
                                mov word ptr es:, 0
                               
                               
                                mov ax, 4c00H
                                int 21H
                               
        capital:        push cx
                                push si
                               
change:        mov cl,
                                mov ch, 0
                                jcxz ok
                                and byte ptr , 11011111B
                                inc si
                                jmp short change
                               
                ok:        pop si
                                pop cx
                                iret
                               
capitalend:        nop

                        mov ax, 4c00H
                        int 21H
                       
code ends
end start

13.3节   对intiret和栈的深入理解

本节主要是讲解用中断例程编写loop循环

主程序代码:
assume cs: code

code segment

start:                mov ax, 0b800H
                                mov es, ax
                                mov di, 12*160
                               
                                mov bx, offset s - offset se
                                mov cx, 80
                               
        s:                        mov byte ptr es:, '!'
                                add di, 2
                                int 7cH
                se:        nop
                               
                                mov ax, 4c00H
                                int 21H
                               
code ends
end start

中断程序代码:
assume cs:code

code segment

start:       
                                mov ax, cs
                                mov ds, ax
                                mov si, offset lp
                               
                                mov ax, 0
                                mov es, ax
                                mov di, 0200H
                               
                                mov cx, offset lpend - offset lp
                               
                                cld
                                rep movsb
                               
                                mov ax, 0
                                mov es, ax
                                mov word ptr es:, 0200H
                                mov word ptr es:, 0
                               
                                mov ax, 4c00H
                                int 21H
                               
                lp:        push bp
                                mov bp, sp
                                dec cx
                                jcxz ok
                                add , bx
                               
                ok:        pop bp
                                iret
                               
                                mov ax, 4c00H
                                int 21H
        lpend:        nop
code ends
end start


中断例程的核心代码:
push bp
                                mov bp, sp
                                dec cx
                                jcxz ok
                                add , bx

主要分为以下几个步骤:
(1)将bp压栈
(2)将栈顶指向bp(用意是保护栈顶的位置,不会因为bp的错乱而搞得全部都错完)
(3)cx减1
(4)当cx = 0时跳转到结束的位置
(5)设置【bp + 2】为IP的指向,把bx(即距离s的偏移位移)赋值给IP,这就让IP指向s处


13.4节   BIOSS和DOS所提供的中断例程

BIOS(基础的输入输出系统),BIOS主要包含如下:
(1)硬件系统的检测和初始化程序
(2)外部中断和内部中断的中断例程
(3)用于对硬件设备进行I/O操作的中断例程
(4)其他和硬件相关的中断例程

程序员在编程时可以用int 指令调用BIOS和DOS的中断例程来完成某些工作


13.5节   BIOS和DOS中断例程的安装

下面是BIOS和DOS提供的中断例程的安装到内存中
(1)开机后,CPU加电,初始化(CS) = FFFFH,(IP) = 0,CPU自动从FFFF:0执行程序,FFFF:0有一条跳转指令,
CPU执行该指令后,转去执行BIOS的硬件系统的检测和初始化程序
(2)初始化程序将建立相关的中断向量(即将中断例程的入口i地址登陆到中断向量表中)
(3)硬件系统检测和初始化完成后,调用int 19H进行操作系统的引导,从此将计算机交付给操作系统控制
(4)DOS启动后,除了完成其他工作外,还将中断例程装入内存中,并建立相应的中断向量

也就是说,系统启动时首先启动BIOS程序,装入BIOS的中断向量,然后调用int 19H将计算机交给操作系统,然后才启动DOS,然后才建立DOS相关的中断例程

13.6节   BIOS中断例程的应用

对于中断是一个程序,里面会有许多小程序,并且有如下规则
ah:为子程序的编号,如:mov ah, 9,表示调用9号小程序
al:为子程序的字符,比如:mov al, 'a'
bh:为子程序的页号。比如:mov bh, 0,将在第0页
bl: 为al里面字体的颜色,比如mov bl, 11001010B
cx:为将要显示的al字符的个数,比如:mov cx, 3
dh:为行号
dl为列号


比如编写一个一个在屏幕的5行12列显示3个红底高亮闪烁绿色的a
代码:
assume cs: code

code segment

start:                mov ah, 2
                                mov bh, 0
                                mov dh, 5
                                mov dl, 12
                                int 10H
                               
                                mov ah, 9
                                mov al, 'a'
                                mov bh,0
                                mov bl, 11001010B
                                mov cx, 3
                                int 10H
                               
                                mov ax, 4c00H
                                int 21H
                               
code ends
end start

13.7节   DOS中断例程的应用

和上节的BIOS中断的规则差不多,就是调用int 21H中断的时候编号9的显示字符子程序,字符以$为结束

编写在屏幕5行12列显示字符串"I love fishc.com!"
代码:
assume cs: code

data segment

        db 'I love fishc,com!','



code segment

start:                mov ah, 2
                                mov dh, 5
                                mov dl, 12
                                mov bh, 0
                                int 10H
                               
                                mov ax, data
                                mov ds, ax
                                mov dx, 0
                                mov ah, 9
                                int 21H
                               
                                mov ax, 4c00H
                                int 21H
                               
code ends
end start

页: [1]
查看完整版本: 第十三章 int指令