通常寄存器: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位元
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字節。
386部分寄存器:
狀態和控制寄存器組除了EFLAGS、EIP ,還有四個32位的控制寄存器,它們是CR0,CR1,CR2和CR3。
這幾個寄存器中保存全局性和任務無關的機器狀態。
CR0中包含了6個預約義標誌,0位是保護容許位PE(Protedted Enable),用於啓動保護模式,若是PE位置1,則保護模式啓動,若是PE=0,則在實模式下運行。1位是監控協處理位MP(Moniter coprocessor),它與第3位一塊兒決定:當TS=1時操做碼WAIT是否產生一個「協處理器不能使用」的出錯信號。第3位是任務轉換位(Task Switch),當一個任務轉換完成以後,自動將它置1。隨着TS=1,就不能使用協處理器。CR0的第2位是模擬協處理器位 EM (Emulate coprocessor),若是EM=1,則不能使用協處理器,若是EM=0,則容許使用協處理器。第4位是微處理器的擴展類型位ET(Processor Extension Type),其內保存着處理器擴展類型的信息,若是ET=0,則標識系統使用的是287協處理器,若是 ET=1,則表示系統使用的是387浮點協處理器。CR0的第31位是分頁容許位(Paging Enable),它表示芯片上的分頁部件是否容許工做。
CR1是未定義的控制寄存器,供未來的處理器使用。
CR2是頁故障線性地址寄存器,保存最後一次出現頁故障的全32位線性地址。
CR3是頁目錄基址寄存器,保存頁目錄表的物理地址,頁目錄表老是放在以4K字節爲單位的存儲器邊界上,所以,它的地址的低12位總爲0,不起做用,即便寫上內容,也不會被理會。
這幾個寄存器是與分頁機制密切相關的,所以,在進程管理及虛擬內存管理中會涉及到這幾個寄存器,讀者要記住CR0、CR2及CR3這三個寄存器的內容。
esp:寄存器存放當前線程的棧頂指針
ebp:寄存器存放當前線程的棧底指針框架
eip:寄存器存放下一個CPU指令存放的內存地址,當CPU執行完當前的指令後,從EIP寄存器中讀取下一條指令的內存地址,而後繼續執行。函數