工作寄存器有4組,每組都是8個工作寄存器R0~R7,通過PSW中的RS1、RS0兩位來選擇使用哪一組,如果不選,默認是選擇第0組。
RS1RS0組合為00時,選中第0組工作寄存器,R0~R7地址為00H~07H;
RS1RS0組合為01時,選中第1組工作寄存器,R0~R7地址為08H~0FH;
RS1RS0組合為10時,選中第2組工作寄存器,R0~R7地址為10H~17H;
RS1RS0組合為11時,選中第3組工作寄存器,R0~R7地址為18H~1FH。
類似arm的usr模式svc模式irq模式fiq模式,
psw.4 psw.3
0 0 0區(qū) r0-r7獨立
0 1 1區(qū) r0-r7獨立
1 0 2區(qū) r0-r7獨立
1 2 3區(qū) r0-r7獨立
上邊的每個區(qū)都由相同的名字r0-r7寄存器引用,但數(shù)據(jù)空間卻不同,所以各自獨立,
每組寄存器在物理上是獨立的,也就是說,一共有32個寄存器。上電后默認是第0組,但四組寄存器的功能、優(yōu)點完全相同。r0-r7支持豐富的尋址方式,可以大大提高運行效率。
所以,如果你有四個程序段(或者說線程)要交叉運行,都想使用到效率很高的r0-r7,就可以讓它們各占一組,只要切換區(qū)域就行了,而不必頻繁地保護現(xiàn)場。
尋址方式:
51單片機有7種尋址方式。
1、寄存器尋址:前面提到了內(nèi)部RAM中的00H-1FH地址單元作為工作寄存器使用。一共是有32各地址單元,分成四組,每組有8個寄存器,命名為R0-R7,每次可以使用其中的一組。當使用R0-R7來表示操作數(shù)時,就屬于寄存器尋址方式。
例如:MOV A,R0;把寄存器R0的內(nèi)容送入累加器A中
2、直接尋址:在指令中直接給出操作數(shù)地址,就屬于直接尋址方式。此時指令的操作數(shù)部分直接是操作數(shù)的地址。
例如:MOV A,2AH ;把RAM地址2AH的內(nèi)容送入累加器A中
3、立即尋址:
例如:MOV A,#3AH ;該指令就是表示把立即數(shù)3AH送入累加器A中,立即數(shù)前加上一個#,和直接尋址方式區(qū)分
4、寄存器間接尋址:若以寄存器的名稱直接給出操作數(shù)的地址,則稱為寄存器間接尋址。
例如:MOV A,@R0 ;該指令是把RO里的內(nèi)容作為地址,這個地址的數(shù)據(jù)送入累加器A,注意前面需要加@
5、變址尋址:變址尋址是以某個寄存器的內(nèi)容為基本的地址,然后在這個基址上加以地址的偏移量,才是真正的操作數(shù)地址。
例如:MOV A,@A+DPTR ;地址是A+DPTR的值,這個地址的內(nèi)容送如累加器A
6、相對尋址:相對轉(zhuǎn)移指令需要用到相對尋址方式,此時操作數(shù)部分給出的是地址的相對偏移量部分。
目的地址 = 源地址 + 指令字節(jié)數(shù) + rel(rel可正可負)
例如:SJMP rel
7、位尋址:概念就不做解釋了。還是把reg52.h這個頭文件貼出來說。