我们以一个程序来展开讨论:用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
这里跟高级语言里面函数调用栈帧很相似,后面我会专门更新一篇介绍函数调用栈帧的文章。
对int、iret和栈的深入理解
时间: 2024-10-05 23:27:20