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


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

8051 中的 RAM 内存空间分配

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

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

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

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

ROM空间分配

在 8051 中注册银行

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

第二组寄存器 R0–R7 从 RAM 位置 08 开始,到达位置 OFH。R0–R7 的第三组从内存位置 10H 开始,一直到位置 17H。最后,RAM 位置 18H 到 1FH 为第四组 R0–R7 预留。

默认寄存器库

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

如何切换注册库

当 8051 上电时,寄存器组 0 是默认值。我们可以使用 PSW 寄存器切换到其他库。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 中的堆栈

堆栈是 RAM 的一部分,CPU 使用它临时存储数据或内存地址等信息。考虑到寄存器数量有限,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压入堆栈。

从堆栈中弹出

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