1. 程式人生 > >暫存器ESP和EBP的理解

暫存器ESP和EBP的理解

一直對暫存器ESP和EBP的概念總是有些混淆,檢視定義ESP是棧頂指標,EBP是存取堆疊指標。還是不能很透徹理解。之後借於一段彙編程式碼,總算是對兩者有個比較清晰的理解。
下面是按呼叫約定__stdcall 呼叫函式test(int p1,int p2)的彙編程式碼
;假設執行函式前堆疊指標ESP為NN
push   p2    ;引數2入棧, ESP -= 4h , ESP = NN - 4h
push   p1    ;引數1入棧, ESP -= 4h , ESP = NN - 8h
call test    ;壓入返回地址 ESP -= 4h, ESP = NN - 0Ch  
;//進入函式內
{
push   ebp                        ;保護先前EBP指標, EBP入棧, ESP-=4h, ESP = NN - 10h

mov    ebp, esp                   ;設定EBP指標指向棧頂 NN-10h
mov    eax, dword ptr  [ebp+0ch]  ;ebp+0ch為NN-4h,即引數2的位置
mov    ebx, dword ptr  [ebp+08h]  ;ebp+08h為NN-8h,即引數1的位置
sub    esp, 8                     ;區域性變數所佔空間ESP-=8, ESP = NN-18h
...
add    esp, 8                     ;釋放區域性變數, ESP+=8, ESP = NN-10h
pop    ebp                        ;出棧,恢復EBP, ESP+=4, ESP = NN-0Ch

ret    8                          ;ret返回,彈出返回地址,ESP+=4, ESP=NN-08h, 後面加運算元8為平衡堆疊,ESP+=8,ESP=NN, 恢復進入函式前的堆疊.
}
看完彙編後,再看EBP和ESP的定義,哦,豁然開朗,
原來ESP就是一直指向棧頂的指標,而EBP只是存取某時刻的棧頂指標,以方便對棧的操作,如獲取函式引數、區域性變數等。

相關推薦

ESPEBP理解

一直對暫存器ESP和EBP的概念總是有些混淆,檢視定義ESP是棧頂指標,EBP是存取堆疊指標。還是不能很透徹理解。之後借於一段彙編程式碼,總算是對兩者有個比較清晰的理解。下面是按呼叫約定__stdcall 呼叫函式test(int p1,int p2)的彙編程式碼;假設執行

ESPEBP的一些理解

PS:EBP是當前函式的存取指標,即儲存或者讀取數時的指標基地址;ESP就是當前函式的棧頂指標。每一次發生函式的呼叫(主函式呼叫子函式)時,在被呼叫函式初始時,都會把當前函式(主函式)的EBP壓棧,以便從子函式返回到主函式時可以獲取EBP。 下面是按呼叫約定__stdc

ADS1248 配置通道轉換

ADS1248是TI的一款 24位delta-sigma(ΔΣ) 、2KSPS、8通道(4通道差分)ADC晶片。TI官方有RTD設計方案,參考文件做了一板4通道3線PT100溫度採集。除錯ADS1248過程中遇到一些問題,記錄下來方便以後使用。 參考程式碼:

名稱地址的對映分析

首先要清楚的一點,所有操作,最終目的都是操作暫存器 一,對比51微控制器和STM32對暫存器的操作 1)51微控制器: sfr P0=0x80; //關鍵字sfr 宣告地址和名稱的對映 P0=0x00;

espebp

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

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

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

espebp介紹

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

詳細解析ESPEBP

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

2018/11/03-棧、x86架構-《惡意程式碼分析實戰》

  棧用於函式的記憶體、區域性變數、流控制結構等被儲存在棧中。棧是一種用壓和彈操作來刻畫的資料結構,向棧中壓入一些東西,然後再把他們彈出來。它是一種先入後出(LIFO)的結構。   x86架構有對棧的內建支援。用於這種支援的暫存器包括ESP和EBP。其中,ESP是棧指標,包含了指向棧頂的記憶體地址。一些東西

Verilog中儲存器——陣列定義賦值

[轉載]http://blog.sina.com.cn/s/blog_9424755f0101rhrh.html 儲存器是一個暫存器陣列。儲存器使用如下方式說明: reg [ msb: 1sb] memory1 [ upper1: lower1], memory2 [upper2: lowe

STM32 系列之 DAC 運用於理解

在這裡,我也不多BB,基本是看了原子的PDF之後,自己理解。所以可能比較簡略 單個DAC通道如下: VDDA 和VSSA為模擬電源端。   輸出電壓 = Vref+ * (DORx/2^n)          &

理解

   1暫存器和儲存器   儲存器在CPU外,一般指硬碟,U盤等可以在切斷電源後儲存資料的裝置,容量一般比較大,缺點是讀寫速度都很慢,普通的機械硬碟讀寫速度一般是50MB/S左右。記憶體和暫存器就是為了解決儲存器讀寫速度慢而產生的多級儲存機制,從20

ARM的7種執行模式37個

ARM的7種工作模式 包括使用者模式和特權模式二大類,其中特權模式又分為系統模式和異常模式。CPU每次只能執行在一種工作模式下,各種模式之間的切換可以是程式設計師通過程式碼主動切換(通過程式狀態暫存器CPSR)也可以是CPU自己在某種情況下自動切換。在每種模式下最多隻能看到18個暫存器,其他

第005課 計算機單位

計算機單位換算 單位換算 微米,毫米,釐米,分米....... 1Byte = 8Bit 1M = 1024KB 1G = 1024M 1個字母在計算機中佔一個位元組,8個位。 位寬 1個位元組   256 2個位元組   65

實現BX的內容加上123 並把送到AX

① 一條指令 1 LEA AX,[BX+123] ②兩條指令 1 ADD BX,123 2 MOV AX,BX   Tips: LEA指令與MOV指令的區別: ① MOV指令是 資料        傳送指令-------傳送

【arm】arm32位arm64位架構、指令差異分析總結

Date: 2018.9.21 1、參考 2、前言   最近三個月的時間,都在進行解碼庫的arm架構彙編優化,包括arm32位彙編優化和arm64位彙編優化。在arm32位入門之後,只要掌握了兩種架構的暫存器和指令集差異之後,就可以很快上手編寫arm64

中斷,異常,系統呼叫,程序切換時的堆疊變化儲存

 1. 中斷,異常,系統呼叫相同:     CPU自動壓入:   ss            執行級別提升時需切換堆疊,因此多壓入

彙編函式 哪些在使用時需要保護恢復現場

在寫彙編函式時,總感覺在哪些暫存器該保護哪些不需要保護的問題上比較模糊,要是保護所有使用到的暫存器感覺比較死板也不符合規則,所以就去網上搜了搜。找到了一些規則,我覺得這是一個規則問題,大家都遵守的話就可以相互複用函數了,當然這個規則也是有一定道理的。 1、你自己的函式在操作改變edi esi ebx ebp

MIPS的、指令定址方式的分類

MIPS的32個暫存器 助記符 編號 作用 zero 0 恆為0 at 1 (assembly temporary)保留給彙編器使用 v0,v1 2-3

64位32位的彙編的比較

64位暫存器分配的不同 區別有: 64位有16個暫存器,32位只有8個。但是32位前8個都有不同的命名,分別是e _ ,而64位前8個使用了r代替e,也就是r _。e開頭的暫存器命名依然可以直接運用於相應暫存器的低32位。而剩下的暫存器名則是從r8