3.2 寄存器#
比如说 ADD (加法) 指令,两个内存中的数就无法直接相加,处理器必须将其中一个数传输到寄存器中,再加上另一个内存地址中的数。
32 位通用寄存器有:EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI 和 EIP。
- EAX (accumulator, 累加器):EAX 常用于四则运法以及一些格式化指令。
- EBX (Base index, 基址寄存器):EBX 常用于存储起始内存地址。
- ECX (counter, 计数器):ECX 用于多种指令的计数器。同时也存储内存数据的地址偏移。使用计数器的指令包括字符串指令、偏移指令、移位指令以及循环。
- EDX (data):EDX 通常用于存储乘积的部分位数以及除法的余数,同时也能存储起始内存地址。
- EBP (base pointer):EBP 指向一个内存地址,主要作为一个函数中的参数以及变量的基址。
- EDI (destination index):EDI 常用于字符串指令,指向目标字符串。
- ESI (source index):ESI 常用于字符串指令,指向初始字符串。
- EIP:存储即将执行的下一条指令的地址。
- ESP:存储栈顶地址。
思维脑图如下:
对于 EBX 有 BX、BH 和 BL 子寄存器,对于 ECX 有 CX、CH 和 CL 子寄存器,对于 EDX 有 DX、DH 和 DL 子寄存器。其他通用寄存器的 9~16 位没有命名也无法直接获取内容。
最基本的是 BYTE 占用 1 个字节 (8 bit) 内存,WORD 占用 2 个字节 (16 bit) 内存,DWORD 占用 4 个字节 (32bit) 内存、QWORD 占用 8 个字节 (64 bit) 内存。
64-bit | 32-bit | 16-bit | 8-bit Low | 8-bit High | comment |
---|---|---|---|---|---|
RAX | EAX | AX | AL | AH | |
RBX | EBX | BX | BL | BH | |
RCX | ECX | CX | CL | CH | |
RDX | EDX | DX | DL | DH | |
RSI | ESI | SI | SIL | - | |
RDI | EDI | DI | DIL | - | |
RBP | EBP | BP | BPL | - | base pointer |
RSP | ESP | SP | SPL | - | stack pointer |
R8 | R8D | R8W | R8B | - | |
R9 | R9D | R9W | R9B | - | |
R10 | R10D | R10W | R10B | - | |
R11 | R11D | R11W | R11B | - | |
R12 | R12D | R12W | R12B | - | |
R13 | R13D | R13W | R13B | - | |
R14 | R14D | R14W | R14B | - | |
R15 | R15D | R15W | R15B | - | |
RIP | EIP | IP | - | - | |
RFLAGS | EFLAGS | FLAGS | - | - |
寄存器与子寄存器
Data Type | Size(Bits) | Typical Use |
---|---|---|
Byte | 8 | Characters,small integers |
Word | 16 | Characters,integers |
Doubleword | 32 | Integers,single-precision floating-point |
Quadword | 64 | Integers,double-precision floating-point |
Double Quadword | 128 | Packed integers,packed floating-point |
基础数据类型及内存占用
3.3 MOV 指令#
数据传输指令 MOV: 将其始操作单元 (src) 的内容复制到目标单元 (dest) 。
MOV EAX, EDI
大部分情况下,我们可以在寄存器间直接传输,但是 EIP 寄存器无法被直接赋值或者读取。例如MOV EIP, EAX
这个指令就是非法的。
IDA 中,地址前面有OFFSET
这个词时,指代的是这个地址本身的数值,而没有OFFSET
这个词时,指代的是这个地址上存储的内容。