在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通常在中断服务函数定义时使用,我们可以为不同的中断服务函数指定不同的寄存器组,这样可以减少堆栈操作,提高程序运行效率。