MIPS JAL转换

时间:2014-09-22 14:06:08

标签: assembly mips mips32

我很难理解如何在MIPS中翻译JAL(J-Type)指令。这是我正在处理的指令集:

0x00400018          add  $a0, $a3, $0 = 00E02020
0x0040001C          jal  L2
0x00400020  L1:     jr   $ra
0x00400024  L2:     sw   $s1, 0($s2)
0x00400028          bne  $a0, $0, ELSE
0x0040002C          j    L1
0x00400030  ELSE:   addi $a0, $a0, A2 
0x00400034          j    L2

第一行没有出现问题,但对于第二行,我完全不确定如何翻译jal L2。使用MIPS reference sheet,我看到要获取地址,我需要执行R [31] = PC + 8; PC = JumpAddr。

J-Type指令是操作码/ 6位和地址26位,所以前6位是00 0011,但我不知道如何获得剩下的26位。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

我知道现在这完全无关紧要,但对于任何偶然发现这个问题并需要帮助的人来说:

你会得到L2的地址 - > 0x0040 0024 并削减前四位,最后两位。这会让你:

0000 0100 0000 0000 0000 0010 01 作为剩余的26位。

希望我能够帮助别人!

答案 1 :(得分:0)

MIPS有几个不同的控制流指令:
1.(有条件的)branch es
2.(无条件)立即 jump s 3.(无条件)注册 jump s

分支b包含相对于下一条指令的16位有符号整数指令,以分支到。

jump j / jump和link jal包含一个26位立即数,它被右移两位(因为所有MIPS(32)指令都是4个字节长)。高4位来自jump之后的指令。

跳转寄存器jr / jump和链接寄存器jalr不包含分支目标。目标位于寄存器中,因此已经是32位长。