0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

嵌入式系統(tǒng)中棧的變化

嵌入式應(yīng)用開發(fā) ? 來源:嵌入式應(yīng)用開發(fā) ? 作者:嵌入式應(yīng)用開發(fā) ? 2022-12-29 16:40 ? 次閱讀

函數(shù)調(diào)用是通過棧來實現(xiàn)的,而且知道在棧中存放著該函數(shù)的局部變量。但是,對于棧的實現(xiàn)細(xì)節(jié)可能不一定清楚。本文將介紹一下在Linux平臺下函數(shù)棧是如何實現(xiàn)的。

棧幀的結(jié)構(gòu)

函數(shù)在調(diào)用的時候都是在棧空間上開辟一段空間以供函數(shù)使用,棧是由高地址向地地址的方向生長的,而且棧有其棧頂和棧底,入棧出棧的地方就叫做棧頂。

在x86系統(tǒng)的CPU中,rsp是棧指針寄存器,這個寄存器中存儲著棧頂?shù)牡刂?。rbp中存儲著棧底的地址。函數(shù)棧空間主要是由這兩個寄存器來確定的。

當(dāng)程序運行時,棧指針rsp可以移動,棧指針和幀指針rbp一次只能存儲一個地址,所以,任何時候,這一對指針指向的是同一個函數(shù)的棧幀結(jié)構(gòu)。

而幀指針rbp是不移動的,訪問棧中的元素可以用-4(%rbp)或者8(%rbp)訪問%rbp指針下面或者上面的元素。

poYBAGOtUeuAYfTAAAE8GPRJXao422.png

測試代碼如下:

#include 

int sum (int a,int b)
{
 int c = a + b;
 return c;
}

int main()
{
 int x = 5,y = 10,z = 0;
 z = sum(x,y);
 printf("%drn",z);
 return 0;
}
0000000000000000 :
   0: 55                    push   %rbp 
   1: 48 89 e5              mov    %rsp,%rbp
   4: 89 7d ec              mov    %edi,-0x14(%rbp) # 參數(shù)傳遞
   7: 89 75 e8              mov    %esi,-0x18(%rbp) # 參數(shù)傳遞
   a: 8b 55 ec              mov    -0x14(%rbp),%edx
   d: 8b 45 e8              mov    -0x18(%rbp),%eax
  10: 01 d0                 add    %edx,%eax 
  12: 89 45 fc              mov    %eax,-0x4(%rbp) # 局部變量
  15: 8b 45 fc              mov    -0x4(%rbp),%eax # 存儲結(jié)果
  18: 5d                    pop    %rbp
  19: c3                    retq   

000000000000001a :
  1a: 55                    push   %rbp # 保存%rbp。rbp,棧底的地址
  1b: 48 89 e5              mov    %rsp,%rbp # 設(shè)置新的棧指針。rsp 棧指針,指向棧頂?shù)牡刂?  1e: 48 83 ec 10           sub    $0x10,%rsp # 分配 16字節(jié)??臻g。%rsp = %rsp-16
  22: c7 45 f4 05 00 00 00  movl   $0x5,-0xc(%rbp) # 賦值
  29: c7 45 f8 0a 00 00 00  movl   $0xa,-0x8(%rbp) # 賦值
  30: c7 45 fc 00 00 00 00  movl   $0x0,-0x4(%rbp) # 賦值
  37: 8b 55 f8              mov    -0x8(%rbp),%edx  
  3a: 8b 45 f4              mov    -0xc(%rbp),%eax 
  3d: 89 d6                 mov    %edx,%esi # 參數(shù)傳遞 ,從右向左
  3f: 89 c7                 mov    %eax,%edi # 參數(shù)傳遞
  41: e8 00 00 00 00        callq  46  # 調(diào)用sum
  46: 89 45 fc              mov    %eax,-0x4(%rbp) 
  49: 8b 45 fc              mov    -0x4(%rbp),%eax # 存儲計算結(jié)果
  4c: 89 c6                 mov    %eax,%esi
  4e: 48 8d 3d 00 00 00 00  lea    0x0(%rip),%rdi        # 55 
  55: b8 00 00 00 00        mov    $0x0,%eax
  5a: e8 00 00 00 00        callq  5f 
  5f: b8 00 00 00 00        mov    $0x0,%eax 
  64: c9                    leaveq 
  65: c3                    retq   
+0x45>+0x3b>+0x2c>

在函數(shù)被調(diào)用之前,調(diào)用者會為調(diào)用函數(shù)做準(zhǔn)備。首先,函數(shù)棧上開辟了16字節(jié)的空間,存儲定義的3個int型變量,建立了main函數(shù)的棧。

pYYBAGOtUlKAaqIXAAFXkjakVho923.png

CALL指令內(nèi)部其實還暗含了一個將返回地址(即CALL指令下一條指令的地址)壓棧的動作(由硬件完成)。

具體來說,call指令執(zhí)行時,先把下一條指令的地址入棧,再跳轉(zhuǎn)到對應(yīng)函數(shù)執(zhí)行的起始處。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式系統(tǒng)
    +關(guān)注

    關(guān)注

    41

    文章

    3613

    瀏覽量

    129622
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11332

    瀏覽量

    210023
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4344

    瀏覽量

    62839
收藏 人收藏

    評論

    相關(guān)推薦

    嵌入式RTOS的 任務(wù)系統(tǒng)

    簡介明了帶你了解嵌入式RTOS的 任務(wù)系統(tǒng)
    的頭像 發(fā)表于 05-16 09:57 ?3364次閱讀
    <b class='flag-5'>嵌入式</b>RTOS的 任務(wù)<b class='flag-5'>棧</b> 和 <b class='flag-5'>系統(tǒng)</b><b class='flag-5'>棧</b>

    TCP_IP協(xié)議嵌入式系統(tǒng)的實現(xiàn)

    本帖最后由 eehome 于 2013-1-5 10:03 編輯 TCP_IP協(xié)議嵌入式系統(tǒng)的實現(xiàn)
    發(fā)表于 08-24 23:05

    嵌入式SIP協(xié)議怎么設(shè)計?

    ,憑借SIP自身的特性可有效提高嵌入式網(wǎng)絡(luò)設(shè)備的互操作性和接入網(wǎng)絡(luò)的便利性。但SIP協(xié)議本身只給出SIP消息的文法定義以及自然語言描述的消息處理,并未給出SIP協(xié)議的實現(xiàn)機(jī)制。這里討論在嵌入式終端設(shè)備上建立
    發(fā)表于 10-29 08:14

    嵌入式系統(tǒng)USB-HOST協(xié)議該如何設(shè)計?

    USB協(xié)議的基本知識包括哪些?嵌入式系統(tǒng)USB-HOST協(xié)議該如何設(shè)計?
    發(fā)表于 04-27 07:10

    嵌入式系統(tǒng)設(shè)計方法變化

    嵌入式系統(tǒng)設(shè)計方法變化的背景嵌入式系統(tǒng)設(shè)計方法的演化總的來說是因為應(yīng)用需求的牽引和IT技術(shù)的推動,隨著微電子技術(shù)的不斷創(chuàng)新和發(fā)...
    發(fā)表于 11-08 07:27

    嵌入式知識體系相關(guān)資料分享

    嵌入式是一門交叉學(xué)科。一個嵌入式電子產(chǎn)品(比如手機(jī))從底層到上層,一般會涉及半導(dǎo)體芯片、電子電路、計算機(jī)、操作系統(tǒng)、多媒體等不同專業(yè)領(lǐng)域的知識。很多從事嵌入式開發(fā)的朋友,通常來自不同的
    發(fā)表于 12-17 06:22

    主流的小型嵌入式網(wǎng)絡(luò)協(xié)議

    新產(chǎn)品、新技術(shù)也是層出不窮,本章節(jié)就為大家介紹當(dāng)前主流的小型嵌入式網(wǎng)絡(luò)協(xié)議。目錄第1章 當(dāng)前主流的小型嵌入式網(wǎng)絡(luò)協(xié)議1.1 當(dāng)前主流的嵌入式
    發(fā)表于 12-23 06:18

    求一種嵌入式軟件溢出檢查方案

    嵌入式軟件溢出產(chǎn)生的原因是什么?嵌入式軟件溢出是怎樣產(chǎn)生的呢?
    發(fā)表于 01-19 06:48

    嵌入式VxWorks網(wǎng)絡(luò)協(xié)議的Mutiplexer接口及其使用方法

    嵌入式系統(tǒng)網(wǎng)絡(luò)協(xié)議的靈活性在應(yīng)用上是一個重要指標(biāo)。介紹嵌入式實時操作系統(tǒng)VxWorks網(wǎng)絡(luò)協(xié)議
    發(fā)表于 04-09 10:00 ?10次下載

    嵌入式WEB服務(wù)器TCP/IP協(xié)議的設(shè)計與實現(xiàn)

    嵌入式TCP/IP 協(xié)議能擴(kuò)展非智能設(shè)備的網(wǎng)絡(luò)功能,是信息智能化的一種有效手段。 本文從嵌入式WEB 服務(wù)器入手,分析了嵌入式TCP/IP 協(xié)議
    發(fā)表于 06-19 09:03 ?35次下載

    嵌入式小型TCPIP協(xié)議

    一個專為嵌入式系統(tǒng)編寫的小型TCP/IP協(xié)議 TCP/IPLean
    發(fā)表于 10-08 17:23 ?50次下載

    嵌入式系統(tǒng)原理、設(shè)計與應(yīng)用

    本書系統(tǒng)講述了嵌入式系統(tǒng)的基本概念、開發(fā)的原理及原則、軟件和硬件結(jié)構(gòu)的設(shè)計、嵌入式操作系統(tǒng)及網(wǎng)絡(luò)協(xié)議
    發(fā)表于 04-25 17:07 ?2次下載

    一個專為嵌入式系統(tǒng)編寫的小型TCP IP協(xié)議

    一個專為嵌入式系統(tǒng)編寫的小型TCP IP協(xié)議
    發(fā)表于 02-08 01:38 ?17次下載

    基于USB嵌入式主機(jī)

    基于USB嵌入式主機(jī)
    發(fā)表于 10-31 08:52 ?4次下載
    基于USB<b class='flag-5'>嵌入式</b>主機(jī)<b class='flag-5'>棧</b>

    嵌入式系統(tǒng)實現(xiàn)對USB接口微小變化的測控

    隨著臺式機(jī)和筆記本電腦串口的消失,USB已成為最常見的外圍設(shè)備接口。此外,USB的嵌入式應(yīng)用正在增加。但是,在嵌入式系統(tǒng)實現(xiàn)USB接口的開發(fā)團(tuán)隊可以輕松地產(chǎn)生微小的
    的頭像 發(fā)表于 08-08 09:22 ?2771次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b><b class='flag-5'>中</b>實現(xiàn)對USB接口微小<b class='flag-5'>變化</b>的測控