|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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
|
|