实验1
(1)编写并安装int 7ch中断例程,功能为显示一个用О结束的字符串,中断例程安装在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
方法一设置光标显示程序
;编写并安装int 7ch中断例程, 功能为显示
;一个用0结束的字符串, 中断例程安装在0:200处
;参数: (dh)=行号, (dl)=列号, (cl)=颜色, ds:si指向字符串首地址
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset show_str
mov ax,0
mov es,ax
mov di,200h
mov cx,offset show_strend-offset show_str
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,4c00h
int 21h
show_str:
mov bl,cl ;颜色属性
mov bh,0 ;第0页
s: mov ah,2 ;置光标
;dh行号, dl列号
int 10h
mov ch,0
mov cl,ds:[si]
jcxz ok
mov ah,9 ;在光标位置显示字符
mov al,cl ;字符
; mov bh,0 ;第0页
mov cx,1 ;字符重复个数
inc si
inc dl
int 10h
jmp short s
ok: iret
show_strend:nop
code ends
end start
运行结果:
方法二修改显存数据
;编写并安装int 7ch中断例程, 功能为显示
;一个用0结束的字符串, 中断例程安装在0:200处
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset show_str
mov ax,0
mov es,ax
mov di,200h
mov cx,offset show_strend-offset show_str
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,4c00h
int 21h
;参数: (dh)=行号, (dl)=列号, (cl)=颜色, ds:si指向字符串首地址
show_str:
mov ax,0b800h
mov es,ax
mov al,160
mul dh
mov dh,0
add dx,dx
add ax,dx
mov di,ax ;显示位置es:bx
mov dl,cl ;dl显示颜色属性
s: mov ch,0
mov cl,ds:[si]
jcxz ok
mov es:[di],cl
mov es:[di+1],dl
inc si
add di,2
jmp short s
ok: iret
show_strend:nop
code ends
end start
运行结果:
实验2
(2)编写并安装int 7ch中断例程,功能为完成loop指令的功能
参数:(cx)=循环次数,(bx)=位移
以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其注意观察int、iret指令执行前后CS、IP和栈中的状态。
在屏幕中间显示80个“!”。
assume cs:code
code segment
start: mov ax,0b800h
mov es,ax
mov di,160*12
mov bx,offset s-offset se ;设置从标号se到标号s的转移位移
mov cx,80
s: mov byte ptr es:[di],'!'
add di,2
int 7ch ;如果(cx)!=0, 转移到标号s处
se: nop
mov ax,4c00h
int 21h
code ends
end start
安装例程:
;编写并安装int 7ch中断例程, 功能为完成loop指令的功能
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset lp
mov ax,0
mov es,ax
mov di,200h
mov cx,offset lpend-offset lp
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,4c00h
int 21h
;参数: (cx)=循环次数, (bx)=位移
lp: push bp
mov bp,sp
dec cx
jcxz ok
add ss:[bp+2],bx
ok: pop bp
iret
lpend: nop
code ends
end start
运行结果:
实验3
(3)下面的程序,分别在第2/24/6/8行显示4句英文诗,补全程序。
assume cs:code
code segment
s1: db 'Good,better,best,','$'
s2: db 'Never let it rest','$'
s3: db 'Till good is better,','$'
s4: db 'And better,best.','$'
s : dw offset s1,offset s2,offset s3,offset s4
row:db 2,4,6,8
start: mov ax,cs
mov ds,ax
mov bx,offset s
mov si,offset row
mov cx,4
ok: mov bh,0 ;第0页
mov dh,____ ;设置行
mov dl,0 ;设置列
mov ah,2 ;置光标
int 10h
mov dx,____
mov ah,9 ;在光标位置显示字符
int 21h
____________
____________
loop ok
mov ax,4c00h
int 21h
code ends
end start
补全后程序:
assume cs:code
code segment
s1: db 'Good,better,best,','$'
s2: db 'Never let it rest','$'
s3: db 'Till good is better,','$'
s4: db 'And better,best.','$'
s : dw offset s1,offset s2,offset s3,offset s4
row:db 2,4,6,8
start: mov ax,cs
mov ds,ax
mov bx,offset s
mov si,offset row
mov cx,4
ok: mov bh,0 ;第0 页
mov dh,ds:[si] ;设置行
mov dl,0 ;设置列
mov ah,2 ;置光标
int 10h
mov dx,ds:[bx] ;显示英文诗句
mov ah,9 ;在光标位置显示字符
int 21h ;调用后可以显示ds:dx, 直到$截止
add bx,2
inc si
loop ok
mov ax,4c00h
int 21h
code ends
end start
运行结果: