詳細解析ESP暫存器與EBP暫存器
詳細解析ESP暫存器與EBP暫存器
最近在看彙編碼,經常在程式的開頭看到ESP和EBP暫存器的出現,由於本人基礎知識的不牢靠,便上網查閱相關的資料,可惜網上的資料都不給力,都只是流於形式,沒有好好的解釋這兩個東西是什麼.終於通過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;減去的值根據程式而定
之後會根據情況看是否儲存某些特定的暫存器(EBX,ESI和EDI)
之後ebp的值會保持固定。此後區域性變數和臨時儲存都可以通過基準指標EBP加偏移量找到了
在函式執行完畢,控制流返回到呼叫者的函式(caller)之前會進行下述操作
pop edi
pop esi
pop ebx
mov esp,ebp
pop ebp
Ret
所謂有始有終,這是會還原上面儲存的暫存器值,之後還原esp的值(上一個函式呼叫之前的esp被儲存在固定的ebp中)與ebp值。這一過程被稱為還原現場之後通過ret返回上一個函式。
相關推薦
詳細解析ESP暫存器與EBP暫存器
詳細解析ESP暫存器與EBP暫存器 最近在看彙編碼,經常在程式的開頭看到ESP和EBP暫存器的出現,由於本人基礎知識的不牢靠,便上網查閱相關的資料,可惜網上的資料都不給力,都只是流於形式,沒有好好的解釋這兩個東西是什麼.終於通過goo
esp暫存器與ebp暫存器介紹
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 來源:知乎 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。 本文是對知乎問題為什麼稀疏自編碼器很少見到多層的?的回答,
esp和ebp暫存器
首先說明,在堆疊中變數分佈是從高地址到低地址分佈,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管構成。 所以,這兩者的物理結構不一樣也導致了兩者的效能不同。暫存器訪問
IA32暫存器與x86-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