(1)要求:
编写并安装int 7ch 中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。
参数: dh = 行号, dl = 列号,cl = 颜色,ds:si指向字符串首地址。
思路:
这里单纯的就是显示字符串,只需要编好显示子程序,再将子程序安装到0:200处,设置中断向量表即可。
dh* 160确定所在行的内存地址,dl* 2确定所在列
dh* 160 + dl* 2 就是要显示的字符串所要在的内存地址(前提是在B800h的基础上)
代码:
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset show_str
mov ax,0
mov es,ax
mov di,200h
mov cx,offset show_strend-offset show_str
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:push di
push si
push es
push cx
mov ax,0b800h
mov es,ax
mov al,160
mul dh //确定行,将行地址赋给bx
mov bx,ax
mov al,2
mul dl //确定列,将列地址赋给di
mov di,ax
s: mov ch,[si] //判断是否到达字符串末尾,是的话跳出中断
cmp ch,0
je ok
mov es:[bx+di],ch
mov es:[bx+di+1],cl
add di,2
inc si
jmp short s
ok: pop cx
pop es
pop si
pop di
iret
mov ax,4c00h
int 21h
show_strend:nop
code ends
end start
测试代码可观看王爽汇编语言第三版
结果展示:
(2)要求:
编写并安装int 7ch 中断例程,功能为完成loop指令的功能。
参数:cx = 循环次数, bx = 位移
思路:
如果要完成loop指令,那需要实现:
(1)dec cx
(2) 转到标号处执行,此时需要位移bx(loop指令的下一条指令地 址 减去标号处地址) ,还有就是需要设置cs , ip ;
进入中断时,系统会自动进行push cs , push ip操作;党退出时可使用 iret(pop ip , pop cs)此时 cs 没有发生改变,我们只需要改变ip,让ip+bx 这样当中断执行结束时,就会直接跳转到标号处。因为这里需要访问栈内数据,所以用到了bp
代码:
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset loops
mov ax,0
mov es,ax
mov di,200h
mov cx,offset loopend-offset loops
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
loops: push bp
mov bp,sp //先将当前栈顶保存
dec cx
jcxz lpret //判断是否为0 ,为0的话退出中断
add [bp+2],bx //[bp+2]保存的是ip,此时是为了赋值标号处的地址
lpret: pop bp
iret
loopend:nop
code ends
end
测试代码,可查看王爽汇编语言(第三版)