寄存器变量定义

处理器/DSP

891人已加入

描述

寄存器变量定义

ARM汇编器对ARM的寄存器进行了预定义,所有的寄存器和协处理器名都是大小写敏感的。预定义的寄存器如下:

1,Ro-R15和r0-r15

2,a1-a4(参数,结果或者临时寄存器,与r0-r3同意)

3,v1-v8(变量寄存器,与r4-r11同意)

4,sb和SB(静态基址寄存器,与r9同意)

5,sl和SL(堆栈限制寄存器,与r10同意)

6,fp和FP(帧指针,与r11同意)

7,ip和IP(过程调用中间临时寄存器,与r12同意)

8,sp和SP(堆栈指针,与r13同意)

9,lr和LR(连接寄存器,与r14同意)

10,pc和PC(程序计数器,与r15同意)

11,cpsr和CPSR(程序状态寄存器)

12,spsr和SPSR(程序状态寄存器)

13,f0-f7和F0-F7(FPA寄存器)

14,s0-s31和S0-S31(VFP单精度寄存器)

15,d0-d15和D0-D15(VFP双精度寄存器)

16,p0-p15(协处理器0-15)

17,c0-c15(协处理器寄存器0-15)

C语言寄存器变量register

用register声明的变量是寄存器变量,是存放在CPU的寄存器里的。而我们平时声明的变量是存放在内存中的。虽说内存的速度已经很快了,不过跟寄存器比起来还是差得远。

寄存器变量和普通变量比起来速度上的差异很大,毕竟CPU的速度远远大于内存的速度。寄存器有这么两个特点,一个是运算速度快,一个是不能取地址。

学过C的都应该知道每一个变量在内存中都占有一定的的空间,来存放数据。但是在寄存器中的变量是不能取地址的,编译器会报错。

来我们看看寄存器变量和普通话的变量的速度到底能差多少。

这段代码运行用了0.952秒

这段代码运行用了0.094秒

实际使用时,底层硬件环境的实际情况对寄存器变量的使用会有一些限制。每个函数中只有很少的变量可以保存在寄存器中,且只允许某些类型的变量。但是,过量的寄存器声明并没有什么害处,这是因为编译器可以忽略过量的或者不支持的寄存器变量声明。另外,无论寄存器变量实际上是不是存放在寄存器中,它的地址都是不能访问的。在不同的机器中,对寄存器变量的数目和类型的具体限制也是不同的。

几条关于register变量应该知道的东西,如下:

1.寄存器变量可以用来优化加速c语言程序

2.声名只需在类型前多加register 即可,eg register int quick; (quick 就是一个整形的寄存器变量)

3.register只是一个建议型关键字,能不能声名成功还取决于编译器(建议型的关键字还有c++中的 inline),若不幸没有请求成功,则变量变成一个普通的自动变量。

4.是无法对一个register变量取地址的(因为寄存器变量多放在寄存器而非内存中,内存有地址,而寄存器是无地址的)

5.即便没有请求成寄存器变量,没有如愿的放入寄存器中,但是,依然不能对他取地址,因为他已经被声明为register了,就是这么任性

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分