堆栈指针SP

2023-11-06

1.什么是堆栈指针

在51系列单片机里,堆栈指针sp在片内RAM128B中开辟栈区,并随时跟踪栈顶地址。它是按"先进后出"的原则存取数据。开机复位后,单片机栈底地址为07H。

主要用来保存临时数据,局部变量和中断/调用子程序程序的返回地址。

堆栈指针总是指向栈顶元素。在51系列单片机中,堆栈是向上生长的,所以数据入栈的时候,堆栈指针先加1,再压栈。

出栈的时候先弹出数据,堆栈指针再减1。

但在AVR单片机中,堆栈是向下生长的,数据入栈时指针将减1,数据出栈时指针将加1。

2.堆栈指针sp的作用

由堆栈设计者确定。对于计算机中的堆栈是计存储数据的一种数据结构,SP的作用就是指示当前要出栈或入栈的数据,并在操作执行后自动递增或递减。但有一点,SP是入栈递增还是入栈递减,就是由CPU的生产厂家确定,通常由一块存储区和指向该存储区的指针SP构成。

在堆栈中保存数据叫入栈,从堆栈中读取数据叫出栈。堆栈保存数据的特点是入栈和出栈是倒序的,最先入栈的数据要到最后才能出栈,而最后入栈的数据最先出栈,出栈就必定是递减,反之亦然。

8051的堆栈容量不超过(256-8)字节。SP入栈递增的堆栈通常叫向上生长型的堆栈,反之就是向下生长型的堆栈,这就是通常说的“先进后出,后进先出”。

源代码

#include <stdio.h>
int func(int a, int b)
{
    return a+b;
}
void main(void)
{
    int c;
    c = func(2,3);
    printf("%d/n", c);
}

反汇编代码

00010408 <func>:
   10408:    e52db004     push    {fp}        ; (str fp, [sp, #-4]!)
   1040c:    e28db000     add    fp, sp, #0
   10410:    e24dd00c     sub    sp, sp, #12
   10414:    e50b0008     str    r0, [fp, #-8]
   10418:    e50b100c     str    r1, [fp, #-12]
   1041c:    e51b2008     ldr    r2, [fp, #-8]
   10420:    e51b300c     ldr    r3, [fp, #-12]
   10424:    e0823003     add    r3, r2, r3
   10428:    e1a00003     mov    r0, r3
   1042c:    e28bd000     add    sp, fp, #0
   10430:    e49db004     pop    {fp}        ; (ldr fp, [sp], #4)
   10434:    e12fff1e     bx    lr

00010438 <main>:
   10438:    e92d4800     push    {fp, lr}
   1043c:    e28db004     add    fp, sp, #4
   10440:    e24dd008     sub    sp, sp, #8
   10444:    e3a01003     mov    r1, #3
   10448:    e3a00002     mov    r0, #2
   1044c:    ebffffed     bl    10408 <func>
   10450:    e50b0008     str    r0, [fp, #-8]
   10454:    e51b1008     ldr    r1, [fp, #-8]
   10458:    e30004e0     movw    r0, #1248    ; 0x4e0
   1045c:    e3400001     movt    r0, #1
   10460:    ebffffa0     bl    102e8 <printf@plt>
   10464:    e320f000     nop    {0}
   10468:    e24bd004     sub    sp, fp, #4
   1046c:    e8bd8800     pop    {fp, pc}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

堆栈指针SP 的相关文章

  • 打包第三库那些事

    介绍 一般来说 写完一个第三方库需要打包出三个文件夹的文件 对应三种不同模块类型 outputpath dist umd module es es module lib commonjs module 三个模块类型 umd UMD Univ
  • Springboot使用Knife4j

    简述 knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案 knife4j的前身是 swagger bootstrap ui 为了契合微服务的架构发展 由于原来 swagger bootstrap ui采用的

随机推荐

  • eclipse opengl java_eclipse安装openGL方法(完整版)

    学校上机使用在Windows上开发OpenGL 一般都会选择Visual Studio作为开发工具 不过我更喜欢Eclipse 在Windows上开发OpenGL所需的库一般会带有32这个后缀 跟Linux上的还不太一样 1 首先下载Ecl
  • 移入——归约技术

    归约 定义 我们可以将自底向上语法分析过程看成是建一个串w 归约 慰问发开始符号的过程 在归约中 一个与某产生式体相匹配的特定子串被替换为该产生式的头部的非终结符号 定义理解起来比较晦涩 我们来看个例子就知道了 已知有文法 E gt E T
  • SpringBoot slf4j的yaml日志配置不生效

    Spring boot工程中使用slf4j日志框架 发现日志配置总是不生效 我的yaml配置如下 logging level 全局日志级别 root info 具体到某个类的日志级别 打印所有访问请求日志 com xyz filter We
  • specialization of template.... in different namespace的解决

    代码来自DTL文档index htm struct Example tablename columnname int exampleInt DB EXAMPLE INT VALUE string exampleStr DB EXAMPLE
  • 理论总结

    作业1 2 1 Python程序是区分大小写的 2 解释程序对高级语言编写的程序是一边翻译 一边执行的 下次执行同样的程序时 还必须重新翻译 3 Python是一种用途广泛 解释型 面向对象的程序设计语言 4 程序设计语言包括机器语言 汇编
  • Into Clause VS Let Clause

    1 Into Clause 用来将select join 或者group的结果存储到一个临时变量中 目的 在之后的查询中需要使用此结果 例如 var developersGroupedByLanguage from d in develop
  • 面了一个测试工程师,明显感觉他背了很多面试题...

    最近有朋友去字节面试 面试前后进行了20天左右 包含4轮电话面试 1轮笔试 1轮主管视频面试 1轮hr视频面试 据他所说 80 的人都会栽在第一轮面试 要不是他面试前做足准备 估计都坚持不完后面几轮面试 其实 第一轮的电话面试除了一些常规的
  • LRU缓存淘汰算法

    概念理解 1 LRU是Least Recently Used的缩写 即最近最少使用页面置换算法 是为虚拟页式存储管理服务的 2 操作系统课程里有学过 在内存不够的场景下 淘汰就内容的策略 淘汰掉最不经常使用 LRU原理 可以用一个特殊的栈来
  • CentOS 7安装Gnome GUI 图形界面

    http www centoscn com image text config 2015 0528 5552 html
  • jwt在线解密工具分享

    前言 之前调用一个第三方api的时候 看到需要在Authorization填写bearer token 英文不好 看成了熊 bear 心里很疑惑 实际上 bearer 指的是持票人 Bearer Token用于授权访问资源 任何Bearer
  • splunk之获取数据(Ingesting Data)

    Ingesting Data 下载数据地址 http splk it f1data use uname in the Username field and 5p1unkbcup for the Password field
  • GDB调试命令详解

    GDB是什么 调试程序 程序中出现的语法错误可以借助编译器解决 但逻辑错误则只能靠自己解决 实际场景中解决逻辑错误最高效的方法 就是借助调试工具对程序进行调试 所谓调试 Debug 就是让代码一步一步慢慢执行 跟踪程序的运行过程 比如 可以
  • Vue如何实现反向代理(配置proxy)

    Vue如何实现反向代理 那问题来了 反向代理是什么 反向代理 Reverse Proxy 实际运行方式是指以代理服务器来接受internet上的连接请求 然后将请求转发给内部网络上的服务器 并将从服务器上得到的结果返回给internet上请
  • Mysql的B+树高度计算

    问题 假设B 树的高度是2 一行数据的记录大小是1K 主键ID是int类型 问 该B 树存放的总记录数 知识点 Mysql的默认存储引擎是Innodb Innodb的最小存储单位是页 一页大小等于16K B 树的叶子节点存放数据 内部节点存
  • 黑马 Spring_day01

    Spring day01 今日目标 掌握Spring相关概念 完成IOC DI的入门案例编写 掌握IOC的相关配置与使用 掌握DI的相关配置与使用 1 课程介绍 对于一门新技术 我们需要从为什么要学 学什么以及怎么学这三个方向入手来学习 那
  • 计算机提示d3dcompiler43.dll缺失怎么修复,多个解决方法分享

    在游戏玩家中 遇到游戏提示找不到 d3dcompiler43 dll 文件的情况并不罕见 这使得许多玩家在启动游戏时感到困扰 因为这意味着他们可能无法正常运行游戏 那么 d3dcompiler43 dll 文件到底是什么呢 为什么游戏会提示
  • 数据库实现学生管理系统

    1 QT将数据库分为三个层次 1 gt 数据库驱动层 QSqlDriver QSqlDriverCreator QSqlDriverCreatorBase QSqlDriverPlugin 2 gt sql接口层 QSqlDatabase
  • 在剪贴板上有大量信息,是否保留其内容, 以便此后粘贴到其他程序中? VBA 对策

    在剪贴板上有大量信息 是否保留其内容 以便此后粘贴到其他程序中 对策a 是文件关闭前 随便复制一个空单元格就可以了 对策b Application DisplayAlerts False 关闭任何提醒 但复制的信息将仍旧保存在剪贴板中 对策
  • Qt数据库编程

    Qt数据库编程 版本说明 版本 作者 日期 备注 0 1 loon 2018 10 25 初稿 目录 文章目录 Qt数据库编程 版本说明 目录 一 需求和目的 二 使用说明 1 Qt 5 6 0的数据库操作类 2 Driver Layer
  • 堆栈指针SP

    1 什么是堆栈指针 在51系列单片机里 堆栈指针sp在片内RAM128B中开辟栈区 并随时跟踪栈顶地址 它是按 先进后出 的原则存取数据 开机复位后 单片机栈底地址为07H 主要用来保存临时数据 局部变量和中断 调用子程序程序的返回地址 堆