1. 程式人生 > >詳細解析ESP暫存器與EBP暫存器

詳細解析ESP暫存器與EBP暫存器

               詳細解析ESP暫存器與EBP暫存器

   最近在看彙編碼,經常在程式的開頭看到ESPEBP暫存器的出現,由於本人基礎知識的不牢靠,便上網查閱相關的資料,可惜網上的資料都不給力,都只是流於形式,沒有好好的解釋這兩個東西是什麼.終於通過google國外的網站,得到一個相當不錯的網頁,上面解釋的很清晰http://www.tenouk.com/Bufferoverflowc/Bufferoverflow2a.html 英文好的可以上去看看(我好像很喜歡這句話)

(1)ESP:棧指標暫存器(extended stack pointer),其記憶體放著一個指標,該指標永遠指向系統棧最上面一個棧幀的棧頂。


(2)EBP:基址指標暫存器(extended base pointer),其記憶體放著一個指標,該指標永遠指向系統棧最上面一個棧幀的底部。

在這裡要注意由於在intel系統中棧是向下生長的(棧越擴大其值越小,堆恰好相反)

 

(1)ESP:棧指標暫存器(extended stack pointer),其記憶體放著一個指標,該指標永遠指向系統棧最上面一個棧幀的棧頂。
(2)EBP:基址指標暫存器(extended base pointer),其記憶體放著一個指標,該指標永遠指向系統棧最上面一個棧幀的底部。

根據上述的定義,在通常情況下ESP是可變的,隨著棧的生產而逐漸變小,而ESB暫存器是固定的,只有當函式的呼叫後,發生入棧操作而改變。

在上述的定義中使用ESP來標記棧的底部,他隨著棧的變化而變化

pop ebp;出棧 棧擴大4byte 因為ebp為32位

push ebp;出棧,棧減少4byte

add esp, 0Ch;表示棧減小12byte

sub esp, 0Ch;表示棧擴大12byte

而ebp暫存器的出現則是為了另一個目標,通過固定的地址與偏移量來尋找在棧引數與變數。而這個固定值者存放在ebp暫存器中,。但是這個值會在函式的呼叫過程發生改變。而在函式執行結束之後需要還原,因此,在函式的出棧入棧過程中進行儲存。

下面根據彙編碼來對上面的內容進行解釋

現在利用VS2013的反彙編功能進行解釋注意設定好斷點

 

 


在上述的彙編碼中我們可以看到在函式開始的時候,習慣上以這麼兩端程式碼開始

push     ebp  

mov     ebp,esp 

按照字面上理解,上面兩句話的意思是將ebp推入棧中,之後讓ebp等於esp

為什麼這麼做呢?因為ebp作為一個用於定址的固定值是有時間週期的。只有在某個函式執行過程中才是固定的,在函式呼叫與函式執行完畢後會發生改變。

在函式呼叫之前,將呼叫者的函式(caller)的ebp存入棧,以便於在執行完畢後恢復現場是還原ebp的值。下一步,foo必須為它的區域性變數分配空間,同時,也必須為它可能用到的一些臨時變數分配空間。

 sub esp, 0cch;減去的值根據程式而定

之後會根據情況看是否儲存某些特定的暫存器(EBXESIEDI

之後ebp的值會保持固定。此後區域性變數和臨時儲存都可以通過基準指標EBP加偏移量找到了

在函式執行完畢,控制流返回到呼叫者的函式(caller)之前會進行下述操作

  pop         edi

  pop         esi

  pop         ebx

  mov         esp,ebp   

  pop         ebp         

  Ret

所謂有始有終,這是會還原上面儲存的暫存器值,之後還原esp的值(上一個函式呼叫之前的esp被儲存在固定的ebp中)與ebp值。這一過程被稱為還原現場之後通過ret返回上一個函式。

相關推薦

詳細解析ESPEBP

               詳細解析ESP暫存器與EBP暫存器    最近在看彙編碼,經常在程式的開頭看到ESP和EBP暫存器的出現,由於本人基礎知識的不牢靠,便上網查閱相關的資料,可惜網上的資料都不給力,都只是流於形式,沒有好好的解釋這兩個東西是什麼.終於通過goo

espebp介紹

esp暫存器與ebp暫存器介紹 2013年09月21日 03:04:15 傷心小鴕鳥 閱讀數:974 版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/westboy666/article/details/11858225

面試常客Handler詳細解析(主執行緒子執行緒資訊互動)(五)

主要講解了主執行緒和子執行緒的handler的訊息傳送: 下面直接上程式碼: package com.example.handler; import android.app.Activity; import android.os.Bundle; imp

邁拓維矩:數字視頻矩陣切換模擬矩陣切換的對比

邁拓維矩 數字矩陣切換器 模擬矩陣切換器 根據矩陣切換器的切換方式,視頻矩陣切換器可分為數字矩陣切換器和模擬矩陣切換器。 數字視頻矩陣切換器:主要通過信息與數字轉換來完成切換的,在視輸入與輸出的過程中,將模擬信號變為數字信號來完成處理和傳輸。 模擬矩陣切換器:主要通過

jquery過濾選擇-----------(表單對象屬性過濾選擇 表單選擇

images alt 分享 wid image logs jquery query 器) 1.表單對象屬性選擇器    2.程序 3.表單選擇器    jquery過濾選擇器-----------(表單對象屬性過濾選擇器 與 表單選擇器)

使用一個公網地址配置多個Horizon安全服務連接服務的方法

proc 均衡器 融合 -o 案例 瀏覽器 更新 dmi 字符 在企業應用中,將Horizon虛擬桌面發布到Internet時,需要在路由器或防火墻將TCP的443、4172、8443與UDP的4172等4個端口映射給Horizon安全服務器,才可將處於內網的虛擬桌面發布到

後代選擇子元素選擇

1.   後代選擇器:找到其後代,包括兒子孫子 曾孫等,改變屬性      標籤名稱1 標籤名稱2{}      使用空格做連線符2.   子元素選擇器:找到其特定直接子元素改變屬性      標籤名稱1>標籤名稱2{}        注意:不能有空格       選中

CSS3第一日--屬性選擇偽類選擇

屬性選擇器 在 CSS 中,選擇器是一種模式,用於選擇需要新增樣式的元素。 CSS3新增了3個新的屬性選擇器,分別是: 1、E[attr^="value"]:指定元素中的屬性名,並且這個屬性名有屬性值存在,且這個屬性值是以"value"開頭; 2、E[at

css偽類選擇偽元素選擇區別

偽類選擇器,和一般的DOM中的元素樣式不一樣,它並不改變任何DOM內容。只是插入了一些修飾類的元素,這些元素對於使用者來說是可見的,但是對於DOM來說不可見。偽類的效果可以通過新增一個實際的類來達到。 a:link|a:visited|a:hover|a:active

後代選擇子元素選擇的區別

1.連線符號 1.後代選擇器用空格作為連線符號 2.子元素選擇器用>作為連線符號 2.選中標籤範圍 1.後代選擇器會選中指定標籤中,所有的特定後代標籤,也就是會選中兒子,孫子,只有放到標籤中的特定標籤都能選中 2.子元素選擇器只會選中指定標籤中,所有特定的直接

spring任務執行任務調度(TaskExecutor And TaskScheduler)

throws max 出現異常 ice eap 多線程 handle -- 毫秒   對於多線程及周期性調度相關的操作,spring框架提供了TaskExecutor和TaskScheduler接口為異步執行和任務調度。並提供了相關實現類給開發者使用。(只記錄采用註解的使用

裝飾多層裝飾

裝飾器的執行時從上往下的順序執行,結構性從下往上 裝飾器之前首先要講述一下閉包,閉包之前談一下函數語言程式設計:把函式作為函式的引數以及返回值的程式設計方式 #多個裝飾器 import time def deco01(func): def w

自編碼堆疊自編碼簡述

作者:科研君 連結:https://www.zhihu.com/question/41490383/answer/103006793 來源:知乎 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。 本文是對知乎問題為什麼稀疏自編碼器很少見到多層的?的回答,

espebp

首先說明,在堆疊中變數分佈是從高地址到低地址分佈,EBP是指向棧底的指標,在過程呼叫中不變,又稱為幀指標。ESP指向棧頂,程式執行時移動,ESP減小分配空間,ESP增大釋放空間,ESP又稱為棧指標。 下面來逐步分析函式的呼叫過程 1.函式main執行,main各個引數從右向左逐步壓入棧中,最後壓入返回

《STM32F7原理應用版上下冊》張洋高清PDF學習

暫存器版上下冊PDF全集。本套書籍以ST公司的STM32F767為目標晶片,詳細介紹了STM32F7的特點、片內外資源的使用,並輔以65個例程,由淺入深地介紹了STM32F7的使用。所有例程都經過精心編寫,從原理開始介紹,到程式碼編寫、下載驗證,一步步教讀者如何實現。所有原始碼都配有詳細註釋,且經過嚴格測試。

通俗易懂:mmap硬體的關係

分析應用程式獲取按鍵操作的流程 分析應用程式控制LED燈的操作流程 按鍵:按鍵操作,觸發中斷,讀取硬體暫存器,獲取按鍵狀態,喚醒休眠的程序,read操作呼叫copy_to_user將核心的緩衝區資料拷貝到使用者緩衝區 總結:第一次拷貝:從硬體暫存器讀數讀到核心緩衝區

、記憶體(記憶體儲器)外設

暫存器:指的是CPU核心裡的暫存器,如r0,r1等 記憶體:記憶體(Memory)也被稱為記憶體儲器,其作用是用於暫時存放CPU中的運算資料,以及與硬碟等外部儲存器交換的資料。如RAM,SDRAM,Flash等。 實體地址:作業系統會給每一個記憶體單元編上一個絕對的號,計算機

儲存器物理區別

從根本上講,暫存器與RAM的物理結構不一樣。 一般暫存器是指由基本的RS觸發器結構衍生出來的D觸發,就是一些與非門構成的結構,這個在數電裡面大家都看過; RAM則有自己的工藝,一般1Bit由六MOS管構成。 所以,這兩者的物理結構不一樣也導致了兩者的效能不同。暫存器訪問

IA32x86-64的區別

IA32暫存器 一個IA32CPU包含一組8個儲存32位值的通用暫存器,這些暫存器用來儲存整數資料和指標: 31-0 15-0 15-8 7-0 使用慣例 %eax %ax %ah %al 呼叫者儲存 %ecx %cx %ch %cl 呼叫者

浮點數指令

暫存器 AVX浮點體系結構允許資料儲存在16個YMM暫存器中 255 127 0 %ymm0 %xmm0 1st FP arg.返回值 %ymm1 %xmm1 2nd FP引數 %ymm2 %x