我们知道,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位型的寄存器变量。实具体情况而定吧.