(1)编写并安装 int 7ch 中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。
参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串首地址。
以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其注意观察 int、iret指令执行前后CS、IP和栈中的状态。
;sy13_1.asm
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 中断程序
;sy13_1i.asm 实验13(1)的 int 7c中断例程
;功能:显示一个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 ;设置ds:si指向源地址
mov ax,0
mov es,ax
mov di,200h ;设置es:di指向目标地址
mov cx,offset show_strend - offset show_str;设置cx为传输长度
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
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。
;参数:(dh)=行号(取值范围0~24);
; (dl)=列号(取值范围0~79);
; (cl)=颜色;
; ds:si指向字符串的首地址。
;返回:无。
show_str: push ax
push bx
push es
push si
mov ax,0b800h
mov es,ax
mov ax,160
mul dh
mov bx,ax ;bx=160*dh
mov ax,2
mul dl ;ax=dl*2
add bx,ax ;mov bx,(160*dh+dl*2)设置es:bx指向显存首地址
mov al,cl ;把颜色cl赋值al
mov cl,0
show0: mov ch,ds:[si]
jcxz show1 ;(ds:si)=0时,转到show1执行
mov es:[bx],ch
mov es:[bx+1],al
inc si ;ds:si指向下一个字符地址
add bx,2 ;es:bx指向下一个显存地址
jmp show0
show1: pop si
pop es
pop bx
pop ax
iret
mov ax,4c00h
int 21h
show_strend: nop
code ends
end start
运行结果:
(2)编写并安装int 7ch中断例程,功能为完成loop指令的功能。参数:(cx)=循环次数,(bx)=位移。
以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其注意观察 int、iret指令执行前后CS、IP和栈中的状态。
在屏幕中间显示80个“!”。
;sy13_2.asm
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
中断程序源码
;sy13_2.asm 实现13(2)的int 7ch中断程序
assume cs:code
code segment
;安装中断程序
start: mov ax,cs
mov ds,ax
mov si,offset lp ;设置ds:si指向源地址
mov ax,0
mov es,ax
mov di,200h ;设置es:di指向目标地址
mov cx,offset lpend - offset lp ;设置cx为传输长度
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
lp: push bp
mov bp,sp
dec cx
jcxz lpret
add ss:[bp+2],bx ;功能实质是IP = offset se + (offset s - offset se) = offset s
lpret: pop bp
iret ;跳转到s标号处理
mov ax,4c00h
int 21h
lpend: nop
code ends
end start
运行调试
进入7ch中断程序代码
执行中断代码,psw,cs,ip,bp相继入栈
iret指令执行完成后回到主程序
g 0018指令结束程序
(3)下面的程序,分别在屏幕的第2、4、6、8行显示4句英文诗,补全程序。
;sy13_3.asm (3)下面的程序,分别在屏幕的第2、4、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,ds:[si] ;dh中放行号
mov dl,0 ;dl中放列号
mov ah,2 ;置光标
int 10h
mov dx,ds:[bx] ;ds:dx指向字符串首地址
mov ah,9 ;在光标位置显示字符
int 21h
inc si ;行号递增
add bx,2 ;指向下一字符串
loop ok
mov ax,4c00h
int 21h
code ends
end start
运行结果:
完成后编译运行,体会其中的编程思想。