1. 程式人生 > >堆疊中的EIP EBP ESP

堆疊中的EIP EBP ESP

 測試空間旗下大頭針出品  EIP,EBP,ESP都是系統的暫存器,裡面存的都是些地址。  為什麼要說這三個指標,是因為我們系統中棧的實現上離不開他們三個。  我們DC上講過棧的資料結構,主要有以下特點:  後進先處。(這個強調過多)

其實它還有以下兩個作用:  1.棧是用來儲存臨時變數,函式傳遞的中間結果。  2.作業系統維護的,對於程式設計師是透明的。 我們可能只強調了它的後進先出的特點,至於棧實現的原理,沒怎麼講?下面我們就通過一個小例子說說棧的原理。 先寫個小程式: void fun(void) {    printf("hello world"); } void main(void) {   fun()   printf("函式呼叫結束"); } 這是一個再簡單不過的函式呼叫的例子了。 當程式進行函式呼叫的時候,我們經常說的是先將函式壓棧,當函式呼叫結束後,再出棧。這一切的工作都是系統幫我們自動完成的。 但在完成的過程中,系統會用到下面三種暫存器: 1.EIP 2.ESP 3.EBP 當呼叫fun函式開始時,三者的作用。 1.EIP暫存器裡儲存的是CPU下次要執行的指令的地址。  也就是呼叫完fun函式後,讓CPU知道應該執行main函式中的printf("函式呼叫結束")語句了。 2.EBP暫存器裡儲存的是是棧的棧底指標,通常叫棧基址,這個是一開始進行fun()函式呼叫之前,由ESP傳遞給EBP的。(在函式呼叫前你可以這麼理解:ESP儲存的是棧頂地址,也是棧底地址。) 3.ESP暫存器裡儲存的是在呼叫函式fun()之後,棧的棧頂。並且始終指向棧頂。 當呼叫fun函式結束後,三者的作用: 1.系統根據EIP暫存器裡儲存的地址,CPU就能夠知道函式呼叫完,下一步應該做什麼,也就是應該執行main函式中的printf(“函式呼叫結束”)。 2.EBP暫存器儲存的是棧底地址,而這個地址是由ESP在函式呼叫前傳遞給EBP的。等到呼叫結束,EBP會把其地址再次傳回給ESP。所以ESP又一次指向了函式呼叫結束後,棧頂的地址。 其實我們對這個只需要知道三個指標是什麼就可以,可能對我們以後學習棧溢位的問題以及看棧這方面的書籍有些幫助。當有人再給你說EIP,ESP,EBP的時候,你不能一頭霧水,那你水平就顯得窪了許多。其實不知道我們照樣可以程式設計,因為我們是C級別的程式設計師,而不是ASM級別的程式設計師。

相關推薦

堆疊EIP EBP ESP

 測試空間旗下大頭針出品  EIP,EBP,ESP都是系統的暫存器,裡面存的都是些地址。  為什麼要說這三個指標,是因為我們系統中棧的實現上離不開他們三個。  我們DC上講過棧的資料結構,主要有以下特點:  後進先處。(這個強調過多) 其實它還有以下兩個作用:  1.棧是用

ebp esp堆疊

一般的說法ebp指向棧底,esp指向棧頂 從堆疊的概念來講,壓棧就是把資料放到棧頂上面,於是棧頂又增長 不過悲劇的x86堆疊要倒著長,如果以為push以後esp會增加可就大錯特錯了。。ebp雖然叫棧底,但是永遠大於等於棧頂 每push一個值,esp相應減小 從地址角

什麽是EIPESPEBP

數據結構 插入 線性 ebp 簡單 操作 允許 push指令 下一條 堆棧是一種簡單的數據結構,是一種只允許在其一端進行插入或刪除的線性表。允許插入或刪除操作的一端稱為棧頂,另一端稱為棧底,對堆棧的插入和刪除操作被稱入棧和出棧。有一組CPU指令可以實現對進程的內存實現堆棧訪

匯編之 eax, ebx, ecx, edx, esi, edi, ebp, esp??

後繼 sso 允許 暫存 不能 框架 proc 調用 邊界 一般寄存器:AX、BX、CX、DXAX:累積暫存器,BX:基底暫存器,CX:計數暫存器,DX:資料暫存器 索引暫存器:SI、DISI:來源索引暫存器,DI:目的索引暫存器 堆疊、基底暫存器:SP、BPSP:堆疊指標

轉載:匯編語言裏 eax, ebx, ecx, edx, esi, edi, ebp, esp這些都是什麽意思啊?

指針 標識 ati des 通用 很多 lin 返回 sub 匯編語言裏 eax, ebx, ecx, edx, esi, edi, ebp, esp這些都是什麽意思啊? eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86 匯編語言中C

組合語言裡 eax ebx ecx edx esi edi ebp esp這些都是什麼意思啊

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!                eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86 組合語言中CPU上的通用暫存器的名稱,是32位的暫存器。如果用C語言來

跟蹤eipesp

本文為張銀奎老師《程式碼除錯》一書中關於的棧實驗,記錄下照貓畫虎的學習過程。 程式碼: int __stdcall Proc(int n) { int a=n; printf("A test to inspect stack, n=%d,a=%d.",n,a); ret

c++堆疊 top() pop()的具體作用是什麼

top()是取棧頂元素pop()是彈出棧頂元素stack<int> a;a.push(1); // 1a.push(2); // 1 2a.push(3); // 1 2 3int c = a.top(); // c = 3a.pop(); // 1 2a.pu

1057 Stack (30 分)樹狀陣列求堆疊位數

題目 Stack is one of the most fundamental data structures, which is based on the principle of Last In First Out (LIFO). The basic operations inc

關於水晶報表的 "不支援的操作。無法在 C++ 堆疊開啟由 JRC 引擎處理的文件。"

VS2010使用水晶報表時,開發前需要單獨安裝外掛;開發完畢後部署時,伺服器也需要安裝對應電腦位數的外掛支援。 當外掛都安裝好後,程式釋出後還是報錯:“關於水晶報表的 "不支援的操作。無法在 C++ 堆疊中開啟由 JRC 引擎處理的文件。" 經排查後發現2010中的水晶

組合語言裡 eax, ebx, ecx, edx, esi, edi, ebp, esp這些都是什麼意思啊?

eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86 組合語言中CPU上的通用暫存器的名稱,是32位的暫存器。如果用C語言來解釋,可以把這些暫存器當作變數看待。 比方說:add eax,-2 ; //可以認為是給變數eax加上-2這樣的一個值。 這些32位暫存器有多種用途

棧幀%ebp,%esp詳解

首先應該明白,棧是從高地址向低地址延伸的。每個函式的每次呼叫,都有它自己獨立的一個棧幀,這個棧幀中維持著所需要的各種資訊。暫存器ebp指向當前的棧幀的底部(高地址),暫存器esp指向當前的棧幀的頂部(地址地)。下圖為典型的存取器安排,觀察棧在其中的位置 入棧操作:p

你真的瞭解資料在堆疊的儲存方式嗎?

**JavaScript資料型別分為:** 分類 | 型別 -------- | ----- 原始資料型別(7種) | Number、String、Boolean、Null、Undefined、Symbol、BigInt 引用資料型別 | Object 先看兩段程式碼 ```javascri

匯編EBP寄存器和ESP寄存器的區別

其中 棧幀 ack 基址 技術 編譯 概念 poi 系統 炎炎夏日,在實驗室裏熱成狗了,所以準備學習點匯編讓心涼一下。。。 目前看的書是劉穎東編著的《揭秘數據解密的關鍵技術》。 閑話不表,言歸正傳。 EBP和ESP都是匯編中關於指針的寄存器。但是定義不同: (1)ESP:棧

C++程式碼反彙編後的函式呼叫過程,堆疊暫存器EBPESP

棧是從高地址向低地址生長的。  ebp始終指向當前棧幀的棧底部 , 通過ebp+4中儲存著函式的返回地址 。函式返回時將EBP的值推給EIP ,返回到上一個函幀繼續執行。 ret 與call指令 相反 ,call 將EIP壓入堆疊,然後跳到標號處。 ret 8  在函式返回

esp暫存器與ebp暫存器介紹

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

程式語言的底層描述(2)——棧指標esp和幀指標ebp

程式語言的底層描述(2)——棧指標esp和幀指標ebp 2014年10月11日 17:43:57 coreyspomu 閱讀數:3062更多 個人分類: 資訊標識和處理 本節我們重點討論棧指標esp和幀指標ebp,圍繞這兩個重要的暫存器,推匯出函式棧幀結構。

JVM記憶體堆疊、堆、方法區

堆疊、堆、方法區 JAVA的JVM的記憶體可分為3個區:堆(heap)、堆疊(stack)和方法區(method) 堆區:(例如:存放成員變數,又稱例項變數) 提供所有類例項和陣列物件儲存區域。 jvm只有一個堆區(heap)被所有執行緒共享,堆中不存放基本型別和物件引用,只

d3 元素堆疊規則

d3元素堆疊規則 d3 自創的元素,例如 circle、line、rect等對很多css屬性並不適用。 例如 myline.style(‘z-index’, 20) 並不會生效。 不過 對於 div 等原生html元素可以起作用。 例如 mydiv.style(‘z-index’, 20

java堆疊的理解

本文中介紹的都是很淺顯的東西,如果有問題請指出 一、暫存器、位(bit)、位元組(byte)        暫存器:                   &n