汇编第十三节-int指令

第13节:int指令

int指令可以引起中断;

1.int指令:

int指令格式:int n ,n为中断类型码,功能:引发中断过程。
CPU执行int n指令,相当于引发一个n号中断的中断过程。

a.取中断类型码n
b.标志寄存器入栈,IF=0,TF=0;
c.CS,IP入栈
d.(IP)=(n*4),(CS)=(n*4+2)

从此转去执行n号中断的中断处理程序。

可以在程序中使用int指令调用任何一个中断的中断处理程序。

assume cs:code
code segment
  start: mov ax,0b800h
         mov es,ax
         mov byte ptr es:[12*160+40*2],'!'
         int 0
code ends
end start

程序是没有做除法,但是在结尾使用了int 0指令,引发中断过程,执行0号中断处理程序。
而系统设置0号中断处理程序的功能是显示”divide overflow”,然后返回到系统。

系统将一些具有一定功能的子程序,以中断处理处理程序的方式提供给应用程序调用。在编程时,可以用int指令调用这些子程序。

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

中断处理程序简称中断例程。
eg:编写,安装中断7ch的中断例程。
功能:求一word型数据的平方。
参数:(ax)=要计算的数据。
返回值:dx,ax中存放结果的高16位和低16位。
比如,2*3456^2

assum 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

3部分工作:编写实现求平方功能的程序;安装程序,求其安装在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,0ffset sqrend-offset sqr   ;设置cx为传输长度
          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
    sqr:  mul ax
          iret
 sqrend:  nop
code ends
end start

eg:编写,安装中断7ch的中断例程。
功能:将一个全是字母,以0结尾的字符串,转化为大写。
参数:ds:si指向字符串的首地址
举例:将data段中的字符串转化为大写。

assume cs:code
data segment
    db  'conversation',0
data ends
code segment
 start: mov ax,data
        mov ds,ax
        mov si,0
        int 71ch
        mov ax,4c00h
        int 21h
code ends
end start

安装程序如下:

assume cs:code
code segment
  start: mov ax,cs
         mov ds,ax
         mov si,offset capital
         mov ax,0
         mov es,ax
         mov di,200h
         mov cx,offset capitalend-offset capital
         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
 capital:push cx
         push si
  change:mov cl,[si]
         mov ch,0
         jcxz ok
         and byte ptr [si],11011111b
         inc si
         jmp short change
    ok:  pop si
         pop cx
         iret
capitalend:nop
code ends
end start

3.对int,iret和栈的深入理解:

eg:用7ch中断例程完成loop指令的功能。
loop s的执行需要循环次数(cx)和s的位移(bx)
在屏幕中显示80个‘!’

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 71ch                          ;如果(cx)!=0,转移到标号s处
    se:   nop

          mov ax,4c00h
          inc 21h
code ends
end start

7ch中断例程如下

lp :push bp
      mov bp,sp
      dec cx
      jcxz lpret
      add [bp+2],bx
lpret:pop bp
      iret

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

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

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

操作系统DOS也提供中断例程,就是操作系统向程序员提供的编程资源。

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

BIOS和DOS提供的中断例程是如何安装到内存中的?

a.开机后,CPU一加电,初始化(CS)=0FFFFH,(IP)=0,自动从FFFF:0单元开始执行程序。
  FFFF:0处跳转指令,转去执行BIOS中的硬件系统检测和初始化程序。
b.初始化程序将建立BIOS所支持的中断向量,即将BIOS提供的中断例程的入口地址登记在中断向量表中。
c.硬件系统检测和初始化完成后,调用int 19h 进行操作系统的引导。将计算机交由操作系统控制。
d.DOS启动后,除完成其他工作后,还将它提供的中断例程装入内存,并建立相应的中断向量。

6.BIOS中断例程应用:

int 10h 中断例程是BIOS提供的中断例程,其中包含了多个和屏幕输出相关的子程序。
BIOS和DOS提供的中断例程都用ah来传递内部子程序的编号。

int 10h 中断例程的设置光标位置功能:
mov ah,2    ;置光标
mov bh,0    ;第0页
mov dh,5    ;dh中放行号
mov dl,12   ;dl中放列号
int 10h

int 10h 中断例程的在光标位置显示字符的功能:

mov ah,9    ;在光标位置显示字符
mov al,'a'  ;字符
mov bl,7    ;颜色属性
mov bh,0    ;第0页
mov cx,3    ;字符重复个数
int 10h

bl中颜色属性格式如下:

7     6 5 4     3   2 1 0
BL    R G B     I   R G B 
闪烁   背景     高亮   前景

eg:在屏幕的第5行12列显示3个红底高亮闪烁绿灯的’a’

assume cs:code
code segment
    mov ah,2            ;置光标
    mov bh,0            ;第0页
    mov dh,5            ;dh中放行号
    mov dl,12           ;dl中放列号
    int 10h

    mov ah,9            ;在光标位置显示字符
    mov al,'a'          ;字符
    mov bl,11001010b    ;颜色属性
    mov bh,0            ;第0页
    mov cx,3            ;字符重复个数
    int 10h

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

7.DOS中断例程应用:

mov ah,4ch ;程序返回
mov al,0 ;返回值
int 21h
前面我们一直使用的是int 21h中断例程的4ch号功能

在屏幕的第5行12列显示字符串”welcome to masm!”

assume cs:code
data segment
    db 'welcome to masm!','$'
data ends
code segment
    mov ah,2            ;置光标
    mov bh,0            ;第0页
    mov dh,5            ;dh中放行号
    mov dl,12           ;dl中放列号
    int 10h

    mov ax,data
    mov ds,ax
    mov dx,0
    mov ah,9            ;ds:dx指向2字符串的首地址data:0
    int 21h 

    mov ax,4c00h
    int 21h
code ends
end start
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值