eax ...edi esp ebp寄存器簡介(轉)
首先介紹我們會經常看到的一些寄存器:
4個數據寄存器(EAX、EBX、ECX和EDX)
2個變址和指針寄存器(ESI和EDI)
2個指針寄存器(ESP和EBP)
4個數據寄存器(EAX、EBX、ECX和EDX):
32位CPU有4個32位的通用寄存器EAX、EBX、ECX和EDX。對低16位數據的存取,不會影響高16位的數據。這些低16位寄存器分別命名爲:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。
4個16位寄存器又可分割成8個獨立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每個寄存器都有自己的名稱,可獨立存取。程序員可利用數據寄存器的這種“可分可合”的特性,靈活地處理字/字節的信息。
那麼如何理解eax,ax,al(ah)之間的關係呢?
專業點可以這樣解釋:Eax是32位寄存器,ax是16位寄存器,al(ah)是八位寄存器。
那麼eax存儲的數據就是ax的兩倍,ax是al(ah)的兩倍。
Eax可以存儲的數字是DWORD(雙字)ax存儲的是WORD(字)AL(AH)存儲的是BYTE(字節),那麼爲什麼又有AH和AL呢,我們可以這樣理解,AX=AH+AL,AH存儲的是AX的高8位數據,AL存儲的是AX的低八位數據。H這裏就是HIGH,L就是LOW.
假設eax是紅色區域,那麼eax現在就是64636261;
那麼ax就是eax的低十六位,也就是6261;
Al是61;AH是62。
其他ebx,ecx,edx也有類似的bx,bl,bh等對應的寄存器,原理和上面相同。
在用途方面,他們有各自默認的用途:
Eax用來保存所有API函數的返回值。
寄存器AX和AL通常稱爲累加器(Accumulator),用累加器進行的操作可能需要更少時間。累加器可用於乘、除、輸入/輸出等操作,它們的使用頻率很高;
寄存器BX稱爲基地址寄存器(Base
Register)。它可作爲存儲器指針來使用;
寄存器CX稱爲計數寄存器(Count
Register)。在循環和字符串操作時,要用它來控制循環次數;在位操作中,當移多位時,要用CL來指明移位的位數;
寄存器DX稱爲數據寄存器(Data
Register)。在進行乘、除運算時,它可作爲默認的操作數參與運算,也可用於存放I/O的端口地址。
由於存儲的數據大小關係,AX、BX、CX和DX不能作爲基址和變址寄存器來存放存儲單元的地址, 32位寄存器EAX、EBX、ECX和EDX不僅可傳送數據、暫存數據保存算術邏輯運算結果,而且也可作爲指針寄存器,所以,這些32位寄存器更具有通用性。(什麼是基址,什麼是變址以後會說到)
2個變址和指針寄存器(ESI和EDI)
32位CPU有2個32位通用寄存器ESI和EDI。其低16位對應先前CPU中的SI和DI,對低16位數據的存取,不影響高16位的數據。
寄存器ESI、EDI、SI和DI稱爲變址寄存器(Index
Register),它們主要用於存放存儲單元在段內的偏移量,用它們可實現多種存儲器操作數的尋址方式,爲以不同的地址形式訪問存儲單元提供方便。
變址寄存器不可分割成8位寄存器。作爲通用寄存器,也可存儲算術邏輯運算的操作數和運算結果。它們可作一般的存儲器指針使用。在字符串操作指令的執行過程中,對它們有特定的要求,而且還具有特殊的功能。
2個重要的指針寄存器(ESP和EBP)
這兩個指針寄存器都和“棧”這個神祕的東東有關,那麼什麼是棧呢?這倆指針寄存器又有何作用呢?
從計算機科學的角度看,棧是一種數據結構,是一種先進後出的數據表。棧的最常見操作有兩種:Push(入棧)和Pop(出棧)。
我們可以把棧想象成一摞撲克牌:
PUSH:爲棧增加一個元素的操作是push,相當於在這摞撲克牌最上面再放一張
POP:從棧中取出一個元素的操作叫做POP,相當於從這摞撲克牌取出最上面的一
張。
TOP:標識棧頂位置,並且是動態變化的。每做一次PUSH 操作,它都會自增1;
相反,每做一次POP 操作,它會自減1。棧頂元素相當於撲克牌最上面一張,只有
這張牌的花色是當前可以看到的。
BASE:標識棧底位置,它記錄着撲克牌最下面一張的位置。BASE 用於防止棧空後
繼續彈棧(牌發完時就不能再去揭牌了)。很明顯,一般情況下,BASE 是不會變動
的。
用王爽《彙編語言》中的圖說明一下push和pop操作
代碼如下:
mov ax,0123H
push ax
mov bx,2266H
push bx
mov cx,1122H
pop ax
pop bx
pop cx
mov是傳送數據的指令,mov ax,0123H表明把0123H這個值給ax
H代表0123是十六進制數
mov是傳送數據的指令,mov ax,0123H表明把0123H這個值給ax
H代表0123是十六進制數
圖中左邊的10000H等數值表明內存地址
箭頭指向棧頂位置
那麼針對此例棧底就是1000FH
棧頂由於入棧和出棧操作在不斷變化。
那麼在這裏棧底1000FH就是BP 棧頂(不斷變化的箭頭)就是SP
(BP和SP分別是16位下的寄存器,與ebp,esp類似)
內存的棧區實際上指的就是系統棧。系統棧由系統自動維護,它用於實現高級語言中函
數的調用。對於類似C 語言這樣的高級語言,我們無需擔心他們是如何操作的。一般說來,只有在使用彙編語言的時候,才需要和它直接打交道。
那麼ESP和EBP指的分別是什麼呢?
(1)ESP:棧指針寄存器(extended stack pointer),其內存放着一個指針,該指針永遠指向系統棧最上面一個棧幀的棧頂。
(2)EBP:基址指針寄存器(extended base pointer),其內存放着一個指針,該指針永遠指向系統棧最上面一個棧幀的底部。
本次重點內容:瞭解幾個常見的寄存器名字,記住eax一般用來保存函數的返回值,記住esp是棧頂指針寄存器,ebp是棧底指針寄存器。