1、编写安装7ch号中断例程,显示0结尾的字符串
中断例程装载程序:
; 8086实模式 中断例程装载程序
; 中断号 7ch
; 装载位置 0:200h
assume cs:code
code segment
start:
mov ax,cs
mov ds,ax
mov si,offset handler ; ds:si指向中断例程的代码
mov ax,0
mov es,ax
mov di,200h ; es:di指向中断例程装载位置
mov cx,offset handlerend - offset handler ; 中断例程长度
cld
rep movsb ; 串传输
; 设置 7ch 号中断向量
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
handler:
; 注意!下文中断例程装载程序,只提供 handler 标号的部分,即,
; 中断处理程序开始 与 中断处理程序结束 包裹的部分
; 中断处理程序开始
; 显示0结尾的字符串
; dh 行号、dl 列号、cl 颜色、ds:si指向字符串首
push si
push es
push di
push ax
push dx
push cx
mov ax,0b800h ; 显存开始位置
mov es,ax
mov al,dh
mov dh,160
mul dh ; ax=行号*160
mov dh,0
add dx,dx ; dx=列号*2
add ax,dx
mov di,ax ; di=行号*160+列号*2
s:
mov al,[si]
cmp al,0
je ok
mov ah,cl
mov es:[di],ax
add di,2
inc si
jmp s
ok:
pop cx
pop dx
pop ax
pop di
pop es
pop si
iret
; 中断处理程序结束
handlerend:
nop
code ends
end start
调用者程序:
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、编写安装7ch号中断例程,模拟loop指令
中断例程:
; 中断处理程序开始
lp:
push bp
mov bp,sp
dec cx
jcxz lpret
add [bp+2],bx ; bx是转移位移
lpret:
pop bp
iret
; 中断处理程序结束
调用者:
assume cs:code
code segment
start:
mov ax,0b800h
mov es,ax
mov di,160*12
mov bx,offset s - offset se ; 这里的结果必须是负数,bx即转移位移
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
执行结果:
3、补全程序,在屏幕2、4、6、8行显示英文诗
源码
; 在 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,[si] ; 行号
mov dl,0 ; 列号
mov ah,2 ; 调10h中断例程中的显示例程
int 10h ; 调bios的10h号例程
mov dx,ds:[bx] ; ds:dx执行要显示字符串首
mov ah,9 ; 调21h中断例程的9号例程
int 21h ; 调dos的21h号中断例程
inc si
add bx,2
loop ok
mov ax,4c00h
int 21h
code ends
end start
结果: