微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM字节对齐问题详解

ARM字节对齐问题详解

时间:11-09 来源:互联网 点击:

变量定义成全局静态不在栈上

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,0x21590 ; = #0x1234567

[0xe1a05] movr0,r5

[0xeb0b0] bl __rt_uwrite4 //在此处调用一个写4byte的操作函数

[0xe5c10] 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] ldrr2,0x21594 ; = #0x87654321

[0xe5812] strr2,[r1,#0] */ //这样可以很清楚的看到非对齐访问是如何产生错误的 //以及如何消除非对齐访问带来问题 //也可以看到非对齐访问和对齐访问的指令差异导致效率问题 }

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top