如何计算MIPS分支指令的最大单跳范围



我正在研究计算机体系结构(MIPS架构(并阅读以下语句:

1.分支指令具有16位签名的单词偏移字段,该字段允许分支到达地址 或-128kbytes( 0x1fffc至-0x20000(。

2.a跳转指令指定了当前256mbyte(0x0ffffffc(区域中的地址,该区域由程序计数器指定最重要的4位。

我了解上述跳跃范围的概念,但是如何使用" 256mbyte"one_answers" -128 kbytes"范围计算出三个数字0x0fffffc,0x1fffc和0x20000?

谢谢!

其他答案并没有真正回答您如何计算/发现这些十六进制值的问题。所以这是我的答案。

在二进制中考虑这一点要比十六进制要容易得多。由于2位左移动对于理解概念很重要2bits乘以4。在十六进制中不能很好地表示,因为简单的十六进制数字是16个值。但是,请尝试解释一下:

0x20000

1个分支指令使用16位即时字段。(5位RS,RT((6位OpCode(== 32bits(https://en.wikibooks.org/wiki/mips_assembly/instruction_formats#i_format(

签署了这16位。他们可以是积极的&负。

为您提供有效的-(2^15) == -32768

+(2^15 -1) == 32767

mips将任何地址输入乘以4。强迫它们被对齐。

因此,您的最小值 -(2^15)乘以4: -{2^15 *4} (4=2^2), {2^(15+2)} (15+2 == 17) :变成-(2^17) == -131072

在二进制中(签名2的补充(。 1000 0000 0000 0000 <<2 == 10 0000 0000 0000 00[00]

将其转换为HEX 10=2 (0000=0) gives 2 0 0 0 0 == 0x20000

在将其添加到(PC 4(之前,这将是扩展的:

so for say, instruction #32770, PC=0x00420008 (PC+4)=0x0042 000C

0x0042000C - 0x20000 = 0x0040000C, instruction #3(请记住,偏移基于PC 4(

32770 1 -32768 == 3

0x1fffc

最大值相同: (2^15 -1)乘以4: {(2^15 -1) *4} (4=2^2), {2^(15+2) -(1*4)} (15+2 == 17)

变为(2^17 -4) == 131068 0111 1111 1111 1111 <<2 == 01 1111 1111 1111 11[00]

将其转换为HEX 01=1 (1111=F) (1100=C) gives 1 F F F C == 0x1fffc

注意,需要将地址添加到当前(程序计数器 4(

so for say, instruction #32770, PC=0x00420008 (PC+4)=0x0042000C

0x0042000C + 0x1FFFC= 0x440008, instruction #65538(请记住,偏移基于PC 4(

32770 1 32767 == 65538

0x0ffffffc

2现在跳跃使用28位地址。
另请注意,跳跃使用绝对地址。没有偏移。

最多28位值是(2^26 -1(== 67108863,0x03ffffff``

移动2(*4(变为28bits。{(2^26 -1) *4}, == {2^28 -4} == 268435452,0x0ffffffc

但是缺少四个位?..它们来自PC-在内存阶段,它已经将其增加到(PC 4(

指令#32770,PC = 0x00420008(PC 4(= 0x0042000C 0x0042000C in binary is [0000] 0000 0100 0010 0000 0000 0000 1100

+0x0FFFFFFC in binary [####] 1111 1111 1111 1111 1111 1111 1100它只有28(27:0(,缺少31:28位。

从PC 4中拿出位。我们得到:

 0000 ---- ---- ---- ---- ---- ---- ---- (PC+4)
 ---- 1111 1111 1111 1111 1111 1111 1100 (Target-Address)
-----------------------------------------
 0000 1111 1111 1111 1111 1111 1111 1100 (Jump-Address)

(在这种情况下,该值与扩展的符号相同(

更好地解释了如何计算地址。如何计算跳跃目标地址和分支目标地址?

为什么不问测试和调试工具链,然后将其与文档进行比较?

so.s

four:
nop
nop
nop
j one
nop
j two
nop
j three
nop
j four
nop
nop
nop
nop
nop
one:
nop
two:
nop
nop
three:
nop

构建和拆卸

mips-elf-as so.s -o so.o
mips-elf-objdump -D so.o
so.o:     file format elf32-bigmips

Disassembly of section .text:
00000000 <four>:
    ...
   8:   0800000f    j   3c <one>
   c:   00000000    nop
  10:   08000010    j   40 <two>
  14:   00000000    nop
  18:   08000012    j   48 <three>
  1c:   00000000    nop
  20:   08000000    j   0 <four>
  24:   00000000    nop
    ...
0000003c <one>:
  3c:   00000000    nop
00000040 <two>:
    ...
00000048 <three>:
  48:   00000000    nop

链接到某些地址并拆卸

00001000 <_ftext>:
    ...
    1008:   0800040f    j   103c <one>
    100c:   00000000    nop
    1010:   08000410    j   1040 <two>
    1014:   00000000    nop
    1018:   08000412    j   1048 <three>
    101c:   00000000    nop
    1020:   08000400    j   1000 <_ftext>
    1024:   00000000    nop
    ...
0000103c <one>:
    103c:   00000000    nop
00001040 <two>:
    ...
00001048 <three>:
    1048:   00000000    nop

所以跳跃超级容易,该分支呢?

four:
nop
nop
nop
beq $10,$11,one
nop
beq $10,$11,four
nop
nop
nop
one:
nop

组装并拆卸

00000000 <four>:
    ...
   8:   114b0006    beq $10,$11,24 <one>
   c:   00000000    nop
  10:   114bfffb    beq $10,$11,0 <four>
  14:   00000000    nop
    ...
00000024 <one>:
  24:   00000000    nop

一些经验在这里有所帮助,首先向前推进0x24-0x8 = 0x1c。这些是固定的32位说明,因此他们不太可能需要浪费两个位并切割范围,因此0x1c>> 2 = 7。编码具有6。递增或另一种查看此问题的方法是前方的6( 1(指令。0xc,0x10,0x14,0x18,0x1c,0x20,0x24。所以这意味着向后往后(0x00-(0x10 4((>> 2 =(0x00-0x14(>> 2 = 0xffff ... ffffec>> 2 = 0xff ... fffb肯定这就是我们得到的。

因此,对于分支机构

((destination - (current address + 4))/4)&0xFFFF = 
(((destination - current address)/4) + 1)&0xFFFF

为了立即跳跃= {PC [31:28],目标[28:2]}

您应该能够从这些信息中找出范围。

编码的关键是指令固定在32位,并在32位边界上对齐,因此两个LSBIT始终是零与与之相关的数学一致的零,那么为什么将范围降低4个以存储零呢?您没有,有效地将偏移量打包到了即时。某些(固定的长度(指令集没有这样做,但通常有理由不作为设计的一部分。

通常,如果您可以访问一个调试的汇编程序,则将提供比指令集参考更多的有用信息,这是基于经验学习许多指令集的经验。如果您是第一个为某种处理器编写汇编程序的人,那么这意味着您在那里工作或直接访问处理器的设计人员,您可以简单地询问他们的数学,而不是依靠尚未书面的手册,将芯片胶带胶带后写,这为时已晚,因为您/他们需要汇编器来验证设计。因此,有关指令编码的电子邮件,SKYPE和最重要的白板讨论。您可能还可以访问芯片源代码和/或模拟器,因此您可以运行代码,在SIM中看到它执行(检查波形(,然后查看其分支到达的位置(获取位置(,更改即时,查看,查看在哪里获取。

基本上,您通常应该始终可以访问带有答案的资源,以帮助解释手册缺乏一些细节。当然,有时您会得到一本好手册...(并且您仍然应该通过资源来验证这一点(。

最新更新