• 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
    ;调用前 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 ;设置新栈帧顶部

    函数回溯步骤

        1 保存返回值(通常保存在 EAX 中)

        2 弹出当前栈帧,恢复上一栈帧

            (1) 在堆栈平衡基础上,给 ESP 加上栈帧大小,降低栈顶,回收当前栈帧空间

            (2) 将当前栈帧底部保存的前栈帧 EBP 弹入 EBP,收复上一栈帧

            (3) 将函数返回地址弹给 EIP

        3 跳转到母函数中继续执行

    ; 以 C 语言和 Win32 平台为例,函数返回时相关指令如下
    1
    add esp, xxx ; 回收栈帧空间 2 pop ebp ; 将上一帧栈底部位置恢复到 ebp 3 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 根据一般供操作系统使用,用于一些特殊内存区域的定位。

  • 相关阅读:
    ASP.NET MVC3书店第十节 为网站导航与局部设计做最后的修改(转)
    利用IIS作为宿主 发布你的WCF Service(转)
    ASP.NET MVC3书店第九节 注册与下订单(第一部分)(转)
    ASP.NET MVC3书店第八节 使用Ajax的购物车(第二部分)(转)
    ASP.NET MVC3书店第七节 用户及身份验证(转)
    ASP.NET MVC3 快速入门第六节 增加一个追加数据的方法和一个追加数据的视图(转)
    ASP.NET MVC3书店第一节 概述(转)
    SQL Server Script 积累
    批处理命令行CMD启动停止重启IIS的命令(转)
    ASP.NET MVC3书店第五节 表单编辑(第三部分)(转)
  • 原文地址:https://www.cnblogs.com/exclm/p/3599580.html
Copyright © 2020-2023  润新知