为什么没有使用2个LSB的32位ARM指令地址

时间:2014-04-26 20:07:20

标签: embedded arm

我正在研究ARM指令架构,我已经读过,指令存储为字对齐,因此在ARM状态下,指令地址的最低有效两位总是为零。

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

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

在ARM中,指令总是32位,因此应该一次获取所有字节。

为什么然后,最后两位获取指令的特定字节(Thumb模式下为1位)并使用存储区。

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

3 个答案:

答案 0 :(得分:2)

在拇指之前,所有臂指令都是32位,4个字节,并且我们必须指示它们必须对齐,因此指令地址的低两位始终为零。然后拇指出现16位指令,因此地址的低位始终为零。他们增加了一个细微差别,当使用bx或blx切换模式时,lsbit用于区分拇指和手臂。如果输入到bx或blx时lsbit为零,则它保持在或保持在臂模式,如果它保持在1或切换到拇指模式。请注意,当放置在正在使用的PC中时,lsbit会从地址中剥离。在任一模式下运行时,pc lsbit始终为零,第一位在arm模式下始终为零。

arm总线通常是32或64位宽,它不是像x86等那样的可变字指令集,它现在是用thumb2但是,不完全相同。因此,您不是要提取单个字节,然后提取更多字节来隔离指令。 (并不是说现代可变长度指令集效率低下)。因此,一个臂可以在64位数据总线上一次获取8个指令,这将是4个时钟周期(一旦握手结束)。这当然是缓存,缓存与它相同或更多。每个核心/体系结构的提取都不同,内存控制器必须处理从任何通道上的一个字节到总线宽度的所有有效循环类型。

我不知道银行的意思?作为程序员,我们认为基于字节的地址作为字节是我们最小的可寻址项。当你到达实际的rams硬件时,人们开始剥离他们没有使用的地址位,因此他们的lsbit可能与我们的不同。当你写一个字节时,一些处理器总线不会将整个字节地址放在总线上,它们只能将字或双字地址放在总线上(2或3个lsbits为零),然后使用字节掩码来判断哪个字节通道包含新数据以及您必须在目标中保留的字节通道。

amba / axi总线周期在武器网站infocenter.arm.com的amba / axi总线文档中描述,它详细描述了每个事务的工作原理。根本不是很复杂......

答案 1 :(得分:2)

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

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

地址是32位:

  

| --0x0000000的 7 - | --0x0000000的 6 - | --0x0000000的 5 - | --0x0000000 <强> 4 - |

     

| --0x0000000 <强> 3 - | --0x0000000的 2 - | --0x0000000的 1 - | --0x0000000 <强> 0 - |

专注于最后的圣经:

  

| 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中的任何东西。 只有&#34; 00&#34;因为允许2 LSB。现在,因为它们是00,所以当生成的地址是4的倍数时,忽略它们就好了。

希望你能更好地想象。

答案 2 :(得分:0)

请注意,问题标题仅适用于几个特定的​​体系结构版本(ARMv3和ARMv4,在32位模式下) - 来自ARMv4T,分支地址的LSB用于ARM / Thumb交互操作,因为@dwelch具有指出。在v6M和v7M上,尝试切换指令集被忽略,并导致错误。

在v3之前,当地址空间仅为26位且没有专用CPSR时,r15的最后两位用于存储处理器模式(标志位于前6位) - 标志设置写入到r15会更新PC和PSR位。