EAX、ECX、EDX、EBX寄存器的做用(轉)

通常寄存器: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寄存器中讀取下一條指令的內存地址,而後繼續執行。函數

相關文章
相關標籤/搜索