在8051系列單片機中,內部ram的前32個字節被分爲4組,每組8個寄存器。每組的8個寄存器名字都爲R0-R7。通過設置PSW寄存器的兩個位,可以選擇使用4組寄存器中的哪一組。
寄存器組在處理中斷或者使用實時操作系統時非常有用,可以在進入中斷或者切換任務時使用不同寄存器組,而不用把8個寄存器的內容保存到堆棧。在退出中斷或返回原任務時,只需切換回原來的寄存器組即可。
指定一個函數使用的寄存器組:
void rb_function (void) using 3 { . . . }using後跟數字0-3,不允許使用符號表達式指定代替該數字常量。只有定義函數時纔可使用using關鍵詞,在做函數原型聲明時不允許使用using關鍵詞。
using聲明的函數具有以下特徵:
1)函數入口處,當前使用的寄存器組被保存到堆棧;
2)指定的寄存器組被設置;
3)函數退出前,原來的寄存器組被恢復;
下面展示了using的用法,請注意生成的彙編程序中函數入口、出口處的代碼:
C程序:
1
2 extern bit alarm;
3 int alarm_count;
4 extern void alfunc (bit b0);
5
6 void falarm (void) using 3 {
7 1 alarm_count++;
8 1 alfunc (alarm = 1);
9 1 }
生成的彙編程序:
0000 C0D0 PUSH PSW /* 函數入口處,將原來的寄存器組保存到堆棧 */
0002 75D018 MOV PSW,#018H /* 切換到新的寄存器組 */
0005 0500 R INC alarm_count+01H 0007 E500 R MOV A,alarm_count+01H 0009 7002 JNZ ?C0002 000B 0500 R INC alarm_count 000D ?C0002: 000D D3 SETB C 000E 9200 E MOV alarm,C 0010 9200 E MOV ?alfunc?BIT,C 0012 120000 E LCALL alfunc
0015 D0D0 POP PSW /* 函數退出前,切換到原來的寄存器組 */ 0017 22 RET返回值保存在寄存器中的函數不能使用using。
即使使用相同的寄存器組,使用using的函數也不能返回bit類型的值。
using通常在中斷服務函數定義時使用,我們可以爲不同的中斷服務函數指定不同的寄存器組,這樣可以減少堆棧操作,提高程序運行效率。