使用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位.因此,您应该使用 本书中的一个示例代码来证明这一点.请注意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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |