其实这一章和第十二章的内容是差不多的,只不过这一章着重讲述了int指令引发的内中断。
1. int 指令格式
int n ; n为中断类型码
2. cpu 执行 int 指令的过程
cpu执行 int 指令,相当于引发一个n号中断的中断过程,执行过程如下
(1) 取中段类型码n;
(2) 标志寄存器入栈;
(3) CS、IP 入栈
(4) (IP) = (n*4), (CS) = (n*4+2)。
3. 第十三章实验代码:
实验一:编写并安装 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 ax,cs
mov ds,ax
mov si,offset do7c
mov ax,0
mov es,ax
mov di,200h
mov cx,offset do7cend - offset do7c
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 dh,24
mov dl,63
mov cl,4
mov ax,data
mov ds,ax
mov si,0
int 7ch
mov ax,4c00h
int 21h
do7c: mov ax,0b800h
mov es,ax
mov al,160
mul dh
mov di,ax
mov al,2
mul dl
add di,ax
mov al,cl
begin: mov cl,[si]
jcxz ok
mov es:[di],cl
inc di
mov es:[di],al
inc si
inc di
jmp short begin
ok: iret
do7cend: nop
code ends
end start
实验二:编写并安装 7ch 中断例程,功能为完成 loop 指令的功能
参数: (CX) = 循环次数, (BX) = 位移
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset do7c
mov ax,0
mov es,ax
mov di,200h
mov cx,offset do7ce - offset do7c
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,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
do7c: push bp
mov bp,sp
dec cx
jcxz ok
add [bp+2],bx
ok: pop bp
iret
do7ce: nop
code ends
end start
运行结果: