前言:本实验为王爽老师的《汇编语言》第三版中的实验13(p262)
实验环境:DOSBox 0.74-3
实验任务:
(1)编写并安装 int 7ch 中断例程,功能为显式一个用 0 结束的字符串,中断例程安装在 0:200 处。
参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si 指向字符串首地址。
以上中断例程安装好后,对下面的程序进行单步跟踪,尤其注意观察 int,iret 指令执行前后CS,IP的和栈中的状态。
assume cs:code
data segment
db "welcome to masm!",0
data ends
code segment
start : mov dh,10
mov dl,10
mov cl,2
mov ax,data
mov ds,ax
mov si,0
int 7ch
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 do7ch
mov ax,0
mov es,ax
mov di,200h
mov cx,offset do7chend - offset do7ch
cld
rep movsb
;设置中断向量表
mov ax,0
mov ds,ax
mov word ptr ds:[7ch*4],200h
mov word ptr ds:[7ch*4 + 2],0
mov ax,4c00h
int 21h
do7ch: push ax
push es
push dx
push di
push cx
push si
;将程序使用到的寄存器入栈保存
mov ax,0b800h
mov es,ax
mov al,160
mul dh ;160 x 行号
add al,dl ;160 x 行号 + 列号
adc ah,0
mov di,ax ;di为字符显示位置
;es:di指向字符显示位置
s: mov al,[si]
cmp al,0
je ok ;为0则字符串结束
mov es:[di],al
mov es:[di+1],cl
inc si
add di,2
jmp short s
ok: pop si
pop cx
pop di
pop dx
pop es
pop ax
;恢复寄存器原始值
iret
mov ax,4c00h
int 21h
do7chend: nop
code ends
end start
测试程序运行结果: