首页 > 代码库 > 对int、iret和栈的深入理解
对int、iret和栈的深入理解
我们以一个程序来展开讨论:用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
这里跟高级语言里面函数调用栈帧很相似,后面我会专门更新一篇介绍函数调用栈帧的文章。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。