eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86 組合語言中CPU上的通用寄存器的名稱,是32位的寄存器。如果用C語言來解釋,可以把這些寄存器當作變數看待。
比方說:add eax,-2 ; //可以認為是給變數eax加上-2這樣的一個值。
這些32位寄存器有多種用途,但每一個都有“專長”,有各自的特別之處。
EAX 是"累加器"(accumulator), 它是很多加法乘法指令的預設寄存器。
EBX 是"基地址"(base)寄存器, 在記憶體定址時存放基地址。
ECX 是計數器(counter), 是重複(REP)首碼指令和LOOP指令的內定計數器。
EDX 則總是被用來放整數除法產生的餘數。
ESI/EDI分別叫做"源/目標索引寄存器"(source/destination index),因為在很多字串操作指令中, DS:ESI指向源串,而ES:EDI指向目標串.
EBP是"基址指標"(BASE POINTER), 它最經常被用作進階語言函數調用的"架構指標"(frame pointer). 在破解的時候,經常可以看見一個標準的函數起始程式碼:
push ebp ;儲存當前ebp
mov ebp,esp ;EBP設為當前堆棧指標
sub esp, xxx ;預留xxx位元組給函數臨時變數.
...
這樣一來,EBP 構成了該函數的一個架構, 在EBP上方分別是原來的EBP, 返回地址和參數. EBP下方則是臨時變數. 函數返回時作 mov esp,ebp/pop ebp/ret 即可.
ESP 專門用作堆棧指標,被形象地稱為棧頂指標,堆棧的頂部是地址小的地區,壓入堆棧的資料越多,ESP也就越來越小。在32位平台上,ESP每次減少4位元組。
esp:寄存器存放當前線程的棧頂指標
ebp:寄存器存放當前線程的棧底指標
eip:寄存器存放下一個CPU指令存放的記憶體位址,當CPU執行完當前的指令後,從EIP寄存器中讀取下一條指令的記憶體位址,然後繼續執行。
一般寄存器:AX、BX、CX、DX
AX:累積暫存器,BX:基底暫存器,CX:計數暫存器,DX:資料暫存器
索引暫存器:SI、DI
SI:來源索引暫存器,DI:目的索引暫存器
堆疊、基底暫存器:SP、BP
SP:堆疊指標暫存器,BP:基底指標暫存器
EAX、ECX、EDX、EBX:為ax,bx,cx,dx的延伸,各為32位元
ESI、EDI、ESP、EBP:為si,di,sp,bp的延伸,32位元
棧的基本模型
參數N |
↓高地址 |
參數… |
函數參數入棧的順序與具體的調用方式有關 |
參數 3 |
參數 2 |
參數 1 |
EIP |
返回本次調用後,下一條指令的地址 |
EBP |
儲存調用者的EBP,然後EBP指向此時的棧頂。 |
臨時變數1 |
|
臨時變數2 |
|
臨時變數3 |
|
臨時變數… |
|
臨時變數5 |
↓低地址 |