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电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】接线错误导致测试数据异常被打赏40分 | |
stm32f103驱动舵机被打赏20分 | |
汽车+汽车电子电阻解释与分析被打赏5分 | |
STM32F103的I2C驱动OLED动态显示被打赏30分 | |
分享汽车通信和多媒体总线结构被打赏20分 | |
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
NUCLEO-U083RC学习历程38+串口通过队列的方式输出两个字符串被打赏20分 | |
【我踩过的那些坑】分享一下调试一款AD芯片的遇到的“坑”被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 |