Chinaunix首页 | 论坛 | 博客
  • 博客访问: 519799
  • 博文数量: 52
  • 博客积分: 1223
  • 博客等级: 少尉
  • 技术积分: 751
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-23 21:32
文章分类

全部博文(52)

文章存档

2016年(1)

2015年(5)

2013年(1)

2012年(45)

分类: 嵌入式

2015-05-13 11:33:01

1、首先只有访问半字或者一个字的指令才会产生地址对齐问题,如LDM、STM、LDRD和STRD指令,而LDR去操作一个字节就没有对齐的问题。

2、cpu层次所谓支持非对齐访问,主要是指当发生非对齐访问的时候产不产生异常,ARM11能配置,可以配置成发生非对齐访问不产生异常,ARM9不能配置,发生非对齐访问是直接产生异常。

3、编译器层次,编译器做的努力:
1、所有局部/全局/静态等变量都放在4字节对齐的地址上,包括结构体内部的填充。
2、会生成一些内部代码帮你完成非对齐操作,如__rt_uread4
3、对于一些局部变量,编译器会在代码段开辟一段数据区才存放数据(当然是对齐的了)如下:
    $d
        0x0000024e:    0000        ..      DCW    0
        0x00000250:    78563412    .4Vx    DCD    2018915346
        0x00000254:    cdbcab9a    ....    DCD    3451693978

说白了,对齐是为了效率,因为对齐只发生在LDRD这种取一个字(或者半个字)的指令上,如果不注重效率,完全可以用LDR替代LDRD一个字节一个字节的来操作。

阅读(3161) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~