嵌入式系统 - 寄存器组/堆栈
8051 微控制器共有 128 字节的 RAM。我们将讨论这 128 字节 RAM 的分配,并检查它们作为堆栈和寄存器的使用情况。
8051 中 RAM 内存空间分配
8051 内部的 128 字节 RAM 被分配地址 00 到 7FH。它们可以直接作为内存位置访问,并被分成三个不同的组,如下所示:
从 00H 到 1FH 的 32 字节位置留给寄存器组和堆栈。
从 20H 到 2FH 的 16 字节位置留给位寻址读/写内存。
从 30H 到 7FH 的 80 字节位置用于读写存储;它被称为暂存区。这 80 个位置的 RAM 被 8051 程序员广泛用于存储数据和参数。
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 时,RAM 位置 0 到 7 使用 R0 到 R7 的名称进行访问。因为用 R0 到 R7 等名称引用这些 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 中的堆栈
堆栈是 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 压入堆栈。
弹出堆栈
将堆栈的内容弹出回给定寄存器与压入过程相反。对于每个弹出操作,堆栈的顶部字节都被复制到指令指定的寄存器中,并且堆栈指针递减一次。