文章目录
中断信息可以来自CPU的内部和外部,当CPU内部有需要处理的事情发生的时候,将产生需要马上处理的中断信息,引发中断过程。这一章中,我们讲解另一种重要的内中断,由int指令引发的中断。
13.1 int指令
int指令的格式为:int n,n为中断类型码,它的功能是引发中断过程。
13.2 编写供应用程序调用的中断例程
问题1:编写、安装中断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,offset 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
问题二:编写、安装中断7ch的中断例程。
安装程序:
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset capital ;设置ds:si指向源地址
mov ax,0
mov es,ax
mov di,200h ;设置es:di指向目的地址
mov cx,offset capitalend - offset capital ;设置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
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
在中断例程capital中用到了寄存器si和cx,编写中断例程和编写子程序的时候具有同样的问题,就是要避免寄存器的冲突。应该注意例程中用到的寄存器的值的保存和恢复。
13.3 对int、iret和栈的深入理解
问题:用7ch中断例程完成loop指令的功能
检测点 13.1
如果从loop的指令角度上看,loop就是个段内短转移,它的范围是-128~127,也就是说最大转移位移是128.
如果从例程中bx变量来说,先搞定bx存储二进制补码数据的表示范围。对于16位来说它表示的范围是(-32768~32767),最大位移是32768
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 ;如果是0跳出循环
mov al,[si]
mov es:[di],al
inc si
add di,2
mov bx,offset s-offset ok ;设置从标号ok到标号s的转移位移
int 7ch ;转移到标号s处
ok: mov ax,4c00h
int 21h
code ends
end start
assume cs:code
code segment
start: ;7cH中断例程的安装程序
mov ax, cs
mov ds, ax
mov si, offset lp ;将ds:si指向源地址(captial的机器码)
mov ax, 0000H
mov es, ax
mov di, 200H ;将es:di指向目的地址(0:200H向量表中)
mov cx, offset lpend - offset lp ;设置传输长度
cld ;传输方向为正
rep movsb ;字节传输
;设置中断向量表,使7cH条目中断向量指向0000:200H
mov ax, 0000H
mov es, ax
mov word ptr es:[7cH*4], 200H
mov word ptr es:[7cH*4+2], 0000H
mov ax, 4c00H
int 21H
;-------
;装载的例程:7cH
;功能:int 7cH实现和jmp near ptr s指令相同的功能
;入口参数:bx相对地址偏移量
;返回值:无
;-------
lp: push bp ;将bp这个ss栈的偏址保存
mov bp, sp ;将当前栈顶指针值送入到bp
add [bp+2], bx ;修改ss栈中的从栈顶向下第2个单元的值
lpret: pop bp ;恢复bp值
iret ;返回到调用处。
lpend: nop ;代码段结尾,便于计算7cH例程的长度。
code ends
end start
13.4 BIOS和DOS所提供的中断例程
13.5 BIOS和DOS中断例程的安装过程
BIOS和DOS提供的中断例程是如何安装到内存中的呢?
检测点 13.2
(1)错误。由于FFFF:0处的指令是无法改变的,只读的。
(2)错误。中断例程19h是主板上的ROM中固化的例程,是由BIOS提供的。不是由DOS提供的。
13.6 BIOS中断例程应用
编程:在屏幕的5行12列显示3个红底高亮闪烁绿色的’a’。
注意,闪烁的效果必须在全屏DOS方式下才能看到。
13.7 DOS中断例程应用
编程:在屏幕的5行12列显示字符串"Welcome to masm!"