高级会员

- 积分
- 862
- 金钱
- 862
- 注册时间
- 2015-2-12
- 在线时间
- 354 小时
|
发表于 2017-11-22 15:46:56
|
显示全部楼层
百度如下说:
四、ARM平台的对齐问题
在ARM中,有ARM和Thumb两种指令。
ARM指令:每执行一条指令,PC的值加4个字节(32bits).一次访问4字节内容,该字节的起始地址必须是4字节对齐的位置上,即地址的低两位为bits[0b00],也就是说地址必须是4的倍数。
Thumb指令:每执行一条指令,PC的值加2个字节(16bits).).一次访问2字节内容,该字节的起始地址必须是2字节对齐的位置上,即地址的低两位为bits[0b0],也就是说地址必须是2的倍数。
遵循以上方式叫对齐(aligned)方式,不遵守这样方式称为非对齐(unaligned)的存储访问操作。
五、ARM平台字节对齐关键字
1. __align(num)
用于修改最高级别对象的字节边界。
A、在汇编中使用LDRD或者STRD时,就用到此命令__align(8)进行修饰限制。来保证数据对象是相应对齐。
B、该修饰对象的命令最大是8个字节限制,可让2字节的对象进行4字节
对齐,但是不能让4字节的对象2字节对齐。
C、 __align是存储类修改,他只修饰最高级类型对象不能用于结构或者函数对象。
2. __packed
__packed是进行一字节对齐。
A、不能对packed的对象进行对齐;
B、所有对象的读写访问都进行非对齐访问;
C、float及包含float的结构联合及未用__packed的对象将不能字节对齐;
D、__packed对局部整形变量无影响;
D、强制由unpacked对象向packed对象转化是未定义,整形指针可以合法定
义为packed __packed int* p; //__packed int 则没有意义。
3. __unaligned
用于修饰该变量可按照非对齐访问。
尝试着回答你的问题:
1、是。无论ARM和Thumb两种指令,你的数据结构长度符合4或2的倍数。
2、因第1条原因,故你的设置_align(12),同样不会产生对齐问题,与1结果一样。
欢迎批评指正!! |
|