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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(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)用是通過棧來實(shí)現(xiàn)的,而且知道在棧中存放著該函數(shù)的局部變量。但是,對(duì)于棧的實(shí)現(xiàn)細(xì)節(jié)可能不一定清楚。本文將介紹一下在Linux平臺(tái)下函數(shù)棧是如何實(shí)現(xiàn)的。

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

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

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

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

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

poYBAGOtUeuAYfTAAAE8GPRJXao422.png

測(cè)試代碼如下:

#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 # 存儲(chǔ)結(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 # 存儲(chǔ)計(jì)算結(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)用者會(huì)為調(diào)用函數(shù)做準(zhǔn)備。首先,函數(shù)棧上開辟了16字節(jié)的空間,存儲(chǔ)定義的3個(gè)int型變量,建立了main函數(shù)的棧。

pYYBAGOtUlKAaqIXAAFXkjakVho923.png

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

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

審核編輯:湯梓紅

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

    關(guān)注

    40

    文章

    3521

    瀏覽量

    128813
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11128

    瀏覽量

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

    關(guān)注

    3

    文章

    4239

    瀏覽量

    61985
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

    簡(jiǎn)介明了帶你了解嵌入式RTOS的 任務(wù)系統(tǒng)
    的頭像 發(fā)表于 05-16 09:57 ?2742次閱讀
    <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)的實(shí)現(xiàn)

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

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

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

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

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

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

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

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

    嵌入式是一門交叉學(xué)科。一個(gè)嵌入式電子產(chǎn)品(比如手機(jī))從底層到上層,一般會(huì)涉及半導(dǎo)體芯片、電子電路、計(jì)算機(jī)、操作系統(tǒng)、多媒體等不同專業(yè)領(lǐng)域的知識(shí)。很多從事嵌入式開發(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

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

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

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

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

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

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

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

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

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

    一個(gè)專為嵌入式系統(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)實(shí)現(xiàn)的一個(gè)構(gòu)件化的網(wǎng)絡(luò)協(xié)議設(shè)計(jì)淺析

    Internet 技術(shù)。要實(shí)現(xiàn)嵌入式設(shè)備的網(wǎng)絡(luò)化,需要實(shí)現(xiàn)TCP/IP網(wǎng)絡(luò)協(xié)議,但由于Internet上各種通信協(xié)議對(duì)計(jì)算機(jī)存儲(chǔ)器、運(yùn)算速度等的要求比較高,使得嵌入式系統(tǒng)協(xié)議
    發(fā)表于 02-20 14:59 ?1221次閱讀
    基于和欣<b class='flag-5'>嵌入式</b>操作<b class='flag-5'>系統(tǒng)</b>實(shí)現(xiàn)的一個(gè)構(gòu)件化的網(wǎng)絡(luò)協(xié)議<b class='flag-5'>棧</b>設(shè)計(jì)淺析

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

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