汇编语言(第3版,王爽著):实验13-2 编写、应用中断例程 实现 loop 指令的功能
1. 思路:
可以参考第 13 章中的例子
2. int 7ch 中断例程代码:
文件名:exp132.asm
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 ; 将 bp 的值入栈,并且当前栈顶 sp 改变 (sp)=(sp)-2
mov bp, sp ; 将当前栈顶的值送入 bp 中
dec cx
jcxz lpret ; 如果 cx 为 0,则不改变栈中的偏移地址,直接返回
add ss:[bp + 2], bx ; ((ss)*16 + (bp) + 2) 就是栈中的偏移地址,加上位移,就等于了 s 标号处的地址
lpret:
pop bp
iret ; 未改变的栈中的偏移地址 或 改变了的栈中的偏移地址,此时也出栈
lpend:
nop
code ends
end start
3. 跟踪程序代码:
文件名:exp132d.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