处理器/DSP
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)
用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了,就是这么任性
全部0条评论
快来发表一下你的评论吧 !