最近工作关系,要重新了解一下风靡了数十年的8051芯片代码,其中涉及到了Rx和ARx。对于ARx这个概念还是头次接触,真是一头雾水,翻遍百度与谷歌竟然无法找到一个Rx和ARx比较清晰明了的说明,难道8051就被这样无情的淘汰了?让俺是倍感失望,唉声叹气之余只得自力更生,重新翻了下相关手册,又写了些测试代码,算是搞明白这两种寄存器的大概意思,共享出来,希望51单片机的相关工作人员从中受益。
8051的寄存器存储在ram中最底端的128个字节中。其中地址0-31存储4组R0-R7通用寄存器。默认为第一组,可以通过psw标志寄存器中的3,4位进行配置使用其它三组寄存器。同样的道理,通过using n,n可以是0-3来选择使用哪一组ARx寄存器。
第二轮我们做相反的测试,通过配置psw的3,4位,来选择Rx为bank0-bank4,而用using 0固定使ARx在bank0上。这回四次测试的结果也相反,R0的 变化为绿色,而AR0的变化四次都在地址0上。如下所示:
整个代码如下:
$NOMOD51
NAME test
codefunction1 segment code
public testfunction
rseg codefunction1
using 0
testfunction:
mov r0,#1
mov r0,#2
mov ar0, #1
mov ar0, #2
mov r0,#2
mov ar0, #1
mov ar0, #2
mov r0,#1
mov r0,#2
mov ar0, #1
mov ar0, #2
mov r0,#1
mov r0,#2
mov ar0, #1
mov ar0, #2
;change R0 from bank0 to bank3,but let AR0 stay bank0
using 0
clr psw.3
mov r0,#1
mov r0,#2
mov ar0, #1
mov ar0, #2
clr psw.4
setb psw.3
mov r0,#2
mov ar0, #1
mov ar0, #2
setb psw.4
clr psw.3
mov r0,#2
mov ar0, #1
mov ar0, #2
setb psw.4
setb psw.3
mov r0,#2
mov ar0, #1
mov ar0, #2
ret
end
最后总结一下:
对于Rx,ARx的理解,不要只是局限在手册上的当前地址和绝对地址什么的概念。只要把它们理解成指向芯片中低端ram区的指针就好。而移动这个指针的方法呢,Rx是通过修改psw的3,4位,ARx是通过使用using 0汇编指令。
8051的寄存器存储在ram中最底端的128个字节中。其中地址0-31存储4组R0-R7通用寄存器。默认为第一组,可以通过psw标志寄存器中的3,4位进行配置使用其它三组寄存器。同样的道理,通过using n,n可以是0-3来选择使用哪一组ARx寄存器。
而对于我们使用者来说
不论是Rx还是ARx都只不过是个符号而已,最后通过编译器会实际指向到芯片中ram区域中的某一个地址的。现在是不是觉得看的这些枯燥描述像文字游戏感觉有些晕有些累。那好吧,让咱们来做个测试程序并用图示来进一步形象的说明它吧。我们先通过using 0-3来改变ARx寄存器的地址,然后改变AR0的值为1和2。而对于Rx则只让它留在bank0,但我们每次还是修改R0的值为1和2,和AR0一样。结果如何呢,像下图一样绿色的部分为AR0四次的变化情况,而R0四次变化的情况则始终在地址0上。第二轮我们做相反的测试,通过配置psw的3,4位,来选择Rx为bank0-bank4,而用using 0固定使ARx在bank0上。这回四次测试的结果也相反,R0的 变化为绿色,而AR0的变化四次都在地址0上。如下所示:
整个代码如下:
$NOMOD51
NAME test
codefunction1 segment code
public testfunction
rseg codefunction1
using 0
testfunction:
;change AR0 from bank0 to bank3,but let R0 stay bank0
;更改ARx为第一组寄存器
mov r0,#1
mov r0,#2
mov ar0, #1
mov ar0, #2
;更改ARx为第二组寄存器
using 1
mov r0,#1mov r0,#2
mov ar0, #1
mov ar0, #2
;更改ARx为第三组寄存器
mov r0,#1
mov r0,#2
mov ar0, #1
mov ar0, #2
;更改ARx为第四组寄存器
mov r0,#1
mov r0,#2
mov ar0, #1
mov ar0, #2
;change R0 from bank0 to bank3,but let AR0 stay bank0
using 0
;更改Rx为第一组寄存器
clr psw.3
mov r0,#1
mov r0,#2
mov ar0, #1
mov ar0, #2
clr psw.4
setb psw.3
;更改Rx为第二组寄存器
mov r0,#2
mov ar0, #1
mov ar0, #2
setb psw.4
clr psw.3
;更改Rx为第三组寄存器
mov r0,#2
mov ar0, #1
mov ar0, #2
setb psw.4
setb psw.3
;更改Rx为第四组寄存器
mov r0,#2
mov ar0, #1
mov ar0, #2
ret
end
最后总结一下:
对于Rx,ARx的理解,不要只是局限在手册上的当前地址和绝对地址什么的概念。只要把它们理解成指向芯片中低端ram区的指针就好。而移动这个指针的方法呢,Rx是通过修改psw的3,4位,ARx是通过使用using 0汇编指令。