一、编写并安装 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
begin:
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 begin
答案
assume cs:code
data segment
db 'welcome to masm!', 0
data ends
code segment
begin:
// 安装 int 7ch中断例程对应的程序在 0000:0200H处
mov ax, code
mov ds, ax
mov si, offset scstart
mov ax, 0h
mov es, ax
mov di, 200h
mov cx, offset scsend-offset scstart
cld
rep movsb
// 设置中断向量表
mov ax, 0
mov es, ax
mov word ptr es:[7ch*4], 200h
mov word ptr es:[7ch*4+2], 0h
// 测试程序
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
// int 7ch 的中断例程
scstart:
push dx
push cx
push bx
push ax
// 设置要显示的位置
mov ax, 0B800h
mov es, ax
mov al, 50
mul dh
mov si, ax
mov al, 4
mul dl
add si, ax
s:
// 循环遍历显示字符串
mov cl, [bx]
mov ch, 0
// 如果cx=0000 跳转至ok标号处
jcxz ok
// 要显示的字符
mov es:[si], cl
// 要显示的字符的属性
mov es:[si+1], dl
inc bx
add si, 2
jmp short s
// 退出int 7ch的程序
ok:
pop ax
pop bx
pop cx
pop dx
iret
scsend: nop
code ends
end begin
分析
-
1、
int 指令执行前CS、IP和栈中的状态int
指令执行前
,CS、IP和栈中的状态
-
2、
int 指令执行后CS、IP和栈中的状态int
指令执行后
,CS、IP和栈中的状态
- a、栈
0710:FFFE
的值为0202
,是当前标志寄存器的值 - b、栈
0710:FFFC
的值为0712
, 是当前CS寄存器的值 - c、栈
0710:FFFA
的值为0039
,是当前IP寄存器的值
- a、栈
-
3、
iret指令执行前,CS、IP和栈中的状态iret
指令执行前
,CS、IP和栈中的状态
-
4、
iret指令执行后,CS、IP和栈中的状态iret
指令执行后
,CS、IP和栈中的状态
* a、iret的指令过后,栈顶的数据被pop到 IP、CS、标志寄存器中。
二、编写并安装 int 7ch 中断例程,功能为完成loop指令的功能。
- 参数:(cx) = 循环次数,(bx) = 位移
- 以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其注意观察int、ret执行前后CS、IP和栈中的状态。
- 在屏幕中间显示80个
!
。
网友评论