ARM分支指令地址如何工作?

时间:2018-12-27 11:19:48

标签: assembly arm

我知道一条ARM指令的大小为32位,因此在内存中占用4个存储单元(每个位置可以存储8位)

但是对于分支指令地址的工作方式感到困惑

使用时分支指令

4位用于操作 条件的4位 24位用于分支

为什么地址是4 * 24位? -我以为每个指令地址都是32位

24位数字是偏移量是什么意思?

3 个答案:

答案 0 :(得分:3)

摘自ARM7TDMI手册:

  

分支指令包含带符号的2的补码24位偏移量。这是左移   2位,符号扩展为32位,并添加到PC中。因此,该指令可以   指定+/- 32 MB的分支。

偏移量在这种情况下表示它相对于当前的smtp_listener

偏移量偏移2位(即乘以4)的原因是,每条指令都必须按字对齐,即指令必须位于4的倍数的地址上。两个最低有效位所有这样的地址始终为零。由于您知道它们始终为零,因此可以通过省略这两个最低有效位来在24位中存储26位偏移量。

答案 1 :(得分:1)

这样的一条分支指令只能从当前PC跳转+/- 2 ^ 25字节(跳转的26位,包括符号位,减去两个隐含的低阶零位,为24位)。

如果您想跳得更远,则必须使用例如

ldr r0,=DistantLabel
bx r0

答案 2 :(得分:0)

在ARM体系结构中,32位指令(对于大多数Thumb状态指令,则为16位)允许32位对指令类型和该指令使用的任何操作数进行编码。

在这32位中,有4位用于条件执行,剩下28位。 在其余的28位中,其中4位用于将指令分解为几组。这样就剩下24位,分配给指令行为的附加细分,寄存器选择或立即值(程序数据直接编码到指令操作码中)。

由于已经为前两个功能分配了8位,因此32位体系结构中可能的最大立即值是24位。如其他答案所述,相对分支指令将该24位字段定义为与当前位置的有符号偏移量。在16/32位的Thumb指令集中,在类似指令中可用的偏移量要小一些,但是在任何程序中,所有分支的很大一部分趋于变小仍然是事实(因此很少见)需要依靠核心寄存器来计算/保留分支地址)。

在64位体系结构中,存在相似的差异。尽管指令仍然只有32位,但是指令地址现在大于32位,因此可能存在更大的偏移分支。实际上,这些在单个程序中仍然不是很常见(但是当操作系统在一个程序与另一个程序之间切换上下文时可能会起作用-在这种情况下,特定地址将已经存储在数据存储器中,而不是存储在数据存储器中)。部分说明)。