int指令---汇编学习笔记

int指令

int指令可以引发中断


13.1 int指令

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

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

  1. 取中断类型码n
  2. 标志寄存器入栈,IF=0、TF=0
  3. CS、IP入栈
  4. (IP)=(n4),(CS)=(n4+2) ( I P ) = ( n ∗ 4 ) , ( C S ) = ( n ∗ 4 + 2 )

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

很简单的例子自己看。


13.3 对int、iret和栈的深入理解

用int 7ch来模拟loop指令,挺复杂的。

大致步骤如下:

  1. int引发中断的过程,将CS、IP入栈
  2. 将栈中的 (IP)=(IP)(looploop) ( I P ) = ( I P ) − ( l o o p 指 令 位 置 − l o o p 标 号 位 置 )
  3. 执行iret指令,将CS、IP弹出

例子:
int指令---汇编学习笔记_第1张图片

int指令---汇编学习笔记_第2张图片

将上面的例子简单概括一下:

  1. int 7ch引发中断,将CS、IP入栈
  2. 7ch中断例程中的add [bp+2],bx是将入栈后的IP改为s标号处的IP
  3. iret指令执行后,将CS、IP弹出,将指令执行位置重新定位到s标号处
  4. 如果cx等于0,那么将不会执行add [bp+2],bx,这样程序将向下继续执行

检测点 13.1
(1)在上面的内容中,我们用7ch中断例程实现loop的功能,则上面的7ch中断例程所能进行的最大转移位移是多少?
答:必须在1个字所能存储的范围以内,也就是0000~FFFF,容量大小是65536。
(2)用7ch中断例程完成jmp near ptr s指令的功能,用bx向中断例程传送转移位移。
应用举例:在屏幕的第12行,显示data段中以0结尾的字符串。

assume cs:code
data segment
    db 'conversation',0
data ends

code segment
    start:
        mov ax,data
        mov ds,ax
        mov si,0
        mov ax,0b800h
        mov es,ax
        mov di,12*160
    s:
        cmp byte ptr [si],0
        je ok
        mov al,[si]
        mov es:[di],al
        inc si
        add di,2
        mov bx,offset s-offset ok
        int 7ch

    ok:
        mov ax,4c00h
        int 21h

code ends
end start

int 7ch中断例程及安装

assume cs:code

code segment
    start:
        mov ax,cs
        mov ds,ax
        mov si,offset s
        mov ax,0
        mov es,ax
        mov di,200h
        mov cx,offset se-offset s
        cld
        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

    s:
        push bp
        mov bp,sp
        add [bp+2],bx
        pop bp
        iret

    se:
        nop

code ends
end start

完整程序:

assume cs:code
data segment
    db 'conversation',0
data ends


code segment
    start:
        mov ax,cs
        mov ds,ax
        mov si,offset s
        mov ax,0
        mov es,ax
        mov di,200h
        mov cx,offset se-offset s
        cld
        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,data
        mov ds,ax
        mov si,0
        mov ax,0b800h
        mov es,ax
        mov di,12*160
    s1:
        cmp byte ptr [si],0
        je ok
        mov al,[si]
        mov es:[di],al
        inc si
        add di,2
        mov bx,offset s1-offset ok
        int 7ch

    ok:
        mov ax,4c00h
        int 21h

    s:
        push bp
        mov bp,sp
        add [bp+2],bx
        pop bp
        iret
    se:
        nop

code ends
end start

13.4 BIOS和DOS所提供的中断例程

BIOS中主要包括以下几部分内容。

  1. 硬件系统的检测和初始化程序
  2. 外部中断和内部中断的中断例程
  3. 用于对硬件设备进行I/O操作的中断例程
  4. 其他和硬件系统相关的中断例程

操作系统DOS也提供了中断例程,从操作系统的角度来看,DOS的中断例程就是操作系统向程序员提供的编程资源。

BIOS和DOS在所提供的中断例程中包含了许多子程序,这些子程序实现了程序员在编程的时候经常需要用到的功能。程序员在编程的时候,可以用int指令直接调用BIOS和DOS提供的中断例程,来完成某些工作。

和硬件设备相关的DOS中断例程中,一般都调用了BIOS的中断例程。


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

BIOS和DOS提供的中断例程的安装过程

  1. 开机后,CPU一加电,初始化(CS)=0FFFFH,(IP)=0,自动从FFFF:0单元开始执行程序。FFFF:0处有一条转跳指令,CPU执行该指令后,转去执行BIOS中的硬件系统检测和初始化程序。
  2. 初始化程序将建立BIOS所支持的中断向量,即将BIOS提供的中断例程的入口地址登记在中断向量表中。注意,对于BIOS所提供的中断例程,只需将入口地址登记在中断向量表中即可,因为它们是固化到ROM中的程序,一直在内存中存在。
  3. 硬件系统检测和初始化完成后,调用int 19h进行操作系统的引导。从此将计算机交由操作系统控制。
  4. DOS启动后,除完成其他工作外,还将它所提供的中断例程装入内存,并建立相应的中断向量。

检测点 13.2
判断下面说法的正误:
(1)我们可以编程改变FFFF:0处的指令,使得CPU不去执行BIOS中的硬件系统检测和初始化程序。
答:不行,因为BIOS的中断例程是ROM(只读)。
(2)int 19h中断例程,可以由DOS提供。
答:不行,因为int 19h是用来启动DOS的。而DOS不能在没被启动的情况下提供int 19h。


13.6 BIOS中断例程应用

自行阅读,略过。


13.7 DOS中断例程应用

这里说明一个内容,其他自行阅读,略过。

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

实验13 编写、应用中断例程

(1)编写并安装int 7ch中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。
参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串首地址。

assume cs:code
data segment
    db 'welcome to masm!',0
data ends
code segment
    start:
        mov dh,10
        mov dl,10
        mov cl,2
        mov ax,data
        mov ds,ax
        mov si,0
        int 7ch
        mov ax,4c00h
        int 21h
code ends
end start

7ch中断例程编写及其安装

assume cs:code
code segment
    start:
        mov ax,cs
        mov ds,ax
        mov si,offset s
        mov ax,0
        mov es,ax
        mov di,200h
        mov cx,offset se-offset s
        cld
        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 


    s:
        mov ax,0b800h
        mov es,ax
        mov ax,160
        mul dh
        mov di,ax
        mov ax,2
        mul dl
        add di,ax

    sl:
        mov al,ds:[si]
        mov ah,0
        cmp ah,al
        je  ok
        mov ah,cl
        mov es:[di],ax
        inc si
        add di,2
        jmp sl

    ok:
        iret

    se:
        nop


code ends
end start

实验结果:
int指令---汇编学习笔记_第3张图片
(2)编写并安装int 7ch中断例程,功能为完成loop指令的功能。
参数:(cx)=循环次数,(bx)=位移。

assume cs:code
code segment
    start:
        mov ax,0b800h
        mov es,ax
        mov di,160*12
        mov bx,offset s-offset se
        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

7ch中断例程及其安装:

assume cs:code
code segment
    start:
        mov ax,cs
        mov ds,ax
        mov si,offset s
        mov ax,0
        mov es,ax
        mov di,200h
        mov cx,offset se-offset s
        cld
        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 


    s:
        push bp
        mov bp,sp
        dec cx
        jcxz ok
        add [bp+2],bx

    ok:
        pop bp
        iret

    se:
        nop


code ends
end start

实验结果:
int指令---汇编学习笔记_第4张图片
(3)下面的程序,分别在屏幕的第2、4、6、8行显示4句英文诗,补全程序。

assume cs:code
code segment
    s1:
        db 'Good,better,best,','$'
    s2:
        db 'Never let it rest,','$'
    s3:
        db 'Till good is better,','$'
    s4:
        db 'And better,best.','$'
    s:
        dw offset s1,offset s2,offset s3,offset s4
    row:
        db 2,4,6,8
    start:
        mov ax,cs
        mov ds,ax
        mov bx,offset s
        mov si,offset row
        mov cx,4
    ok:
        mov bh,0
        mov dh,
        mov dl,0
        mov ah,2
        int 10h

        mov dx,
        mov ah,9
        int 21h


        loop ok
        mov ax,4c00h
        int 21h
code ends
end start

实验结果:
int指令---汇编学习笔记_第5张图片

你可能感兴趣的:(汇编语言)