Skip to content

Latest commit

 

History

History
64 lines (44 loc) · 4.36 KB

File metadata and controls

64 lines (44 loc) · 4.36 KB

汇编101

回到目录 | 工具配置 | 脚本说明 | 快速入门 | 插件基础 | 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.

寄存器(Register)

寄存器是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位.
asm101_reg_highlow

x64架构在原有寄存器基础上添加了8个额外的通用寄存器, R8R15. 对于这些新增的寄存器, 后缀D(DWORD)将其限定为低32位, 后缀W(WORD)将其限定为低16位, 后缀B(BYTE)将其限定为低8位.

R8R15寄存器名字中的R不能去掉, 只能通过后缀访问指定的数据大小.

AX CX DX BX虽然有各自的名字, 但在当今的架构下是作为通用寄存器使用的. SPBP用于指向内存堆栈的栈顶和栈底, 对其进行加减算术运算即可创建堆栈帧(stack frame). SIDI常被用于循环和内存分节, 但很多情况下可以当作通用寄存器使用. R8R15也是作为通用寄存器使用.

这些寄存器的机器码(OpCode)从上往下依次为07, R8R15也对应07.

寄存器 含义 释义
IP InstructionPointer 指令指针
XMM ExtendedMemoryManager SSE系列指令

IP永远指向当前正在执行的指令地址. XMM为128位SSE系列指令寄存器, 从XMMOXMM7, 被用于浮点标量相关的计算. x64架构添加了额外的XMM8XMM15寄存器, 根据CPU支持的指令集不同还有额外的YMM0YMM15256位以及ZMM512位AVX指令寄存器. IP寄存器可以使用通用寄存器的前/后缀, XMM, YMM, 和ZMM寄存器没有前/后缀.

XMM0XMM7寄存器的机器码(OpCode)从上往下依次为07, XMM8XMM15也对应07.

寄存器名称及其前/后缀与大小写无关, 因为在实际处理时, 它们都是以二进制位表示的.

指令(Instruction)

当机器指令涉及二元运算时, 第一个对象为dst(destination)目的值, 第二个对象为src(source)源值.


回到目录 | 工具配置 | 脚本说明 | 快速入门 | 插件基础 | Papyrus调用 | 事件响应 | 内存补丁 | 函数Hook