[转电脑圈圈大作]32位的处理器,对8位的数运算,会比较累吗?

我们知道,8位机处理16位或者32位数据会比较累,那么32位处理器处理8位的数据,是否也会有同样的问题呢?
 
可能会累的.因为ARM是32位机,所以它在处理8位的数据时,需要进行一些屏蔽其它位的操作,所以比操作32位的要慢.

例如,你声明一个char型的变量c,它只有8bit,做一个自加操作,c++,那么编译的代码是先进行加1操作,然后再使用与操作,将高24位清0.以下是来自keil对ADuC7026 ARM7编译的结果:

    51:  unsigned long int i;
    52: 
    53:  unsigned char c; 
    54: 
0x000802AC  E92D4000  STMDB     R13!,{R14}
    55:  c++;
0x000802B0  E2833001  ADD       R3,R3,#0x00000001
0x000802B4  E20330FF  AND       R3,R3,#0x000000FF
    56:  i++;
0x000802B8  E2844001  ADD       R4,R4,#0x00000001
    57:  c--;
0x000802BC  E2433001  SUB       R3,R3,#0x00000001
0x000802C0  E20330FF  AND       R3,R3,#0x000000FF
    58:  i--;
0x000802C4  E2444001  SUB       R4,R4,#0x00000001

i是32位的,c是8位的,一看编译结果便知.

由于这个是临时变量,保存在寄存器中,所以需要这样的操作。如果是保存在内存中的变量,由于有LDRB(字节加载)和STRB(字节存储)指令,所以可以不用与操作.

    56:  c++;
0x000802B8  E59F02F8  LDR       R0,[PC,#0x02F8]
0x000802BC  E5D01000  LDRB      R1,[R0]
0x000802C0  E2811001  ADD       R1,R1,#0x00000001
0x000802C4  E5C01000  STRB      R1,[R0]
    57:  i++;
0x000802C8  E59F02EC  LDR       R0,[PC,#0x02EC]
0x000802CC  E5901000  LDR       R1,[R0]
0x000802D0  E2811001  ADD       R1,R1,#0x00000001
0x000802D4  E5801000  STR       R1,[R0]
    58:  c--;
0x000802D8  E59F02D8  LDR       R0,[PC,#0x02D8]
0x000802DC  E5D01000  LDRB      R1,[R0]
0x000802E0  E2411001  SUB       R1,R1,#0x00000001
0x000802E4  E5C01000  STRB      R1,[R0]
    59:  i--;
0x000802E8  E59F02CC  LDR       R0,[PC,#0x02CC]
0x000802EC  E5901000  LDR       R1,[R0]
0x000802F0  E2411001  SUB       R1,R1,#0x00000001
0x000802F4  E5801000  STR       R1,[R0]
 
由于有些编译器会把变量加载到寄存器中操作,特别是对于循环操作等,因此也会增加类似的与操作指令.所以,有时候为了加快速度,宁愿选用32bit型的数据,而不用其它类型的。
 
当然,为了节省空间,应尽量选用短的变量。而作为临时变量或者循环变量什么的,由于使用数量少,应尽量使用32位型的寄存器变量。实具体情况而定吧.

你可能感兴趣的:(c,存储,编译器)