回到目录 | 工具配置 | 脚本说明 | 快速入门 | 插件基础 | Papyrus调用 | 事件响应 | 内存补丁 | 函数Hook
本节教程简单讲一下x64汇编的基础概念和后面教程会涉及到的汇编知识.
本教程使用x64 Windows环境.
对于CPU来说, 一切数据/指令都是以二进制位(bit)储存的. 下面是常见的x64数据形式:
| 数据 | 大小 | 含义 | x64 C++常见表达式 |
|---|---|---|---|
BYTE |
8位 | 字节 | char |
WORD |
16位 | 字 | short |
DWORD |
32位 | 双字(Double Word) | long |
QWORD |
64位 | 四字(Quad Word) | long long |
REAL4 |
32位 | 单精度浮点 | float |
REAL8 |
64位 | 双精度浮点 | double |
当一个数据以二进制位展开时, 最左侧位为高位(High), 最右侧位为低位(Low). 以16位整数11451举例, 其十六进制为0x2CBB, 其二进制位补位后为0010 1100 1011 1011, 那么它的高8位为左侧的0010 1100, 即0x2C. 低8位为右侧的1011 1011, 即0xBB.
寄存器是CPU用来储存二进制位的单元, 用于配合执行机器指令.
| 寄存器 | 含义 | 释义 |
|---|---|---|
AX |
Accumulator | 累加 |
CX |
Count | 计数 |
DX |
Data | 数据储存 |
BX |
Base | 基地址 |
SP |
Stack Pointer | 堆栈栈顶指针 |
BP |
Base Pointer | 堆栈栈底指针 |
SI |
Source Index | 源变址 |
DI |
Destination Index | 目的变址 |
这些寄存器被设计为储存16位二进制, 前缀E(Extended)将其拓展为32位, 前缀R(Register)将其拓展为64位. 后缀L(Low)将其限定为低8位, 后缀H(High)将其限定为高8位.

x64架构在原有寄存器基础上添加了8个额外的通用寄存器, R8至R15. 对于这些新增的寄存器, 后缀D(DWORD)将其限定为低32位, 后缀W(WORD)将其限定为低16位, 后缀B(BYTE)将其限定为低8位.
R8至R15寄存器名字中的R不能去掉, 只能通过后缀访问指定的数据大小.
AX CX DX BX虽然有各自的名字, 但在当今的架构下是作为通用寄存器使用的. SP和BP用于指向内存堆栈的栈顶和栈底, 对其进行加减算术运算即可创建堆栈帧(stack frame). SI和DI常被用于循环和内存分节, 但很多情况下可以当作通用寄存器使用. R8至R15也是作为通用寄存器使用.
这些寄存器的机器码(OpCode)从上往下依次为0至7, R8至R15也对应0至7.
| 寄存器 | 含义 | 释义 |
|---|---|---|
IP |
InstructionPointer | 指令指针 |
XMM |
ExtendedMemoryManager | SSE系列指令 |
IP永远指向当前正在执行的指令地址. XMM为128位SSE系列指令寄存器, 从XMMO至XMM7, 被用于浮点标量相关的计算. x64架构添加了额外的XMM8至XMM15寄存器, 根据CPU支持的指令集不同还有额外的YMM0至YMM15256位以及ZMM512位AVX指令寄存器. IP寄存器可以使用通用寄存器的前/后缀, XMM, YMM, 和ZMM寄存器没有前/后缀.
XMM0至XMM7寄存器的机器码(OpCode)从上往下依次为0至7, XMM8至XMM15也对应0至7.
寄存器名称及其前/后缀与大小写无关, 因为在实际处理时, 它们都是以二进制位表示的.
当机器指令涉及二元运算时, 第一个对象为dst(destination)目的值, 第二个对象为src(source)源值.
回到目录 | 工具配置 | 脚本说明 | 快速入门 | 插件基础 | Papyrus调用 | 事件响应 | 内存补丁 | 函数Hook