ARM 芯片的
指令长度可以是32位(ARM状态下),也可以是16位(Thumb状态下)。
ARM 芯片支持以字节(8位)、半字(16位)、字(32位)的
数据宽度对存储器及外部设备的访问。其中字数据需要按4字节对齐(
地址的最底两位为0),半字数据需要按2字节对齐(
地址的最底位为0)。
以上内容摘自《ARM应用系统开发详解》第二版 第18页。
如何理解红色标记的两句话?
内存地址的编号是以字节为单位的,假设字长是32位,第一个字节到第十个字节的内存编号:
0b0000 0000 0000 0000 0000 0000 0000 0000
<--
第1个字节
0b0000 0000 0000 0000 0000 0000 0000 0001
<--
第2个字节
0b0000 0000 0000 0000 0000 0000 0000 0010
<--
第3个字节
0b0000 0000 0000 0000 0000 0000 0000 0011
<--
第4个字节
0b0000 0000 0000 0000 0000 0000 0000 0100
<--
第5个字节
0b0000 0000 0000 0000 0000 0000 0000 0101
<--
第6个字节
0b0000 0000 0000 0000 0000 0000 0000 0110
<--
第7个字节
0b0000 0000 0000 0000 0000 0000 0000 0111
<--
第8个字节
0b0000 0000 0000 0000 0000 0000 0000 1000
<--
第9个字节
0b0000 0000 0000 0000 0000 0000 0000 1001
<--
第10个字节
0b0000 0000 0000 0000 0000 0000 0000 1010
<--
第11个字节
0b0000 0000 0000 0000 0000 0000 0000 1011
<--
第12个字节
0b0000 0000 0000 0000 0000 0000 0000 1100
<--
第13个字节
[感谢 @gongyuena 的提醒,表示二进制位应该用0b而不是0x,已经修改过来。2012-06-07]
半字数据需要按2字节对齐,就是说每个数据至少要占用2个字节,那么数据的起始地址编号就应该是偶数,如第1字节,第3字节,第13字节。所有这些地址的最低位都是0。
而字数据需要按4字节对齐,就是说每个数据至少要占用4个字节,那么数据的起始地址编号就应该是4的整数倍,如第1字节,第5字节,第13字节。所有这些地址的最低两位都是0。
注意不要混淆 指令长度和 数据宽度两个概念。