声明:
1、本翻译仅供个人学习使用,本人没有提供技术支持的义务,也不承担由此引发的任何后果。
2、请勿用于商业用途。
3、英文来自:http://www.keil.com/support/man/docs/c51/。
4、欢迎大家共同与我交流探讨(290207203@qq.com)。
NOAREGS Compiler Directive
| Abbreviation | NOAR |
| Arguments | None. |
| Default | AREGS |
| µVision | Options — C51 — Don't use absolute register accesses. |
| Description | The NOAREGS directive disables absolute register addressing for registers R0-R7. Functions compiled with NOAREGS are register bank independent and work in any register bank. This directive may be used for functions that are called from other functions using different register banks.
|
| See Also | |
| Example | The following is a source and code listing which uses both NOAREGS and AREGS. stmt level source
1 extern char func ();
2 char k;
3
4 #pragma NOAREGS
5 noaregfunc () {
6 1 k = func () + func ();
7 1 }
8
9 #pragma AREGS
10 aregfunc () {
11 1 k = func () + func ();
12 1 }
; FUNCTION noaregfunc (BEGIN)
; SOURCE LINE # 6
0000 120000 E LCALL func
0003 EF MOV A,R7
0004 C0E0 PUSH ACC
0006 120000 E LCALL func
0009 D0E0 POP ACC
000B 2F ADD A,R7
000C F500 R MOV k,A
; SOURCE LINE # 7
000E 22 RET
; FUNCTION noaregfunc (END)
; FUNCTION aregfunc (BEGIN)
; SOURCE LINE # 11
0000 120000 E LCALL func
0003 C007 PUSH AR7
0005 120000 E LCALL func
0008 D0E0 POP ACC
000A 2F ADD A,R7
000B F500 R MOV k,A
; SOURCE LINE # 12
000D 22 RET
; FUNCTION aregfunc (END)
Note the different methods of saving R7 on the stack. The code generated for the function noaregfunc is: MOV A,R7 PUSH ACC While the code for the aregfunc function is: PUSH AR7 |
NOAREGS 编译器伪指令
| 缩写 | NOAR |
| 参数 | 无。 |
| 缺省 | AREGS |
| µVision | Options — C51 — Don't use absolute register accesses. |
| 描述 | NOAREGS 伪指令对寄存器R0-R7禁止绝对寄存器寻址。用NOAREGS 编译的函数与寄存器分组独立,可以工作在任意寄存器组。当使用其他寄存器组的函数调用当前函数时,这个伪指令很有用。
|
| 参考 | |
| 示例 | 下面是使用 NOAREGS 和 AREGS源代码和列表文件。 stmt level source
1 extern char func ();
2 char k;
3
4 #pragma NOAREGS
5 noaregfunc () {
6 1 k = func () + func ();
7 1 }
8
9 #pragma AREGS
10 aregfunc () {
11 1 k = func () + func ();
12 1 }
; FUNCTION noaregfunc (BEGIN)
; SOURCE LINE # 6
0000 120000 E LCALL func
0003 EF MOV A,R7
0004 C0E0 PUSH ACC
0006 120000 E LCALL func
0009 D0E0 POP ACC
000B 2F ADD A,R7
000C F500 R MOV k,A
; SOURCE LINE # 7
000E 22 RET
; FUNCTION noaregfunc (END)
; FUNCTION aregfunc (BEGIN)
; SOURCE LINE # 11
0000 120000 E LCALL func
0003 C007 PUSH AR7
0005 120000 E LCALL func
0008 D0E0 POP ACC
000A 2F ADD A,R7
000B F500 R MOV k,A
; SOURCE LINE # 12
000D 22 RET
; FUNCTION aregfunc (END)
注意在栈中保存 R7 的不同方法。函数 noaregfunc 生成的代码是: MOV A,R7 PUSH ACC 而 aregfunc 函数生成的代码是: PUSH AR7 |
本文介绍了Keil C51编译器中的NOAREGS伪指令,该指令用于禁用R0-R7寄存器的绝对寻址,使得函数能够在不同的寄存器组间独立运行。文章通过对比NOAREGS与AREGS两种情况下的代码生成,展示了不同寄存器访问方式的具体实现。
Note
Related Knowledgebase Articles
1826

被折叠的 条评论
为什么被折叠?



