我们以一个程序来展开讨论:用7ch中断例程完成loop指令的功能,在屏幕中间显示80个"!"
1.程序框架如下
assume cs:code
code segment
start:
mov ax,0b800h ;向8086CPU显存的地址
mov di,160*12 ;显示位置
mov bx,offset s-offset se ;跳转的位移
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
2.中断处理程序的功能如下:
1)dec cx
2)如果(cx)!=0,转到标号s处执行,否则向下执行
那么如何实现到目的地址s的转移?
1)转移到s显然应设(CS)=s的段地址,(IP)=s的偏移地址
2)那么中断程序如何得到s的段地址和偏移地址?
3)现在知道,可以从栈中直接和间接获得s的段地址和偏移地址,那么如何用他们设置CS:IP?
7c的中断程序如下:
lp:
push bp
mov bp,sp
dec cx
jcxz lpret
add [bp+2],bx
lpret:
pop bp
iret
这里跟高级语言里面函数调用栈帧很相似,后面我会专门更新一篇介绍函数调用栈帧的文章。