OD: Register, Stack Frame, Function Reference
几个重要的 Win32 寄存器
EIP 指令寄存器(Extended Instruction Pointer)
存放一个指针,指向下一条等待执行的指令地址
ESP 栈指针寄存器(Extended Stack Pointer)
存放一个指针,指向系统栈最上面栈帧的栈顶
EBP 基址指针寄存器(Extended Base Pointer)
存放一个指针,指向系统栈最上面栈帧的底部
函数栈帧
ESP 与 EBP 之间的空间为当前函数的栈帧。函数栈帧一般包含:局部变量,栈帧状态值(前栈帧的底部),返回地址。
ESP 所指的栈帧顶部与系统栈的栈顶是同一个位置,但 EBP 与系统栈的栈底不是同一个概念。
函数调用约定
不同 OS,不同语言,不同 Compiler 对函数调用细节有所不同,包括传参方式,参数入栈顺序,函数返回时恢复栈平衡的操作在子函数执行还是母函数执行。
C 语言中函数调用约定声明(__cdecl,__fastcall,__stdcall)就是对参数入栈顺序(左→右 / 右→左)的声明。
VC 默认使用 __stdcall 调用约定,进行函数调用时参数入栈顺序为右→左。
ECX 寄存器
Windows 平台中,C++ 类的 this 指针一般由 ECX 传递;但如果用 GCC 编译则这个指针会作为最后一个参数压入栈中。
函数调用步骤
1 参数入栈
2 返回地址入栈:当前代码区调用指令的下一条指令地址入栈
3 代码区跳转:跳到被调用函数的入口处
4 栈帧调整
(1) 保存状态:EBP 入栈
(2) 栈帧切换:ESP 装入 EBP,更新栈帧底部
(3) 对新栈帧分配空间:将 ESP 减去所需空间大小,抬高栈顶
;对于 __stdcall 调用约定,函数调用时的指令大致如下
1 ;调用前
push 参数n ;右→左依次入栈
push 参数n-
...
push 参数1 ;假设有 n 个参数
call 函数地址 ;call 指令完成:1.当前指令位置入栈(保存返回地址); 2.地址跳转
push ebp ;保存旧栈帧底部
move ebp,esp ;设置新栈帧底部(栈帧切换)
sub esp,xxx ;设置新栈帧顶部
函数回溯步骤
1 保存返回值(通常保存在 EAX 中)
2 弹出当前栈帧,恢复上一栈帧
(1) 在堆栈平衡基础上,给 ESP 加上栈帧大小,降低栈顶,回收当前栈帧空间
(2) 将当前栈帧底部保存的前栈帧 EBP 弹入 EBP,收复上一栈帧
(3) 将函数返回地址弹给 EIP
3 跳转到母函数中继续执行
; 以 C 语言和 Win32 平台为例,函数返回时相关指令如下
1 add esp, xxx ; 回收栈帧空间
pop ebp ; 将上一帧栈底部位置恢复到 ebp
rtn ; 弹出当前栈顶元素(返回地址)并跳转到弹出的地址执行
补充寄存器相关要点
8086 CPU 有 14 个 16 位寄存器,分为以下几类:
一、通用寄存器
数据寄存器:
累加寄存器:accumulator,AX:AH AL,常用于运算中存放操作数,所有的 IO 指令都使用累加寄存器与外界交换数据。
基址寄存器:base,BX:BH BL,常用于地址索引。
计数寄存器:count,CX:CH CL,常用于保存计数值,移位、循环和串处理中常用作默认计数器。
数据寄存器:data,DX:DH DL,常用于数据传递。
指针寄存器:
堆栈指针寄存器:SP,与 SS 配合使用,指向目前的堆栈地址。
基址指针寄存器:BP,可用作 SS 的一个相对基址位置。
变址寄存器:
源变址寄存器:SI,Source Index,可用来存放相对 DS 段之源变址指针。
目的变址寄存器:DI,Destination Index,可用来存放相对 ES 段之目的变址指针。
二、指令寄存器 IP
IP 指向的是指令地址的段内地址偏移量,又称偏移地址(Offset Address)或有效地址(Effective Address)。
三、标志寄存器
8086 有一个 16 位的标志寄存器 FR(Flag Register,又称为程序状态字 PSW,Program Status Word),FR 中有意义的有 9 位(6 个状态位,3 个控制位)。
四、段寄存器
CS,Code Segment,代码段寄存器。
DS,Data Segment。通常 DS 固定,而 CS 可以根据需要修改,
SS,Stack Segment。
ES,Extra Segment,附加段寄存器。
FS,指向当前活动线程的 TEB(线程环境块) 结构,FS 的基址不是 0,其在用户态和内核态的基址也不同。后续篇章中有用 FS 来得到 kernel32.dll 的装载基址的例子。
GS。FS、GS 根据一般供操作系统使用,用于一些特殊内存区域的定位。
OD: Register, Stack Frame, Function Reference的更多相关文章
- FUNCTION CALL STACK FRAME
function call stack frame 两个寄存器 esp 栈顶指针寄存器,指向调用栈的栈顶(始终指向,意味着栈分配到哪里了,从当前栈往高地址是已经分配了的) ebp 基址指针寄存器,指向 ...
- sparc v8 stack frame calling convention
main.c ; int main() { int a, b; int sum; a = ; b = ; sum = add(a, b); ; } int add(int a, int b) { in ...
- x86-64栈帧中的“红色区域” red zone of stack frame on x86-64
前几天看System V AMD64 ABI标准的时候发现栈帧的顶部后面有一块"red zone",在学cs:app3e/深入理解操作系统的时候并没有遇到这个,总结一下. 引用标准 ...
- Stack frame
http://en.citizendium.org/wiki/Stack_frame In computer science, a stack frame is a memory management ...
- How a stack frame works 栈帧的要素与构建步骤
http://en.citizendium.org/wiki/Stack_frame To use a stack frame, a thread keeps two pointers, often ...
- scikit-learn:class and function reference(看看你究竟掌握了多少。。)
http://scikit-learn.org/stable/modules/classes.html#module-sklearn.decomposition Reference This is t ...
- Java-JVM 栈帧(Stack Frame)
一.概述 栈帧位置 JVM 执行 Java 程序时需要装载各种数据到内存中,不同的数据存放在不同的内存区中(逻辑上),这些数据内存区称作运行时数据区(Run-Time Data Areas). 其中 ...
- Frame of Reference and Roaring Bitmaps
https://www.elastic.co/cn/blog/frame-of-reference-and-roaring-bitmaps http://roaringbitmap.org/ 2015 ...
- 深入学习Java8 Lambda (default method, lambda, function reference, java.util.function 包)
Java 8 Lambda .MethodReference.function包 多年前,学校讲述C#时,就已经知道有Lambda,也惊喜于它的方便,将函数式编程方式和面向对象式编程基于一身.此外在使 ...
随机推荐
- [转]Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile
http://blog.csdn.net/stpeace/article/details/39534361 进程间的通信方式有很多种, 上次我们说了最傻瓜的“共享外存/文件”的方法. 那么, 在本文中 ...
- jsp之间url传值出现中文乱码
示例: T1.jsp http://localhost:8080/test/Test.action?site=北京 T2.jsp ..... <%@ page language="ja ...
- FileZilla 无法保存密码
当保存密码时遇到这个问题时: 解决办法: 一.找到FileZilla的设置: 二.点击"界面",取消勾选"不要保存密码",点击"确定"按钮, ...
- Vxworks、QNX、Xenomai、Intime、Sylixos、Ucos等实时操作系统的性能特点
Vxworks.QNX.Xenomai.Intime.Sylixos.Ucos等实时操作系统的性能特点 VxWorks操作系统 VxWorks 操作系统是美国WindRiver公司于1983年设计开发 ...
- java入门时的一些基本概念的理解(j2ee,j2se,j2me,jdk,sdk,jre,jvm,跨平台)
首先声明,这篇文章是从网上粘贴过来的.原文地址是:http://www.cnblogs.com/wangaohui/archive/2012/11/28/2791999.html.感觉写的很好,所以粘 ...
- Android修改XML文件
最近在项目中需要使用XML记录数据,网上这方面的文章较少,记录一下 使用DOM方式 /** * 追加内容到XML文档 * @param instructions * @throws ParserCon ...
- JAVA接口示例
总感觉有点虚,但慢慢找到感觉了.将对象放进数组里,这就比较深入了. interface drawTest{ public void draw(); public void doAnyThing(); ...
- 51单片机C语言学习笔记4:keil C51绝对地址访问
在利用keil进行8051单片机编程的时,常常需要进行绝对地址进行访问.特别是对硬件操作,如DA AD 采样 ,LCD 液晶操作,打印操作.等等.C51提供了三种访问绝对地址的方法: 1. 绝对宏: ...
- eclipse中格式化代码快捷键Ctrl+Shift+F失效的解决办法
很长一段时间我的eclipse都有个毛病,就是当我要格式化代码的时候,右键-source-format能够起效,但ctrl+shift+f不好使了. 可以基本断定是快捷键与别的软件冲突了,但一直也没时 ...
- COJ 0244 HDNOIP201404最短路径
HDNOIP201404最短路径 难度级别: A: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 a.b.c是3个互不相等的1 ...