原创 32位的处理器,对8位的数运算,会比较累吗?

2007-3-31 01:07 8136 11 10 分类: MCU/ 嵌入式
我们知道,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位型的寄存器变量。实具体情况而定吧.

 

                                                 (By Computer00 @2007-01-18)
PARTNER CONTENT

文章评论3条评论)

登录后参与讨论

用户1588142 2011-6-15 22:48

mark!

用户163120 2009-4-4 22:17

学习了

用户76171 2007-12-13 17:16

精辟!
相关推荐阅读
computer00 2013-06-05 16:27
[招聘]Android系统开发工程师
任职要求: 1. 扎实的C/C++基础,熟悉嵌入式Linux和Android操作系统的软件开发; 2. 良好的沟通能力和逻辑思维能力; 3. 良好的英文文献阅读能力; 4. 具备...
computer00 2013-06-04 09:26
[招聘]Android应用开发工程师
任职要求: 1. 具备扎实的面向对象编程思想和JAVA编程基础; 2. 熟悉Eclipse+ADT开发环境,熟练掌握Android基本类库; 3. 熟悉网络应用和多媒体应用开发; ...
computer00 2012-09-26 13:15
圈圈的新浪官方围脖
http://weibo.com/computer00  ...
computer00 2012-09-26 13:12
欢迎大家去收听圈圈弹的曲子
http://www.tudou.com/home/_105209016  ...
computer00 2009-06-29 15:07
《圈圈教你玩USB》勘误(更新日期2009 年06月29日)
《圈圈教你玩USB》勘误(更新日期2009 年06月29日)下载地址1:下载地址2: 勘误.pdf...
computer00 2009-06-25 11:23
一块磐正845GE主板PS2接口的修复
圈圈有一部台式机,某天开机时,发现键盘用不了了,停留在输入BIOS密码那里。主机自检通过,但是蜂鸣器却发出很微弱的、连续的声音,同时键盘的三个LED也没有出现象往常一样的闪烁一下。圈圈以为多日未用,积...
我要评论
3
11
关闭 站长推荐上一条 /3 下一条