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一个字节一个字节的来操作。
阅读(3167) | 评论(0) | 转发(0) |