您的位置 首页 产品

ARM下的对齐处理

fromDUI0067D_ADS1_2_CompLib3.13typequlifiers有部分摘自ARM编译器文档对齐部分对齐的使用:1.__align(num)这个用于修改最高级别对…

from DUI0067D_ADS1_2_CompLib

3.13 type qulifiers

有部分摘自ARM编译器文档对齐部分

对齐的运用:
1.__align(num)
这个用于修正第一流别目标的字节鸿沟。在汇编中运用LDRD或许STRD时
就要用到此指令__align(8)进行润饰约束。来确保数据目标是相应对齐。
这个润饰目标的指令最大是8个字节约束,能够让2字节的目标进行4字节
对齐,可是不能让4字节的目标2字节对齐。
__align是存储类修正,他只润饰第一流类型目标不能用于结构或许函数目标。

2.__packed
__packed是进行一字节对齐
1.不能对packed的目标进行对齐
2.一切目标的读写拜访都进行非对齐拜访
3.float及包括float的结构联合及未用__packed的目标将不能字节对齐
4.__packed对部分整形变量无影响
5.强制由unpacked目标向packed目标转化是未界说,整形指针能够合法定
义为packed。
__packed int* p; //__packed int 则没有意义
6.对齐或非对齐读写拜访带来问题
__packed struct STRUCT_TEST
{
char a;
int b;
char c;
} ; //界说如下结构此刻b的开始地址一定是不对齐的
//在栈中拜访b可能有问题,由于栈上数据肯定是对齐拜访[from CL]
//将下面变量界说成大局静态不在栈上
static char* p;
static struct STRUCT_TEST a;
void Main()
{
__packed int* q;//此刻界说成__packed来润饰当时q指向为非对齐的数据地址下面的拜访则能够

p = (char*)&a;
q = (int*)(p+1);

*q = 0x87654321;
/*
得到赋值的汇编指令很清楚
ldr r5,0x20001590 ; = #0x12345678
[0xe1a00005] mov r0,r5
[0xeb0000b0] bl __rt_uwrite4//在此处调用一个写4byte的操作函数

[0xe5c10000] strb r0,[r1,#0]//函数进行4次strb操作然后回来确保了数据正确的拜访
[0xe1a02420] mov r2,r0,lsr #8
[0xe5c12001] strb r2,[r1,#1]
[0xe1a02820] mov r2,r0,lsr #16
[0xe5c12002] strb r2,[r1,#2]
[0xe1a02c20] mov r2,r0,lsr #24
[0xe5c12003] strb r2,[r1,#3]
[0xe1a0f00e] mov pc,r14
*/

/*
假如q没有加__packed润饰则汇编出来指令是这样直接会导致奇地址处拜访失利
[0xe59f2018] ldr r2,0x20001594 ; = #0x87654321
[0xe5812000] str r2,[r1,#0]
*/

//这样能够很清楚的看到非对齐拜访是怎么发生过错的
//以及怎么消除非对齐拜访带来问题
//也能够看到非对齐拜访和对齐拜访的指令差异导致功率问题
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/chanpin/276663.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部