通過一段彙編,加深對暫存器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只是存取某時刻的棧頂指標,以方便對棧的操作,如獲取函式引數、區域性變數等。
下面是按呼叫約定__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只是存取某時刻的棧頂指標,以方便對棧的操作,如獲取函式引數、區域性變數等。
相關文章
- iOS彙編基礎(二)暫存器iOS
- 除錯時檢視彙編和暫存器資料等除錯
- 重新整理彙編—————暫存器的基本概念[二]
- CS 暫存器 和 IP 暫存器
- 逆向學習筆記3——暫存器與彙編指令筆記
- 暫存器定址和暫存器間接定址的區別
- SPI通訊協議 的移位暫存器資料交換過程協議
- 關於STM32的BSRR(埠位設定/清除暫存器) 和 BRR(埠位清除暫存器) 的理解(初學32)
- 透過重構來加深理解——DDD
- 8天入門docker系列 —— 第二天 通過一個aspnetcore程式加深對容器的理解DockerNetCore
- CS、IP和PC暫存器
- 暫存器
- PC暫存器
- Git暫存區深入理解Git
- 6.常見暫存器和指令
- 為什麼Modbus的只讀暫存器被稱為“輸入暫存器(Input Registers)”而不是“輸出暫存器”
- 一段C語言和彙編的對應分析,揭示函式呼叫的本質C語言函式
- 在x86彙編中將暫存器設定為零的最佳方法是什麼:xor,mov或?
- 淺談彙編器、編譯器和直譯器編譯
- 通過變數a控制for迴圈的暫停和繼續變數
- CPU 中通用暫存器的作用
- 如何優雅地從四個方面加深對深度學習的理解深度學習
- 對KM演算法暫時性的理解演算法
- Qt中對js和HTML通訊的理解QTJSHTML
- 【STM32】【暫存器】暫存器位讀寫方式配置系統時鐘
- 程式設計中暫存器的使用程式設計
- STM32 GPIO 暫存器的配置
- 由一道關於變數作用域的面試題,來加深對var和let的理解變數面試題
- Git工作區和暫存區Git
- 暫存
- Java讀取暫存器資料的方法Java
- 基於暫存器呼叫的軟體加速
- 對預編譯的理解編譯
- 新手分享_再談FS暫存器
- 【STC8H】STC8系列專有的特殊的暫存器位——PW_2暫存器的最高位 EAXFR
- CPU中跟蹤後繼指令地址的暫存器
- 對Vue元件通訊的理解Vue元件
- 2020-12-6(從反彙編理解指標和引用的區別)指標
- 10.1 除錯事件讀取暫存器除錯事件