(1)、编写并安装int 7ch中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处
参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串首地址。
参考代码(名为t11.asm):
assume cs:codesg
codesg segment
beign: mov ax,cs
mov ds,ax
mov si,offset show_str
mov ax,0
mov es,ax
mov di,200
mov cx, offset show_end - offset show_str
cld
rep movsb ; 安装自定义中断程序于内存单元的0000:200处
mov word ptr es:[7ch*4],200
mov word ptr es:[7ch*4+2],0 ; 注册7cH号中断的处理程序入口地址
mov ax,4c00h
int 21h
show_str: 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 ; 保存颜色值
s: mov cl,[si]
mov ch,0
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 ; 退出中断处理程序
show_end: nop
codesg ends
end beign
对应给出的测试触发中断程序如下(名为t1101.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
运行结果图:
(2)、编写并安装int 7ch中断例程,功能为完成loop指令的功能。
参数:(CX)=循环次数,(BX)=位移
参考代码(名为t12.asm):
assume cs:codesg
codesg segment
start: mov ax,cs
mov ds,ax
mov si,offset lp
mov ax,0
mov es,ax
mov di,200
mov cx, offset lpend - offset lp
cld
rep movsb ; 安装中断处理程序
mov word ptr es:[7ch*4],200
mov word ptr es:[7ch*4+2],0 ; 注册中断处理程序
mov ax,4c00h
int 21h
lp: push bp
dec cx
jcxz ok
mov bp,sp
add [bp+2],bx ; 将IP指向标记处
ok: pop bp
iret
lpend: nop
codesg ends
end start
对应给出的测试触发中断程序如下(名为t1201.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
se: nop
mov ax,4c00h
int 21h
code ends
end start
运行结果图:
(3)、分别在屏幕的第2、4、6、8行显示四句英文诗,补全程序。
参考答案:
assume cs:code
code segment
s1: db 'Good,btter,best,','$'
s2: db 'Nerver 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
mov dh,[si] ; 设置行
mov dl,0
mov ah,2
int 10h
mov dx,[bx] ; 设置待显示字符串的偏移地址
mov ah,9
int 21h
inc si ; 设置下一行的地址索引
add bx,2 ; 设置下一个显示字符的偏移地址
loop ok
mov ax,4c00h
int 21H
code ends
end start
运行结果图: