51中的Rn到底是什么?
什么是Rn
学过微机原理的人都知道,在8086中,我们存放各种中间变量(操作数)的时候都会放到算术逻辑单元ALU的几个通用寄存器中,AL,BH等等。我们常常会从存储器或者IO口读数据写入这些通用寄存器中,然后进行运算,最后再从AL等往存储器或IO口输出。
51单片机的原理是一样的。在51单片机中,也通过这种CPU中的寄存器的方式来存储以及快速访问中间运算结果。在89C51中,CPU具有128个字节的RAM,最前面的32个字节可以用来做这种寄存器存放中间数。Rn就相当于AL,BH等.
为什么是32个?
51单片机自己为8位的单片机,因此大部分的寄s存器已然是8位的,包括Rn。我们可以看到,n的取值仅为0~7。
那么为什么Rn是32个呢?实际上,89C51中,RAM的分布如下所示:
可以看到,在RAM里面,工作寄存器区有4个,每一个含有8个字节(也就对应着R0~R7)。在程序中,可以通过更改程序状态寄存器PSW的D4和D3位,选择不同的工作寄存器区。若不选择,默认为第0组。
什么是Ri?为什么i只能为0或1?
Rn的n值可为0~7,其寻址方式为寄存器寻址,同微机原理中的AL等一样,首先将操作数取出来MOV到Rn中,然后进行相关运算,最好在MOV到想放置的位置.
相关指令:
MOV A,Rn ;(Rn)→A,n =0~7
但是这种方式有时速度较慢,而且需要两步操作不方便.为了解决这个问题,89C51将Rn的第0位和第1位设计为可用寄存器间接寻址.在使用时,将Rn中存入操作数的地址,间接寻址时即会自动跟踪到操作数的地址取出操作数,相关指令:
MOV A,@Ri ;i=0或1
由于这两位非常特殊也非常重要,因此用Ri特指这两位.
使用Rn与Ri的注意事项
- 如果使用Ri的间接寻址,指令中一定要加上@,以示区分.
- 在实际操作中,如果Rn的数量不够,就可以通过设置PSW的数字来更改工作寄存器组,扩展Rn的使用量.另外,更改工作寄存器组后,原工作寄存器组的数值不会变化.因此,如果巧妙运用工作寄存器组,具有保护数据的功能.