寄存器是什么?
寄存器是计算机内部存储器的一部分,用于临时保存数据,供CPU进行快速处理。它们在计算机架构中扮演着非常重要的角色,是CPU最直接、最快速的数据存储单元。寄存器通常可以分为不同的类别,包括通用寄存器、指令指针寄存器、标志寄存器等,每种寄存器有其特定的用途。
寄存器与内存
- 寄存器:像是“顺丰快递”,速度快,但数量少。主要用于存储CPU频繁使用的数据。
- 内存:像是“普通快递”,便宜且数量多。它的存储容量远超寄存器,通常用于存储程序和数据。
在程序运行时,数据优先存储在寄存器中,因为其访问速度比内存快。然而,由于寄存器数量有限,大部分数据还是存放在内存中。
寄存器的种类
16位寄存器(早期处理器使用)
- AX、BX、CX、DX:通用寄存器,分别可以用作累加器、计数器、数据寄存器等。
- SI、DI:用于存储字符串操作中的源指针和目的指针。
- BP、SP:栈指针寄存器,SP用于指向栈顶,BP用于存储堆栈数据。
- IP:指令指针,指向当前执行的指令。
32位寄存器(现代处理器常用)
- EAX、EBX、ECX、EDX:通用寄存器,作用与16位寄存器类似,但具有更大的存储范围。
- ESI、EDI、EBP、ESP、EIP:分别用于字符串操作、堆栈管理和指令指针。
- 32位寄存器可以存储的最大数值为 0~0xFFFFFFFF,即 0 到 42亿。
64位寄存器(当前处理器标准)
- RAX、RBX、RCX、RDX:通用寄存器,功能和32位类似,但存储容量增大。
- RSI、RDI:用于指向源和目的地址的指针寄存器。
- RIP:64位指令指针寄存器,指向下一个将要执行的指令。
- 64位寄存器可以存储的最大数值为 0~0xFFFFFFFFFFFFFFFF,即 0 到 18446744073709551615。
寄存器的作用
- EAX:通常用于存储函数的返回值。
- ECX:常用作计数器,保存循环次数,也可用于传递参数。
- EDX:用于传递额外参数。
- ESI、EDI:用于字符串操作中的源和目的指针。
例如,汇编指令:
rep movs dword ptr [edi], dword ptr [esi];此指令的意思是将 esi 地址的内容拷贝到 edi 地址,常用于字符串复制时。
EAX寄存器的使用
EAX寄存器是32位通用寄存器,用于存储函数返回值或临时数据。可以通过 mov 指令来向寄存器中存值。
mov eax, 6 // 将值6存入eax
mov eax, ebx // 将ebx的值存入eax
寄存器的存储范围
通用寄存器的存储范围由其位数决定。例如,32位的寄存器能够存储的最大数值为 0xFFFFFFFF,这是十六进制中的最大数值。
0xFFFFFFFF:这是32位寄存器的最大值,对应的二进制是 11111111 11111111 11111111 11111111,共32位。- 16进制数
F代表的是 1111(二进制),一个F代表4位。所以,0xFFFFFFFF就是 8 个F,每个F占 4 位,总共32位。 - 这个值对应的 十进制 数是 4294967295。
因此,一个32位的寄存器能存储的范围是 0 到 4294967295。
AX寄存器的用法
虽然 EAX 是32位寄存器,AX 是 EAX 的低16位部分,它主要用于节省内存空间。当你只需要存储16位的数据时,使用 AX 可以避免占用完整的32位寄存器空间。
EAX:是一个32位寄存器,存储范围是 0 到 4294967295(十进制)。AX:是EAX的低16位,存储范围是 0 到 65535(十进制)。
例如,假设我们将 0xFFFF 存入 AX:
mov ax, 0xFFFF // 将FFFF(十六进制)存入AX这个指令的意思是将 0xFFFF 存储到 AX 中,这时只有低16位的数据被存入寄存器,而不会影响到 EAX 中的高16位。因此,这种做法能够节省内存空间,特别是在只需要16位数据时。

al, ah寄存器

------- ax
FF ----------- FF
ah(high) --- al(low)
FF 一个F有4位 2 * 4 = 8
ah 可以存高4位
al 可以存低4位
mov al, 0x11 // 往eax存入11
mov ah, 0x22 // 把ebx的值存入22其它寄存器的操作都是一样的这里就不过多演示了
汇编中的操作码
1. EIP 指针寄存器
- 作用:
EIP(Extended Instruction Pointer)寄存器保存下一条要执行的指令的地址。每执行完一条指令,EIP会自动更新为下一条指令的地址。 - 用途:帮助控制程序的执行流程。
2. 标志寄存器
标志寄存器用来表示运算结果的状态。常见的四个重要标志位如下:
- ZF (Zero Flag):如果运算结果为 0,
ZF = 1,否则ZF = 0。 - SF (Sign Flag):
SF表示运算结果的符号位,SF = 0表示正数,SF = 1表示负数。 - CF (Carry Flag):用于无符号数的进位或借位。如果产生进位或借位,
CF = 1,否则为 0。 - OF (Overflow Flag):用于有符号数的溢出情况。如果运算结果超出了能表示的范围,
OF = 1,否则为 0。
这些标志位会被不同的指令影响,例如:
add指令会影响进位标志(CF)。cmp指令会影响零标志位(ZF)。
3. 条件跳转指令
根据标志寄存器中的标志位,汇编语言提供了多种条件跳转指令,用于控制程序流。常见的条件跳转指令包括:
- JE (Jump if Equal):如果零标志
ZF为 1,则跳转。 - JNE (Jump if Not Equal):如果零标志
ZF为 0,则跳转。 - JZ (Jump if Zero):如果零标志
ZF为 1,则跳转。 - JNZ (Jump if Not Zero):如果零标志
ZF为 0,则跳转。 - JC (Jump if Carry):如果进位标志
CF为 1,则跳转。 - JNC (Jump if No Carry):如果进位标志
CF为 0,则跳转。 - JO (Jump if Overflow):如果溢出标志
OF为 1,则跳转。 - JNO (Jump if No Overflow):如果溢出标志
OF为 0,则跳转。
这些条件跳转指令常用于控制循环、判断等逻辑操作。
4. 常用指令
mov:用于将数据从一个位置传送到另一个位置。- 示例:
mov eax, dword ptr ds:[0x19FF74],将内存地址0x19FF74处的数值加载到eax寄存器。 - 示例:
mov dword ptr ds:[0x19F30], 0x123,将0x123存储到0x19F30地址。
- 示例:
lea:将一个内存地址加载到寄存器中。- 示例:
lea eax, dword ptr ds:[0x19f300],将0x19F30地址加载到eax寄存器。
- 示例:
5. CE 自动汇编常用命令
alloc:分配内存。- 示例:
alloc(newmem, 0x1000),分配 0x1000 字节的内存给newmem。
- 示例:
dealloc:释放分配的内存。createthread:创建一个远程线程。- 示例:
createthread(newmem),在分配的内存newmem中创建线程。
- 示例:
db和dd:分别用于写字节和双字数据。- 示例:
db 90 90 90 90(写入字节数据),dd 0 0 0 0(写入双字数据)。
- 示例:
registersymbol:注册符号,用于标记全局变量。- 示例:
registersymbol(newmem),将newmem注册为全局符号。
- 示例:
jmp:跳转指令。- 示例:
jmp 00520000,跳转到地址0x520000。 - 示例:
jmp newmem+50,跳转到newmem地址偏移50的位置。
- 示例:
6. 数据表示
汇编语言中的数据可以使用不同的方式进行赋值:
mov eax, 63:将十六进制数63(即99十进制)赋值给eax。mov eax, #99:强制使用十进制表示法。push 63; pop eax:先将63压入栈,再弹出到eax,这比直接使用mov指令稍短。
- 如果需要处理浮点数,可以使用浮点数计算工具,将浮点数转换为十六进制。
这里我提供了Cheat Engine Wiki 文档。
Cheat engine
AOB 注入

首先找到数值在内存的地址。

然后找出是什么改写了它。

找到内存反汇编区域。

选择工具自动汇编。

选择AOB注入方式。

评论 (0)