实验13 编写、应用中断例程 第一小题(材料详见书上262页)
题目描述:
(1)编写并安装int 7ch中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。
参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串首地址。
以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其要注意观察int、iret指令执行前后CS、IP和栈中的状态。
以下是我解答的完整的代码:
:>----------------------------------------------------------------------------------------
[t1.asm] 文件内容(用于测试中断程序)
;程序功能:测试安将好的中断类型码为7ch的中断处理程
;参数:dh-行数,dl-列数,cl-属性字节,ds-字符串的段地址,si-偏移量
assume cs:codesg, ds:datasg, ss:stacksg
datasg segment
db ‘Welcome to masm!‘,0
datasg ends
stacksg segment
dw 16 dup(0)
stacksg ends
codesg segment
start: mov ax, stacksg
mov ss, ax
mov sp, 20h
mov dh, 10
mov dl, 10
mov cl, 2
mov ax, datasg
mov ds, ax
mov si, 0
;下面将转向中断处理程序
int 7ch
mov ax, 4c00h
int 21h
codesg ends
end start
[t2.asm] 文件内容 (用来安装中断程序)
;程序功能:安装中断类型码为7ch的中断处理程序到0000:0200
;并且修改中断向量表,使产生7ch中断时跳转到中断程序的入口
assume cs:codesg
codesg segment
start: mov ax, 0
mov es, ax
mov di, 200h
mov ax, cs
mov ds, ax
mov si, offset do7c
;由masm编译器计算要复制的字节量
mov cx, offset do7cend - offset do7c
;清除DF标志,即设置DF为0(表示si、di将自增)
cld
;把由ds:si指向的地址中的数据, 逐个字节复制到由es:di指向的地址空间
;复制的数量由cx指定
rep movsb
;以下设置中断类型码为7ch的中断处理程序入口, 改为0000:0200
mov word ptr es:[7ch*4], 200h
mov es:[7ch*4+2], es
mov ax, 4c00h
int 21h
;中断类型码为7ch的中断处理程序
do7c: push es
push si
push di
push ax
push cx
push dx
;以上保存程序中使用了的寄存器
mov ax, 0B800h
mov es, ax
mov al, 160
mul dh
mov di, ax
mov al, 2
mul dl
add di, ax
;以上用di保存根据参数行、列指定在显存中的偏移量
mov dl, cl
;以上用dl暂存参数-字符的显示属性字节, 因为下面要用jcxz来跳转
mov ch, 0
s0:mov cl, ds:[si]
jcxz ok
mov es:[di], cl
mov es:[di].1, dl
inc si
add di, 2
jmp s0
;以上根据字符信息、属性字节设置对应的显存内容
ok:pop dx
pop cx
pop ax
pop di
pop si
pop es
iret
mov ax, 4c00H
int 21H
do7cend:nop
codesg ends
end start
:<----------------------------------------------------------------------------------------
总结:
中断也可以以子程序调用的形式使用就像使用call指令。编译的时候 mov es:[7ch*4+2], es 我之前写成了
mov es:[7ch*4+2], 0 发现出错了,原来是不能直接将立即数传给段寄存器,须用通用寄存器当中介。在使用Debug调试t1.exe时,执行到 int 7ch 后正常的跳向中断处理程序入口,但不知道为什么在执行到 mov ax, 0B800h 时就出现下面的弹框:
原来是测试程序t1.exe中的栈设置的有点小。
正确 错误
dw 16 dup(0) 之前为 dw 8 dup(0)
mov sp, 20h 之前为 mov sp, 10h
------------- 以上的习题部分及代码引用于王爽老师的<<汇编语言>>第二版 ----------------