寄存器的用途
- 可將寄存器內的數據執行算術及邏輯運算。
- 存於寄存器內的地址可用來指向內存的某個位置,即尋址。
- 可以用來讀寫數據到電腦的周邊設備。
ESP EBP ESI EDI 它們可以像數據寄存器一樣在運算過程中存放操作數,但它們只能使用16位。其實他們通常的用途是在段內尋址時提供偏移地址。
| 寄存器 | 作用 |
| EAX | 累加器,算數運算的主要寄存器。 |
| ECX | 計數器,在循環指令和傳處理指令中當作計數器。 |
| EDX | 數據寄存器,一般在做雙字長運算時把 EDX 和 EAX 組合在一起放一個雙字長數,EDX用來存放高位數字。 |
| EBX | 通常作為內存偏移指針使用(相對於EAX、ECX、EDX)基址寄存器。 |
| EBP | 基址指針寄存器,可作為堆棧區中的基值地址以便訪問堆棧中的其他信息。這也是一個作為指針的寄存器。通常,它被高級語言編譯器用以建造‘堆棧幀’來保存函數或過程的局部變量 EBP:用來表示 參數 [ebp+0x4*(n+1)] n表示第幾個參數 局部變量 [ebp-0x4*n] n表示第幾個局部變量 |
| ESP | 堆棧指針寄存器,表示棧頂的偏移地址。記錄當前堆棧的使用情況(用到哪兒了) |
| ESI | 變址寄存器,原地址指針寄存器,一般與 EDS配合使用,有自動增減量的功能。MOVS指令中的源地址指針 |
| EDI | 變址寄存器,目的地址指針寄存器,一般與 EDS 配合使用,有自動增減量的功能。MOVS指令中的目的地址指針 |
| EIP | 指向CPU當前執行的代碼位置 |
PUSHAD是將 8 個32位通用寄存器的內容順序入棧。入棧順序是EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI
這時候入棧的ESP數據是執行PUSHAD之前的值。執行該指令后,ESP 值減 32 (十進制32)
POPAD是將當前堆棧內容順序彈出,ESP 也恢復原來的值,即加32。然后是PUSHA與POPA,其實都一樣,只不過就是16位的。
6個段寄存器
| CS | 代碼段(存放代碼段的段地址) |
| DS | 數據段(存放數據段的段地址) |
| ES | 附加數據段 |
| SS | 堆棧段(存放堆棧段的段地址) |
| FS | 附加段 |
| GS | 附加段 |
標志寄存器
我們通常看他們的值來控制跳轉成功與否。他們受到比較與運算的影響來變換數值,從而讓跳轉成功或失敗。
| C | 進位標志,記錄運算結果的符號,結果為負數時則1,否則 0 |
| P | 奇偶標志,用來為機器中傳送信息時可能產生的代碼出錯情況聽歌檢驗條件。當結果操作數中 1 的個數為偶數時置 1,否則置 0 |
| A | 輔助進位標志位 |
| Z | 零標志,運算結果為 0 時 ZF 位置 1,否則置 0 |
| S | 符號標志,記錄運算結果的符號,結果為負時置 1,否則置 0 |
| T | 中斷允許標志位,由 CLI,STI 兩條指令來控制 |
| D | 向量標志位,由 CLD,STD 兩條指令來控制 |
| O | 溢出標志,在操作數超出了計算能表示的范圍稱為溢出 |
尋址
然后我們說說“尋址”的那些事
立即尋址,這種尋址方式下,操作數以常量的形式出現在指令中
比如下圖,JMP Shark恆.00513426
意思是無條件跳轉到內存00513426處,其中00513426是立即數。這叫做立即尋址。

存儲器尋址分為直接尋址與間接尋址。
直接尋址是帶方括號的常量或是變量。DS是操作數默認的段寄存器。
如下圖所示,BA520073處的內容與ah寄存器相加后,結果給BA520073

寄存器間接尋址
下圖內容是DS為數據段段地址,edi寄存器的內容為偏移地址,與al做比較。

寄存器相對尋址
什么是相對尋址? 就是在間接尋址的基礎上和立即數做一個加法運算。請看下圖

基址變址尋址
也很容易理解,就是基址+變址在方括號里,如下圖
什么是基址,什么是變址,我們在剛才講過了,可以向上看。

相對基址變址尋址
這名字真長啊,不過也很好理解。
還記得剛才的寄存器相對尋址嗎?方括號內有個立即數與寄存器做加法,就叫寄存器相對尋址。如果沒有立即數做加法,那就叫寄存器間接尋址。
然后結合我們剛才的基址變址尋址,我們在與一個立即數做加法,請看下圖。

前面2個寄存器相加,我們學過了,叫基址變址尋址,然后又加上一個立即數,我們管他叫“相對”,那3個在一起,就是“相對基址變址尋址”。
