加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用Int(32位)over char(8位)来“帮助”处理器

发布时间:2020-12-16 09:54:49 所属栏目:百科 来源:网络整理
导读:在C中,我们经常使用char来表示小数字.但是,处理器始终使用Int(或32位)值来读取(或取自)寄存器.因此,每次我们需要在程序处理器中使用char或8位时,需要从regsiter中获取32位并从中解析出8位. 因此,如果内存不是限制,更常使用Int代替char是否有意义? 它会“帮
在C中,我们经常使用char来表示小数字.但是,处理器始终使用Int(或32位)值来读取(或取自)寄存器.因此,每次我们需要在程序处理器中使用char或8位时,需要从regsiter中获取32位并从中解析出8位.
因此,如果内存不是限制,更常使用Int代替char是否有意义?
它会“帮助”处理器吗?

解决方法

来自ARM系统开发人员指南

“大多数ARM数据处理操作仅为32位.因此,您应该使用
尽可能为局部变量使用32位数据类型int或long.避免使用char和
简称为局部变量类型,即使您正在操作8位或16位值“

本书中的一个示例代码来证明这一点.请注意char的回绕处理而不是unsigned int.

int checksum_v1(int *data)
{
char i;
int sum = 0;
for (i = 0; i < 64; i++)
{
sum += data[i];
}
return sum;
}

使用i作为char时的ARM7程序集

checksum_v1
MOV r2,r0 ; r2 = data
MOV r0,#0 ; sum = 0
MOV r1,#0 ; i = 0
checksum_v1_loop
LDR r3,[r2,r1,LSL #2] ; r3 = data[i]
ADD r1,#1 ; r1 = i+1
AND r1,#0xff ; i = (char)r1
CMP r1,#0x40 ; compare i,64
ADD r0,r3,r0 ; sum += r3
BCC checksum_v1_loop ; if (i<64) loop
MOV pc,r14 ; return sum

当我是unsigned int时ARM7程序集.

checksum_v2
MOV r2,#0 ; i = 0
checksum_v2_loop
LDR r3,#1 ; r1++
CMP r1,r0 ; sum += r3
BCC checksum_v2_loop ; if (i<64) goto loop
MOV pc,r14 ; return sum

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读