0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式系统中栈的变化

嵌入式应用开发 来源:嵌入式应用开发 作者:嵌入式应用开发 2022-12-29 16:40 次阅读

函数调用是通过栈来实现的,而且知道在栈中存放着该函数的局部变量。但是,对于栈的实现细节可能不一定清楚。本文将介绍一下在Linux平台下函数栈是如何实现的。

栈帧的结构

函数在调用的时候都是在栈空间上开辟一段空间以供函数使用,栈是由高地址向地地址的方向生长的,而且栈有其栈顶和栈底,入栈出栈的地方就叫做栈顶。

在x86系统的CPU中,rsp是栈指针寄存器,这个寄存器中存储着栈顶的地址。rbp中存储着栈底的地址。函数栈空间主要是由这两个寄存器来确定的。

当程序运行时,栈指针rsp可以移动,栈指针和帧指针rbp一次只能存储一个地址,所以,任何时候,这一对指针指向的是同一个函数的栈帧结构。

而帧指针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) # 参数传递
   7: 89 75 e8              mov    %esi,-0x18(%rbp) # 参数传递
   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 栈指针,指向栈顶的地址
  1e: 48 83 ec 10           sub    $0x10,%rsp # 分配 16字节栈空间。%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 # 参数传递 ,从右向左
  3f: 89 c7                 mov    %eax,%edi # 参数传递
  41: e8 00 00 00 00        callq  46  # 调用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>

在函数被调用之前,调用者会为调用函数做准备。首先,函数栈上开辟了16字节的空间,存储定义的3个int型变量,建立了main函数的栈。

pYYBAGOtUlKAaqIXAAFXkjakVho923.png

CALL指令内部其实还暗含了一个将返回地址(即CALL指令下一条指令的地址)压栈的动作(由硬件完成)。

具体来说,call指令执行时,先把下一条指令的地址入栈,再跳转到对应函数执行的起始处。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式系统
    +关注

    关注

    40

    文章

    3519

    浏览量

    128797
  • Linux
    +关注

    关注

    87

    文章

    11123

    浏览量

    207886
  • 函数
    +关注

    关注

    3

    文章

    4234

    浏览量

    61961
收藏 人收藏

    评论

    相关推荐

    嵌入式RTOS的 任务系统

    简介明了带你了解嵌入式RTOS的 任务系统
    的头像 发表于 05-16 09:57 2712次阅读
    <b class='flag-5'>嵌入式</b>RTOS的 任务<b class='flag-5'>栈</b> 和 <b class='flag-5'>系统</b><b class='flag-5'>栈</b>

    TCP_IP协议嵌入式系统的实现

    本帖最后由 eehome 于 2013-1-5 10:03 编辑 TCP_IP协议嵌入式系统的实现
    发表于 08-24 23:05

    嵌入式SIP协议怎么设计?

    ,凭借SIP自身的特性可有效提高嵌入式网络设备的互操作性和接入网络的便利性。但SIP协议本身只给出SIP消息的文法定义以及自然语言描述的消息处理,并未给出SIP协议的实现机制。这里讨论在嵌入式终端设备上建立
    发表于 10-29 08:14

    嵌入式系统USB-HOST协议该如何设计?

    USB协议的基本知识包括哪些?嵌入式系统USB-HOST协议该如何设计?
    发表于 04-27 07:10

    嵌入式系统设计方法变化

    嵌入式系统设计方法变化的背景嵌入式系统设计方法的演化总的来说是因为应用需求的牵引和IT技术的推动,随着微电子技术的不断创新和发...
    发表于 11-08 07:27

    嵌入式知识体系相关资料分享

    嵌入式是一门交叉学科。一个嵌入式电子产品(比如手机)从底层到上层,一般会涉及半导体芯片、电子电路、计算机、操作系统、多媒体等不同专业领域的知识。很多从事嵌入式开发的朋友,通常来自不同的
    发表于 12-17 06:22

    主流的小型嵌入式网络协议

    新产品、新技术也是层出不穷,本章节就为大家介绍当前主流的小型嵌入式网络协议。目录第1章 当前主流的小型嵌入式网络协议1.1 当前主流的嵌入式
    发表于 12-23 06:18

    嵌入式VxWorks网络协议的Mutiplexer接口及其使用方法

    嵌入式系统网络协议的灵活性在应用上是一个重要指标。介绍嵌入式实时操作系统VxWorks网络协议
    发表于 04-09 10:00 10次下载

    嵌入式WEB服务器TCP/IP协议的设计与实现

    嵌入式TCP/IP 协议能扩展非智能设备的网络功能,是信息智能化的一种有效手段。 本文从嵌入式WEB 服务器入手,分析了嵌入式TCP/IP 协议
    发表于 06-19 09:03 35次下载

    嵌入式小型TCPIP协议

    一个专为嵌入式系统编写的小型TCP/IP协议 TCP/IPLean
    发表于 10-08 17:23 50次下载

    嵌入式系统原理、设计与应用

    本书系统讲述了嵌入式系统的基本概念、开发的原理及原则、软件和硬件结构的设计、嵌入式操作系统及网络协议
    发表于 04-25 17:07 2次下载

    一个专为嵌入式系统编写的小型TCP IP协议

    一个专为嵌入式系统编写的小型TCP IP协议
    发表于 02-08 01:38 17次下载

    基于USB嵌入式主机

    基于USB嵌入式主机
    发表于 10-31 08:52 4次下载
    基于USB<b class='flag-5'>嵌入式</b>主机<b class='flag-5'>栈</b>

    基于和欣嵌入式操作系统实现的一个构件化的网络协议设计浅析

    Internet 技术。要实现嵌入式设备的网络化,需要实现TCP/IP网络协议,但由于Internet上各种通信协议对计算机存储器、运算速度等的要求比较高,使得嵌入式系统协议
    发表于 02-20 14:59 1210次阅读
    基于和欣<b class='flag-5'>嵌入式</b>操作<b class='flag-5'>系统</b>实现的一个构件化的网络协议<b class='flag-5'>栈</b>设计浅析

    嵌入式系统实现对USB接口微小变化的测控

    随着台式机和笔记本电脑串口的消失,USB已成为最常见的外围设备接口。此外,USB的嵌入式应用正在增加。但是,在嵌入式系统实现USB接口的开发团队可以轻松地产生微小的
    的头像 发表于 08-08 09:22 2665次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>系统</b><b class='flag-5'>中</b>实现对USB接口微小<b class='flag-5'>变化</b>的测控