《汇编语言》- 读书笔记 - 第13章-实验13编写、应用中断例程
- 1. 编写并安装中断例程
- 主程序
- 运行效果
- 2. 编写并安装 int 7ch 中断例程,功能为完成 loop 指令的功能。
- 3. 下面的程序,分别在屏幕的第 2、4、6、8行显示4句英文诗,补全程序。
1. 编写并安装中断例程
需求 | 编写并安装 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 i7ch ;设置 ds:si 指向源地址
mov ax,0
mov es,ax
mov di,200h ;设置 es:di 指向目的地址
mov cx,offset i7chend -offset i7ch ;设置 cx为传输长度
cld ;设置传输方向为正。movsb中si,di递增
rep movsb ;重复复制数据次数由 cx 控制
; ---------------- 安装(复制数据) ----------------
; ----------------- 设置中断向量 -----------------
mov ax,0
mov es,ax ; 段地址 0
mov word ptr es:[7ch*4],200h ; 设置【中断处理程序】的:偏移地址
mov word ptr es:[7ch*4+2],0 ; 设置【中断处理程序】的:段地址
; ----------------- 设置中断向量 -----------------
mov ax, 4c00H ; 退出
int 21H ; 触发33号中断
; =======================================================
; --------------------- 中断处理程序 --------------------
; 在指定位置,打印字符串。以 0 结束
; -------------------------------------------------------
; 参数:(dh)=行号
; 参数:(dl)=列号
; 参数:(cl)=颜色
; 参数:ds:si 指向字符串首地址。
; -------------------------------------------------------
i7ch: push es ; 备份寄存器
push di
push dx
push cx
mov ax,0b800h ; 设置显存
mov es,ax
mov al,160 ; 先算行偏移
dec dh ; 行号从 0 开始,所以这里要先减1
mul dh ; 行数 x 160算出行偏移
mov di,ax ; 行偏移先存到 di
mov al,2 ; 再算列偏移
dec dl ; 列号从 0 开始,所以这里要先减1
mul dl ; 每列2字 * 列号
add di,ax ; 行+列 = 算出目标字符串(显存)的开始位置
mov ch,cl ; 文字属性放到 ch 去
sloop: mov cl,[si] ; 取字符
cmp cl,0 ; 判断如果取到的是 0
je ok ; 就跳出循环结束,否则继续
mov es:[di],cx ; 字符写入显存
inc si ; si 递增,源字符串指向下一字符
add di,2 ; di += 2,目标字符串指向下一字符
jmp short sloop
ok: pop cx ; 还原寄存器
pop dx
pop di
pop es
iret ; 返回原程序
i7chend: nop
; --------------------- 中断处理程序 --------------------
; =======================================================
code ends
end start
以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其注意观察int、iret
指令执行前后 CS、IP
和栈
中的状态。
主程序
assume cs:code
data segment
db 'Welcome to masm',0
data ends
code segment
start: mov dh,10 ; dh 中放行号
mov dl,10 ; dl 中放列号
mov cl,2 ; 文字颜色属性
mov ax,data ; 设置数据段
mOv ds,ax
mov si,0 ; 指向data开头字符
int 7h
ok: mov ax,4c00h
int 21h
code ends
end start
运行效果
int 前后 | iret 前后 |
---|---|
2. 编写并安装 int 7ch 中断例程,功能为完成 loop 指令的功能。
第13章-int 指令 - 13.3 已实现此功能。
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 ; 取诗句偏移量,dw 类型每个元素2字节
mov si,offset row ; 取行数偏移量,db 类型每个元素1字节
mov cx,4
ok: mov bh,0 ; 第几页显示
mov dh,[si] ; 行(Y坐标)___________
mov dl,0 ; 列(X坐标)
mov ah,2 ; 10h中断2号子程序:设置光标位置
int 10h ; BIOS中断:显示服务
mov dx,[bx] ; DS:DX 待输出字符的地址___________
mov ah,9 ; 21h中断9号子程序:显示字符串
int 21h ; DOS中断
inc si ; 下一个行数___________
add bx,2 ; 下一条诗句___________
loop ok
mov ax,4c00h
int 21h
code ends
end start