3.2 寄存器#
比如说 ADD (加法) 指令,两个内存中的数就无法直接相加,处理器必须将其中一个数传输到寄存器中,再加上另一个内存地址中的数。
32 位通用寄存器有:EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI 和 EIP。
- EAX (累加器):EAX 常用於四則運法以及一些格式化指令。
- EBX (基址寄存器):EBX 常用於存儲起始內存地址。
- ECX (計數器):ECX 用於多種指令的計數器。同時也存儲內存數據的地址偏移。使用計數器的指令包括字符串指令、偏移指令、移位指令以及循環。
- EDX (數據):EDX 通常用於存儲乘積的部分位數以及除法的餘數,同時也能存儲起始內存地址。
- EBP (基指針):EBP 指向一個內存地址,主要作為一個函數中的參數以及變量的基址。
- EDI (目標索引):EDI 常用於字符串指令,指向目標字符串。
- ESI (源索引):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 低位 | 8-bit 高位 | 註解 |
---|---|---|---|---|---|
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 | - | 基指針 |
RSP | ESP | SP | SPL | - | 棧指針 |
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 | - | - |
寄存器與子寄存器
數據類型 | 大小 (位元) | 典型用途 |
---|---|---|
Byte | 8 | 字符,小整數 |
Word | 16 | 字符,整數 |
Doubleword | 32 | 整數,單精度浮點數 |
Quadword | 64 | 整數,雙精度浮點數 |
Double Quadword | 128 | 打包整數,打包浮點數 |
基礎數據類型及內存佔用
3.3 MOV 指令#
數據傳輸指令 MOV: 將其始操作單元 (src) 的內容複製到目標單元 (dest) 。
MOV EAX, EDI
大部分情況下,我們可以在寄存器間直接傳輸,但是 EIP 寄存器無法被直接賦值或者讀取。例如MOV EIP, EAX
這個指令就是非法的。
IDA 中,地址前面有OFFSET
這個詞時,指代的是這個地址本身的數值,而沒有OFFSET
這個詞時,指代的是這個地址上存儲的內容。