我正在研究ARM指令体系结构,并且已经阅读到指令以字对齐方式存储,因此指令地址的最低有效两位在ARM状态下始终为零。
Thumb和Thumb-2指令的长度为16或32位。指令以半字对齐方式存储,因此在Thumb状态下,指令地址的最低有效位始终为零。
在我对诸如AVR之类的不同微控制器的一些研究中,我在访问程序存储器时使用最低有效位来区分要访问的高字节还是低字节。但这是关于数据存储器访问的。
在ARM中,指令始终为32位,因此应立即获取所有字节。
为什么然后使用最后两位来提取指令的特定字节(在Thumb模式下为1位)并使用存储体。
PS:如果我要获取一个4字节长指令的单个字节,则将花费4个周期,这是非常低效的,因此具有字节寻址能力的目的是什么,是否是因为新的16位THUMB类型指令宽,但仍占据32位空间?
最佳答案
我认为您再次将指令访问与数据访问混合在一起。就数据访问而言,我们可以使用后两位来获取4字节数据中的任何字节。
但是不使用最后两位的概念与访问32位指令的单个字节无关。如您所说,一次访问一个字节的指令访问效率非常低,同样也不被允许。因此,为了执行此规则(在指令访问中不访问奇数边界的字节),将不考虑最后两位。下图将对此进行解释:
地址是32位:
| --0x00000007-- | --0x00000006-- | --0x00000005-- | --0x00000004-- |
| --0x00000003-- | --0x00000002-- | --0x00000001-- | --0x00000000-- |
专注于最后一个圣经:
| 3-0011; 2-0010; 1-0001; 0-0000; |
| 7-0111; 6-0110; 5-0101; 4-0100; |
现在关注最后两个最低有效位。
我们的目标是不允许指令从位置1,2,3,5,6,7开始
因此,如果您检查两个LSB,则它们在01、10、11中不能为任何值。
只允许“ 00”作为2个LSB。现在由于它们是00,所以当生成的地址是4的倍数时,忽略它们就好了。
希望您可以更好地可视化。