x86/x64汇编基础06.汇编基础2:寄存器精讲-汇编语言社区论坛-技术社区-学技术网

x86/x64汇编基础06.汇编基础2:寄存器精讲

笔记

学习最新前沿软件逆向安全技术、游戏安全辅助脚本技术,B 站 小迪 xiaodi 老师

微信 i-xiaodi

这里的内容,不懂就查,不要死记硬背

学习最新前沿软件逆向安全技术、游戏安全辅助脚本技术,B 站 小迪 xiaodi 老师

微信 i-xiaodi

x86寄存器

在 x86 架构中,寄存器是 CPU 内部的高速存储区域,通常用于存放数据、指令地址和计算结果。

寄存器的大小通常与 CPU 的位数相关:

在 32 位的 x86 架构中,寄存器的大小是 32 位(4 字节)(内存地址也是)

在 64 位的 x86-64 架构中,寄存器的大小是 64 位(8 字节)(内存地址也是)

 

x86 架构的寄存器可以分为几类,每类寄存器有不同的用途

通用寄存器、段寄存器、指令指针寄存器、标志寄存器等。

1. 通用寄存器(General-Purpose Registers)

x86 架构中有 8 个通用寄存器,每个寄存器的大小是 32 位,在 64 位的 x86-64 架构中,这些寄存器的大小扩展为 64 位。

32 位(x86)架构下的通用寄存器:

  • EAX:累加寄存器(Accumulator),常用于算术运算、I/O 操作。
    • Windows 的代码中通常用来存放结果(返回值)
  • EBX:基址寄存器(Base),用于指向数组或数据结构的基址
  • ECX:计数寄存器(Count),常用于循环计数器或移位操作。
    • Windows x86 调用约定(如 stdcallfastcall)中,ECX 通常用于传递函数的参数。具体来说,fastcall 调用约定中,ECX 存放函数的第一个参数。
    • stdcall 调用约定中,参数通常是通过栈传递的,但 ECX 仍然可以用作 临时数据存储循环计数器
    • 在面向对象的 C++ 编程中,this 指针指向当前对象的内存地址。当你调用类的成员函数时,this 指针会隐式地作为该成员函数的一个参数传递。
    • C++ 中的成员函数 中,this 指针并没有一个固定的寄存器,而是由 编译器决定对于 Windows x86 编译器(如 MSVC),通常情况下,this 指针会被传递给成员函数的 第一个参数,而这个参数的传递方式可能依赖于调用约定。具体来说,在 fastcall 调用约定中,第一个参数(通常是 this 指针)会存放在 ECX 寄存器中。
  • EDX:数据寄存器(Data),用于存储乘法、除法的结果,或与 I/O 操作相关。(也可以和eax结合存储64位数据,格式为EDX:EAX
  • ESI:源索引寄存器(Source Index),用于指向源操作数,尤其是在字符串操作中。
  • EDI:目的索引寄存器(Destination Index),用于指向目标操作数,尤其是在字符串操作中。
  • EBP:基指针寄存器(Base Pointer),用于保存栈帧的基地址(尤其是函数调用时,栈的管理非常依赖它)。
    • 栈底 — 因为 EBP 指向栈这种数据结构的底部,所以叫栈底
  • ESP:堆栈指针寄存器(Stack Pointer),用于指向当前栈顶位置,栈的 push/pop 操作都依赖于它。
    • 涉及堆栈平衡非常重要
    • 栈顶 — 因为 ESP 指向栈这种数据结构的顶部,所以叫栈顶

 

x86-64(64 位)架构中,寄存器的名称略有变化,但功能类似:

  • RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP —— 这些是 64 位的扩展版本。

此外,R8R15 也是在 64 位架构中新增的通用寄存器。

 

32 位寄存器与 64 位寄存器的区别:

  • 32 位寄存器(如 EAX) 被拓展为 64 位寄存器(如 RAX),扩展部分会用于更大的数据处理。
  • 指令集操作符 也支持对 64 位寄存器进行操作。

 

小作业:描述哪一行用到了栈底和栈顶的寄存器

图片[1]-x86/x64汇编基础06.汇编基础2:寄存器精讲-汇编语言社区论坛-技术社区-学技术网

请登录后发表评论