|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 若余相思 于 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:[7cH*0], 0200H
- mov word ptr es:[7cH + 2], 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:[7cH*4], 0200H
- 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
- mov ax, 4c00H
- int 21H
-
- code ends
- end start
复制代码
13.3节 对int iret和栈的深入理解
本节主要是讲解用中断例程编写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:[di], '!'
- 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:[7cH * 4], 0200H
- mov word ptr es:[7cH * 4 + 2], 0
-
- mov ax, 4c00H
- int 21H
-
- lp: push bp
- mov bp, sp
- dec cx
- jcxz ok
- add [bp + 2], 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 [bp + 2], 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
复制代码
|
|