一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

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

嵌入式應用開發(fā) ? 來源:嵌入式應用開發(fā) ? 作者:嵌入式應用開發(fā) ? 2022-12-29 16:40 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

棧幀的結構

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

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

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

而幀指針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 # 存儲結果
  18: 5d                    pop    %rbp
  19: c3                    retq   

000000000000001a :
  1a: 55                    push   %rbp # 保存%rbp。rbp,棧底的地址
  1b: 48 89 e5              mov    %rsp,%rbp # 設置新的棧指針。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 # 存儲計算結果
  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ù)做準備。首先,函數(shù)棧上開辟了16字節(jié)的空間,存儲定義的3個int型變量,建立了main函數(shù)的棧。

pYYBAGOtUlKAaqIXAAFXkjakVho923.png

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

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

審核編輯:湯梓紅

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

    關注

    41

    文章

    3679

    瀏覽量

    131333
  • Linux
    +關注

    關注

    87

    文章

    11508

    瀏覽量

    213654
  • 函數(shù)
    +關注

    關注

    3

    文章

    4379

    瀏覽量

    64791
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

    簡介明了帶你了解嵌入式RTOS的 任務系統(tǒng)
    的頭像 發(fā)表于 05-16 09:57 ?4004次閱讀
    <b class='flag-5'>嵌入式</b>RTOS的 任務<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é)議怎么設計?

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

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

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

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

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

    嵌入式知識體系相關資料分享

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

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

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

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

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

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

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

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

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

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

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

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

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

    基于USB嵌入式主機

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

    基于和欣嵌入式操作系統(tǒng)實現(xiàn)的一個構件化的網(wǎng)絡協(xié)議設計淺析

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

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

    隨著臺式機和筆記本電腦串口的消失,USB已成為最常見的外圍設備接口。此外,USB的嵌入式應用正在增加。但是,在嵌入式系統(tǒng)實現(xiàn)USB接口的開發(fā)團隊可以輕松地產(chǎn)生微小的
    的頭像 發(fā)表于 08-08 09:22 ?3078次閱讀
    <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>的測控