eax ...edi esp ebp寄存器簡介(轉)

eax ...edi esp ebp寄存器簡介(轉)

首先介紹我們會經常看到的一些寄存器:
4個數據寄存器(EAXEBXECXEDX)
2
個變址和指針寄存器(ESIEDI)
2個指針寄存器(ESPEBP)


4個數據寄存器(EAXEBXECXEDX)
32CPU432位的通用寄存器EAXEBXECXEDX。對低16位數據的存取,不會影響高16位的數據。這些低16位寄存器分別命名爲:AXBXCXDX,它和先前的CPU中的寄存器相一致。
416位寄存器又可分割成8個獨立的8位寄存器(AXAH-ALBXBH-BLCXCH-CLDXDH-DL),每個寄存器都有自己的名稱,可獨立存取。程序員可利用數據寄存器的這種“可分可合”的特性,靈活地處理字/字節的信息。

那麼如何理解eax,ax,al(ah)之間的關係呢?
專業點可以這樣解釋:Eax32位寄存器,ax16位寄存器,al(ah)是八位寄存器。
那麼eax存儲的數據就是ax的兩倍,axal(ah)的兩倍。
Eax可以存儲的數字是DWORD(雙字)ax存儲的是WORD(字)AL(AH)存儲的是BYTE(字節),那麼爲什麼又有AHAL呢,我們可以這樣理解,AX=AH+ALAH存儲的是AX的高8位數據,AL存儲的是AX的低八位數據。H這裏就是HIGH,L就是LOW.
假設eax是紅色區域,那麼eax現在就是64636261
那麼ax就是eax的低十六位,也就是6261
Al61AH62
eax <wbr>...edi <wbr>esp <wbr>ebp寄存器簡介(轉)



其他ebxecxedx也有類似的bx,bl,bh等對應的寄存器,原理和上面相同。

在用途方面,他們有各自默認的用途:
Eax用來保存所有API函數的返回值。
寄存器AXAL通常稱爲累加器(Accumulator),用累加器進行的操作可能需要更少時間。累加器可用於乘、除、輸入/輸出等操作,它們的使用頻率很高;
寄存器BX稱爲基地址寄存器(Base Register)。它可作爲存儲器指針來使用; 
寄存器CX稱爲計數寄存器(Count Register)。在循環和字符串操作時,要用它來控制循環次數;在位操作中,當移多位時,要用CL來指明移位的位數;
寄存器DX稱爲數據寄存器(Data Register)。在進行乘、除運算時,它可作爲默認的操作數參與運算,也可用於存放I/O的端口地址。

由於存儲的數據大小關係,AXBXCXDX不能作爲基址和變址寄存器來存放存儲單元的地址, 32位寄存器EAXEBXECXEDX不僅可傳送數據、暫存數據保存算術邏輯運算結果,而且也可作爲指針寄存器,所以,這些32位寄存器更具有通用性。(什麼是基址,什麼是變址以後會說到)

2個變址和指針寄存器(ESIEDI)
32CPU232位通用寄存器ESIEDI。其低16位對應先前CPU中的SIDI,對低16位數據的存取,不影響高16位的數據。

寄存器ESIEDISIDI稱爲變址寄存器(Index Register),它們主要用於存放存儲單元在段內的偏移量,用它們可實現多種存儲器操作數的尋址方式,爲以不同的地址形式訪問存儲單元提供方便。
變址寄存器不可分割成8位寄存器。作爲通用寄存器,也可存儲算術邏輯運算的操作數和運算結果。它們可作一般的存儲器指針使用。在字符串操作指令的執行過程中,對它們有特定的要求,而且還具有特殊的功能。

2個重要的指針寄存器(ESPEBP)


這兩個指針寄存器都和“棧”這個神祕的東東有關,那麼什麼是棧呢?這倆指針寄存器又有何作用呢?


從計算機科學的角度看,棧是一種數據結構,是一種先進後出的數據表。棧的最常見操作有兩種: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是十六進制數

eax <wbr>...edi <wbr>esp <wbr>ebp寄存器簡介(轉)



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是棧底指針寄存器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章