我很难理解如何在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位。任何帮助将不胜感激。
答案 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位长。