LEGv8指令集中分支和跳转的地址范围

小测验:
1.LEGv8中条件分支的地址范围多大(K=1024)?

答案: 分支前后大约1024K(即1M)的地址范围

2.LEGv8中跳转和跳转链接指令的地址范围(M=1024K)是多大?

答案:分支前后大约128M的地址范围

请读者自行计算一下以上两道题目,并且请带着这两个问题阅读下面的文字。

下面是正文。

LEGv8跳转指令(无条件分支指令)采用最简单的寻址方式,使用B型LEGv8指令格式,操作码为6位,其余为都是地址段。

B 10000 // go to location  10000(Decimal)

可以汇编成下面的格式(实际中更为复杂):

5 1000 0 t e n 10000_{ten} 10000ten
6位 26位

其中,跳转指令的操作码值为5,分支地址为 1000 0 t e n 10000_{ten} 10000ten

和跳转指令不同,条件分支指令除了分支地址之外还可以指定一个操作数。
因此:

CBNZ X19,Exit  //go to Exit if X19≠0

被汇编成下面的指令,其中只有19位用于指定分支地址:

181 Exit 19
8位 19位 5位

对于条件分支指令,这种格式叫作CB型。

如果程序的地址只能放在19位的字段中,这意味着没有程序能大于 2 19 2^{19} 219,这在今天来说实在太小,因此是一种很不现实的选择。

另一种方法是指定一个寄存器,该寄存器的值用于和分支地址的偏移量相加以得到最终地址,这样分支指令的地址可按下面的方式计算:
程 序 计 数 器 = 寄 存 器 内 容 + 分 支 地 址 偏 移 量 程序计数器=寄存器内容+分支地址偏移量 =+

这个求和结果允许程序的大小得到 2 64 2^{64} 264,并且仍能使用条件分支,从而解决了分支地址大小的问题。但随之而来的问题是,使用哪个寄存器?

答案取决于条件分支是如何使用的。 条件分支在循环和if语句中都可以找到,它们倾向于转向附近的指令。例如,在SPEC基准测试程序中,大概一半的条件分支转移范围都在16条指令以内。因为程序计数器(PC)包含当前指令的地址,所以如果我们使用PC作为计算地址的寄存器,就可转移到距当前指令 ± 2 18 ±2^{18} ±218个字(1个字=32位)的地方。 几乎所有的循环和if语句都远远小于 ± 2 18 ±2^{18} ±218个字,因此PC是一个理想的选择。这种分支地址的寻址方式称为PC相对寻址(PC-relative addressing).

PC相对寻址:一种寻址方式,将PC和指令中的常数相加作为地址。

像近期大多数计算机一样,LEGv8对所有条件分支使用PC相对寻址,因为这些指令的跳转目标一般都比较接近分支指令本身。 另一方面,分支和链接(branch-and-link)指令引发的过程则并不一定总是靠近调用者,所以通常使用其他寻址方式。 因此,LEGv8 体系结构通过对分支指令以及分支和链接指令采用B型指令格式,为过程调用提供长地址。

因为LEGv8的所有指令都是4字节长,所以将PC相对寻址的地址设计成字地址(1个字=32位)而不是字节地址,从而可以扩展分支转移的范围。 通过将字段解释成相对字地址而不是相对字节地址,19位的地址字段所指示的转移范围扩大了4倍:当前PC±1MB。同样,分支指令的26位字段 也是字地址,即表示28位字节地址。

这里的1MB是怎么算出来的呢? 19位地址提供 2 18 2^{18} 218种寻址方式,又因为是字地址,还需要乘以4倍(即 2 2 2^2 22)所以 寻址大小为 2 18 × 2 2 = 2 20 = 1 M B 2^{18}\times 2^2=2^{20} =1MB 218×22=220=1MB

无条件分支(即跳转指令)也采用PC相对寻址,这意味着转移范围是当前PC值±128MB。

这里的128MB是怎么算出来的呢? 26位地址提供 2 25 2^{25} 225种寻址方式,又因为是字地址,还需要乘以4倍(即 2 2 2^2 22)所以 寻址大小为 2 25 × 2 2 = 2 27 = 2 20 × 2 7 = 128 M B 2^{25}\times 2^2=2^{27}=2^{20} \times 2^7 =128MB 225×22=227=220×27=128MB

阅读《计算机组成与设计(ARM版)》的读书笔记。

你可能感兴趣的:(计算机组成原理)