对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

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

对int、iret和栈的深入理解

时间: 2024-10-05 23:27:20

对int、iret和栈的深入理解的相关文章

从栈不平衡问题 理解 calling convention

最近在开发的过程中遇到了几个很诡异的问题,造成了栈不平衡从而导致程序崩溃. 经过几经排查发现是和调用规约(calling convention)相关的问题,特此分享出来. 首先,讲一下什么是调用规约. 函数调用规约,是指当一个函数被调用时,函数的参数会被传递给被调用的函数和返回值会被返回给调用函数.函数的调用规约就是描述参数是怎么传递和由谁平衡堆栈的,当然还有返回值. 名称 谁负责参数出栈 参数压栈顺序 Cdecl Caller(调用者) 从右往左 Pascal Callee(被调用者) 从左往

堆和栈 浅显的理解

看了好几篇关于 堆和栈区别介绍的文章,打算根据自己的理解浅显的记录下,也是为了自己对 堆和栈加深一点印象 栈 1.会分配连续的内存空间 2.一般是存放参数值.局部变量(基本类型变量和引用变量) 3.存取方式:先进后出 堆 1.不连续的内存空间 2.一般是存放实例化的对象 3.存取方式:先进先出 还有 静态区,存放静态变量的 以及常量区 下面这部分是从其他网站摘录过来的 地址是http://www.tuicool.com/articles/7NR7NzV 1 public class TestMe

汇编中call printf参数压栈时错误理解

EAX, ECX,EDX,EBX均可以32bit,16bit,8bit访问,如下所示: <-------------------EAX------------------------>|<----------------------|-----------|----------->|  |<---------AX--------->|  |<---AH--->|<---AL--->| 测试代码如下: 1 .section .data 2 outp

[LeetCode][13]Roman to Integer解析 罗马字符转int类型关于栈的常数实现-Java实现

Q: Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. A: 以下解法和代码没有借阅以往任何资料,如果有更好的解法请在评论区留言 看到这一题我真是感叹城会玩,昨天刚刚解过一个int转罗马字母,今天又反过来解.自叹弗如.这题的该意思就是给一个罗马字符,把他转化成一个int数字,范围在1-3999之间.关于罗马数字的详细信息就不复制了,

【转】iOS:堆(heap)和栈(stack)的理解--简介

Objective-C的对象在内存中是以堆的方式分配空间的,并且堆内存是由你释放的,即release 栈由编译器管理自动释放的,在方法中(函数体)定义的变量通常是在栈内,因此如果你的变量要跨函数的话就需要将其定义为成员变量. 1.栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量等值.其操作方式类似于数据结构中的栈. 2.堆区(heap):一般由程序员分配释放,若程序员不释放,则可能会引起内存泄漏.注堆和数据结构中的堆栈不一样,其类是与链表. 操作系统iOS 中应用程序使用的计

iOS--------对堆、栈 存储空间的理解

Objective-C的对象在内存中是以堆的方式分配空间的,并且堆内存是由你释放的,即release 栈由编译器管理自动释放的,在方法中(函数体)定义的变量通常是在栈内,因此如果你的变量要跨函数的话就需要将其定义为成员变量. 1.栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量等值.其操作方式类似于数据结构中的栈. 2.堆区(heap):一般由程序员分配释放,若程序员不释放,则可能会引起内存泄漏.注堆和数据结构中的堆栈不一样,其类是与链表. 操作系统iOS 中应用程序使用的计

iOS:堆(heap)和栈(stack)的理解

Object-c的对象在内存中是以堆的方式分配内存空间的,并且堆内存是由你释放的,即release 1.栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量等值.其操作方式类似于数据结构中的栈. 2.堆区(heap):一般由程序员分配释放,若程序员不释放,则可能会引起内存泄漏.注堆和数据结构中的堆栈不一样,其类是与链表. 操作系统iOS 中应用程序使用的计算机内存不是统一分配空间,运行代码使用的空间在三个不同的内存区域,分成三个段:"text segment ",&qu

iOS中的堆(heap)和栈(stack)的理解

操作系统iOS 中应用程序使用的计算机内存不是统一分配空间,运行代码使用的空间在三个不同的内存区域,分成三个段:“text segment “,“stack segment ”,“heap segment ”. 段“text segment ”是应用程序运行时应用程序代码存在的内存段.每一个指令,每一个单个函数.过程.方法和执行代码都存在这个内存段中直到应用程序退出.一般情况下,你不会真的不得不知道这个段的任何事情. 当应用开始以后,函数main() 被调用,一些空间分配在”stack” 中.这

数据结构 数组,链表,栈,队列理解

数据结构 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合.再简单描述一下:数据结构就是描述对象间逻辑关系的学科. 数据存储结构 常用的数据存储方式有两种:顺序存储,非顺序存储.顺序存储就是把数据存储在一块联系的存储介质(硬盘或内存等)中.反之则是非顺序存储. Java中的数组就是典型的顺序存储,链表就是非顺序存储.数组存储数据时会开辟出一块联系内存,按顺序存储.链表先不会开辟出一块内存来,而是只需要知道下一个节点存储的位置,就能把所以的数据连起来了.所以单向链表的最后一个节点是指向N