日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

6.栈、栈帧

發布時間:2025/6/17 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 6.栈、栈帧 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

棧(Stack)的用途廣泛,通常用于存儲局部變量、傳遞函數參數、保存函數返回地址等。調試程序時需要不斷查看棧內存,所以掌握棧很重要。

棧是FILO(First?In?Last?Out,后進先出)這個都知道。但是在看匯編的時候一定要注意一些對應的相關細節。比如函數調用的時候,反匯編看到的參數進棧順序是倒著的等。

棧的特征

內存結構如下:

?

一個進程中,棧頂指針(ESP)初始狀態指向棧底端。執行PUSH命令將數據壓入棧時,棧頂指針就會上移到站頂端。執行POP命令從棧中彈出數據時,若棧為空,則指針重新移動到棧底端。棧時一種由高地址向低地址擴展的數據結構,是由下往上擴展的(逆向擴展)。

所以?向棧壓入數據時,棧頂指針減小,向低地址移動;從棧中彈出數據時,棧頂指針增加,向高地址移動。初始的時候棧頂指針指向占地。

?

棧幀(Stack?Frame)?棧幀在程序中用于聲明局部變量、調用函數。

棧幀就是利用EBP(棧幀指針,請注意不是ESP)寄存器訪問棧內局部變量、參數、函數返回地址等的手段。ESP寄存器承擔著棧頂指針的作用,而EBP寄存器則負責形式棧幀指針的職能。程序運行中,ESP寄存器的值隨時變化,訪問棧中函數的局部變量、參數時,若依ESP值為基準編寫程序會十分困難,并且也很難使CPU引用到準確的地址。所以,調用某函數時,先要把用作基準點(函數起始地址)的ESP值保存到EBP,并維持在函數內部。這樣,無論ESP的值如何變化,以EBP的值為基準(base)能夠安全訪問到相關函數的局部變量、參數、返回地址,這就是EBP寄存器作為棧幀指針的作用。

?

提示:某些優化選項可能會優化掉棧幀。


源代碼vs2015?C++

#include?"stdafx.h"#include?<iostream>#include?<windows.h>using?namespace?std;long?add(long?a,?long?b)?{long?x?=?a,?y?=?b;return?(x?+?y);}int?main(){long?lNumbera?=?1;long?lNumberb?=?2;printf("%d\n"?,add(lNumbera?,?lNumberb));return?0;}

編譯運行(Debug)之后OD加載上,找到add函數,看下棧幀操作。

?

?

總結

以上是生活随笔為你收集整理的6.栈、栈帧的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。