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

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

8051 中的 RAM 内存空间分配

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

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

  • 从 20H 到 2FH 位置的 16 个字节被留作位寻址读/写内存。

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

ROM 空间分配

8051 中的寄存器组

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

第二个寄存器组 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 位置比使用它们的内存位置要容易得多。

如何切换寄存器组

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

RS1 RS2 Bank Selected
0 0 Bank0
0 1 Bank1
1 0 Bank2
1 1 Bank3

堆栈及其操作

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 压入堆栈。

从堆栈弹出

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