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

  • 简述

    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。
    RS1 RS2 寄存器组选择
    0 0 寄存器组0
    0 1 寄存器组1
    1 0 寄存器组2
    1 1 寄存器组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 压入堆栈。

    从堆栈中弹出

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