热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

嵌入式系统入门–寄存器组/堆栈

简述8051微控制器共有128字节的RAM。我们将讨论这128字节RAM的


简述



8051 微控制器共有 128 字节的 RAM。我们将讨论这 128 字节 RAM 的分配,并检查它们作为堆栈和寄存器的用途。



8051 中的 RAM 内存空间分配



8051 内部的 128 字节 RAM 被分配了地址 00 到 7FH。它们可以作为内存位置直接访问,并分为以下三个不同的组 -




  • 从 00H 到 1FH 位置的 32 个字节被留出用于寄存器组和堆栈。




  • 从 20H 到 2FH 位置的 16 个字节被留出用于位寻址读/写存储器。




  • 30H到7FH位置的80个字节用于读写存储;它被称为scratch pad. 这些 80 位 RAM 被 8051 程序员广泛用于存储数据和参数。



ROM空间分配



在 8051 中注册寄存器组



总共为寄存器组和堆栈预留了 32 字节的 RAM。这 32 个字节被分成四个寄存器组,其中每个组有 8 个寄存器,R0-R7。从 0 到 7 的 RAM 位置为 R0-R7 的 bank 0 留出,其中 R0 是 RAM 位置 0,R1 是 RAM 位置 1,R2 是位置 2,依此类推,直到内存位置 7,即属于 bank 的 R7 0.


第二组寄存器 R0-R7 从 RAM 的位置 08 开始,然后转到位置 OFH。R0–R7 的第三组从内存位置 10H 开始,然后转到位置 17H。最后,RAM 位置 18H 到 1FH 被预留给第四组 R0-R7。



默认寄存器库



如果 RAM 位置 00-1F 为四个寄存器组留出,那么当 8051 上电时我们可以访问 R0-R7 的哪个寄存器组?答案是寄存器组0;也就是说,在对 8051 进行编程时,从 0 到 7 的 RAM 位置以名称 R0 到 R7 进行访问。因为通过诸如 R0 到 R7 之类的名称来引用这些 RAM 位置比通过它们的存储位置更容易。



如何切换寄存器组



寄存器组 0 是 8051 上电时的默认值。我们可以使用 PSW 寄存器切换到其他 bank。PSW 的 D4 和 D3 位用于选择所需的寄存器组,因为它们可以被位寻址指令 SETB 和 CLR 访问。例如,“SETB PSW.3”将设置 PSW.3 = 1 并选择存储体寄存器 1。



























RS1RS2寄存器组选择
00寄存器组0
01寄存器组1
10寄存器组2
11寄存器组3



堆栈及其操作


堆叠在 8051



堆栈是 CPU 用来临时存储数据或内存地址等信息的 RAM 部分。考虑到寄存器数量有限,CPU 需要这个存储区域。

如何访问堆栈



由于堆栈是 RAM 的一部分,因此 CPU 内部有寄存器指向它。用于访问堆栈的寄存器称为堆栈指针寄存器。8051 中的堆栈指针为 8 位宽,可以取值为 00 到 FFH。8051 初始化时,SP 寄存器的值为 07H。这意味着 RAM 位置 08 是用于堆栈的第一个位置。CPU 寄存器在堆栈中的存储操作称为PUSH,并将堆栈中的内容返回到 CPU 寄存器中称为 POP.

压入栈



在 8051 中,堆栈指针 (SP) 指向堆栈的最后使用位置。当数据压入堆栈时,堆栈指针(SP)加1。执行PUSH时,寄存器的内容保存在堆栈中,SP加1。为了将寄存器压入堆栈,我们必须使用它们的 RAM 地址。例如,指令“PUSH 1”将寄存器 R1 压入堆栈。

从堆栈中弹出



将堆栈的内容弹出回给定的寄存器与推入过程相反。每次弹出操作时,栈顶字节都被复制到指令指定的寄存器中,栈指针递减一次。


推荐阅读
  • 选择PS3的硬盘容量时,应考虑个人需求和预算。虽然PS3的内存固定为512MB,但硬盘容量可以选择。如果你经常下载游戏或存储大量媒体文件,建议选择较大容量的硬盘。一般情况下,320GB或500GB的硬盘已经足够满足大部分用户的需求。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 数据结构第三章,栈、队列、数组,期末不挂科指南,第3篇
    数据结构第三章,栈、队列、数组,期末不挂科指南,第3篇,Go语言社区,Golang程序员人脉社 ... [详细]
  • 非计算机专业的朋友如何拿下多个Offer
    大家好,我是归辰。秋招结束后,我已顺利入职,并应公子龙的邀请,分享一些秋招面试的心得体会,希望能帮助到学弟学妹们,让他们在未来的面试中更加顺利。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • 双指针法在链表问题中应用广泛,能够高效解决多种经典问题,如合并两个有序链表、合并多个有序链表、查找倒数第k个节点等。本文将详细介绍这些应用场景及其解决方案。 ... [详细]
  • 探讨Redis的最佳应用场景
    本文将深入探讨Redis在不同场景下的最佳应用,包括其优势和适用范围。 ... [详细]
  • Flutter 开发中集成极光推送的详细步骤
    本文详细介绍了如何在 Flutter 项目中集成极光推送服务,包括配置和测试的具体步骤。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 多线程基础概览
    本文探讨了多线程的起源及其在现代编程中的重要性。线程的引入是为了增强进程的稳定性,确保一个进程的崩溃不会影响其他进程。而进程的存在则是为了保障操作系统的稳定运行,防止单一应用程序的错误导致整个系统的崩溃。线程作为进程的逻辑单元,多个线程共享同一CPU,需要合理调度以避免资源竞争。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • 单片机入门指南:基础理论与实践
    本文介绍了单片机的基础知识及其应用。单片机是一种将微处理器(类似于CPU)、存储器(类似硬盘和内存)以及多种输入输出接口集成在一块硅片上的微型计算机系统。通过详细解析其内部结构和功能,帮助初学者快速掌握单片机的基本原理和实际操作方法。 ... [详细]
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • Python应用实例大揭秘:七大令人惊叹的高阶技巧展示
    2020年,Python无疑成为了最炙手可热的编程语言,其影响力已远远超出程序员的范畴。从初学者到资深从业者,甚至小学生,都在纷纷加入Python的学习热潮中。凭借其低门槛、易上手和强大的功能,Python正逐渐成为各行业不可或缺的工具。本文将揭示七个令人惊叹的Python高级应用技巧,帮助读者进一步提升编程水平。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有