32位的ARM处理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位型的寄存器变量。视具体情况而定吧.
[align=right][color=#000066][此贴子已经被作者于2007-1-19 0:13:25编辑过][/color][/align]回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |