[翻译]嵌入式系统-寄存器组/栈

一、蹩脚的译者的话

笔者最近在读用于51单片机的实时操作系统RTX51-Tiny的用户文档《RTX51 Tiny User’s Guide》时,见文档内多次提到了 “register bank”这个字眼,想了想应该就是刚学51时接触的寄存器组了。以下引用说明了寄存器组的主要用处:

通常的用法是,0组寄存器(PSW中RS0/RS1 = 0),用于程序。其它三组寄存器可用于中断等特殊用途,那样可以减少中断的压栈等现场保护的开销。

https://zhidao.baidu.com/question/511829486.html

如果程序中有多个中断源,可以考虑使用多个寄存器组,可以减少系统在中断时的开销!

https://zhidao.baidu.com/question/367905652901116324.html

在查资料过程中,发现了一篇英文文献对register bank做了很好的解释说明,为了加强自己的理解,于是笔者尝试翻译了下原文,原文链接为:https://www.tutorialspoint.com/embedded_systems/es_register_bank.htm,英语好的同学阅读原文去吧,别看我这蹩脚的译文了,哈哈。

二、原文译文

8051微控制器总共含有128字节的随机读写内存(RAM)。接下来我们将探讨这128字节随机读写内存的分配方式并且列举它们作为栈(stack)和寄存器(register)时的用法。

【8051的随机读写内存分布】

8051的128字节片内随机读写内存分布于地址00h到7Fh。它们被分为如下的三个不同部分,并且可以作为内存区域被直接访问:

  • 从地址00h到1Fh的32字节区域被划拨为寄存器组和栈。
  • 从地址20h到2Fh的16字节区域被划拨为可位寻址区(bit-addressable)。
  • 从地址30h到7Fh的80字节区域作为可读写存储区域使用,其称之为高速暂存区(scratch pad)。这80字节经常被8051的程序用于存储数据与各种参数。
片内随机读写内存区域划分方式

 

【8051的寄存器组】

总计32字节的随机读写内存被划分为了寄存器组(register bank)与栈。这32字节被分为了4个寄存器组,其中每一个内含8个寄存器,称为R0~R7。从地址00h到07h的地址区域被划分为寄存器组0(bank 0),内含寄存器R0~R7,其中R0位于地址00h、R1位于地址01h、R2位于地址02h、以此类推下去,直到存储寄存器R7的地址07h。

第二组寄存器组(译者注:即寄存器组1,bank 1)内含的R0~R7分布于地址08h到0Fh。第三组寄存器组 (译者注:即寄存器组2 ,bank 2) 内含的R0~R7分布于地址10h到17h。最后,第四个寄存器组 (译者注:即寄存器组3 ,bank 3) 分布于地址18h到1Fh。

【默认寄存器组】

既然随机读写内存区域的地址00h~1Fh被划分为了4个寄存器组,那么8051刚上电时会2使用哪一组寄存器组中的R0~R7呢?答案是寄存器组0;也就是说,当我们为8051编写程序时,随机读写内存中的地址00h到地址07h被命名为R0~R7,并且可以通过访问R0~R7的方式对相应地址进行访问(译者注:即编写程序时,当我们想访问地址00h时,直接在汇编代码里敲R0就可以啦,当然处理中断时情况会有所变化,感兴趣的可以去查询相关资料)。相比于直接通过它们的内存地址进行访问,通过R0到R7进行访问显然是更加直观的。

【如何切换寄存器组】

寄存器组0是8051上电时默认使用的寄存器组。我们可以通过PSW寄存器来切换到其他寄存器组。PSW寄存器的位4和位3用于切换不同寄存器组,由于它们可以通过位寻址指令SETB与CLR访问,举例来说,“SETB PSW.3”将会将PSW.3设置为1(译者注:默认PSW寄存器的位4为0,PSW.3表示PSW寄存器的位3)并且选择寄存器组1。

RS1(PWS寄存器位4)RS2 (PWS寄存器位3)寄存器组选择
00寄存器组0
01寄存器组1
10寄存器组2
11寄存器组3

【栈和它的操作】

[8051的栈]

栈是CPU用来临时存储诸如:数据、内存地址等信息的一片区域。鉴于CPU有限的寄存器数量,其需要这样一片存储区域用于暂时存储信息。

[栈是如何被访问的]

由于栈是随机读写内存的一片区域,因此CPU内有一个寄存器专门用来指向栈的地址以方便访问,这个寄存器被称为栈指针寄存器(stack pointer register)。8051的栈指针寄存器(以下简称SP寄存器)有8位位宽,因此可以存储的地址范围为00h到FFh。当8051初始化时,SP寄存器中的值被设置为07h。这意味着随机读写内存中处于地址08h的位置是栈的起始位置(译者注:也就是说,栈底位于08h,栈的第一个数据从08h开始存储)。向栈中存储CPU的某个寄存器值被称为“入栈”(Push),从栈中取出值并写回CPU的寄存器称为“出栈”(Pop)。

[入栈操作]

在8051中,栈指针(stack pointer,SP)(译者注:其实和栈指针寄存器是一个东西)指向栈中最后使用的区域(译者注:也就是栈顶)。当数据入栈时,栈指针加1。当入栈操作发生,寄存器中的内容被存储到栈并且栈指针加1。在将寄存器们入栈时,我们必须使用它们在随机读写内存中的地址。举个例子,“PUSH 1”这条指令可以将寄存器R1中的内容入栈。

[出栈操作]

将栈中的内容放回原先对应的寄存器是入栈操作的反向操作。伴随着每一次出栈操作,栈顶的字节被复制到指令指定的寄存器,与此同时栈指针自减1一次。

三、关键字中英对照

microcontroller 微控制器
RAM 随机读写内存
bit-addressable 可位寻址
scratch pad 高速暂存区
register bank 寄存器组
stack pointer register 栈指针寄存器
Push 入栈
Pop 出栈
stack pointer 栈指针

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值