实验13(2):https://blog.youkuaiyun.com/qq_41700629/article/details/89791981
实验13(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,2h
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: mov ax,cs
mov ds,ax
mov si,offset do7c
mov ax,0
mov es,ax
mov di,0200h
mov cx,offset do7cend-offset do7c
cld
rep movsb ;安装
mov ax,0
mov es,ax
mov word ptr es:[4*7ch],200h
mov word ptr es:[4*7ch+2],0 ;设置中断向量表
mov ax,4c00h
int 21h
do7c:
push ax
push es
push di
push cx
push bx ;保护寄存器
mov ax,0B800H
mov es,ax
mov di,0
mov al,160
mul dh
add di,ax ; 行
mov al,2
mul dl
add di,ax ; 列
;显存地址设置好了
mov bl,cl ; 放颜色
mov ch,0
s: mov cl,ds:[si]
jcxz ok
mov es:[di],cl
mov es:[di+1],bl
add di,2
inc si
jmp short s
ok: pop dx
pop cx
pop di
pop es
pop ax
iret ; 恢复寄存器并返回
do7cend:nop
code ends
end start
实验截图: