首页 > 其他 > 详细

OD:

时间:2014-03-14 18:03:03      阅读:417      评论:0      收藏:0      [点我收藏+]

几个重要的 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 调用约定,函数调用时的指令大致如下:

bubuko.com,布布扣
1                ;调用前
2 push 参数n      ;右→左依次入栈
3 push 参数n-1
4 ...
5 push 参数1      ;假设有 n 个参数
6 call  函数地址  ;call 指令完成:1.当前指令位置入栈(保存返回地址); 2.地址跳转
7 push ebp       ;保存旧栈帧底部
8 move ebp,esp   ;设置新栈帧底部(栈帧切换)
9 sub esp,xxx    ;设置新栈帧顶部
bubuko.com,布布扣

OD:,布布扣,bubuko.com

OD:

原文:http://www.cnblogs.com/exclm/p/3599580.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!