对int、iret和栈的深入理解

来源:互联网 发布:淘宝买家订单导出工具 编辑:程序博客网 时间:2024/05/17 04:14

我们以一个程序来展开讨论:用7ch中断例程完成loop指令的功能,在屏幕中间显示80个"!"

1.程序框架如下

assume cs:codecode segmentstart: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,2int 7ch;进入中断处理程序se:nopmov ax,4c00hint 21hcode endsend 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 bpmov bp,spdec cxjcxz lpretadd [bp+2],bxlpret:pop bpiret

这里跟高级语言里面函数调用栈帧很相似,后面我会专门更新一篇介绍函数调用栈帧的文章。

0 0