为什么不使用 32 位 ARM 指令地址的 2 LSB

Has*_*ell 3 embedded arm memory-alignment instructions

我正在研究 ARM 指令体系结构,并且我读到指令是按字对齐存储的,因此指令地址的最低有效两位在 ARM 状态下始终为零。

Thumb 和 Thumb-2 指令的长度为 16 位或 32 位。指令以半字对齐方式存储,因此指令地址的最低有效位在 Thumb 状态下始终为零。

在我对 AVR 等不同微控制器的一些研究中,在访问程序存储器时,我使用最低有效位来区分要访问的高字节或低字节。但那是关于数据内存访问。

在 ARM 中,指令无论如何都是 32 位的,因此应该一次获取所有字节。

为什么那么,最后两位来获取指令的特定字节(在 Thumb 模式下为 1 位)并使用库。

PS:如果我要获取 4 字节长指令的单个字节,则需要 4 个周期,这是非常低效的,那么具有字节寻址能力的目的是什么,是因为新的 THUMB 类型指令是 16 位宽但仍占用 32 位空间?

Roo*_*nix 5

我认为您再次将指令访问与数据访问混合在一起。就数据访问而言,我们可以使用最后两位来获取 4 字节数据中的任何字节。

但是不使用最后两位的概念与访问 32 位指令的单个字节无关。正如您所说,一次访问一个字节进行指令访问是非常低效的,也是不允许的。因此,要强制执行此规则(在指令访问中不访问奇数边界的字节),将不考虑最后两位。下图将解释这一点:

地址为 32 位:

|--0x0000000 7 --|--0x0000000 6 --|--0x0000000 5 --|--0x0000000 4 --|

|--0x0000000 3 --|--0x0000000 2 --|--0x0000000 1 --|--0x0000000 0 --|

专注于最后一个 nible:

| 3-00 11 ; 2-00 10 ; 1-00 01 ; 0-00 00 ; |

| 7-01 11 ; 6-01 10 ; 5-01 01 ; 4-01 00 ; |

现在关注最后两个最低有效位。我们的目标是不允许指令从位置 1,2,3,5,6,7 开始。因此,如果您检查两个 LSB,它们就不能是 01、10、11 中的任何内容。仅允许“00”作为 2 个 LSB。现在因为它们是 00,所以当生成的地址是 4 的倍数时忽略它们一样好。

希望你能更好地想象。