假设我要在MIPS中开发一个伪指令,在我将此跳过指令说成是之后,它会跳过下一条指令
skip $s0
。
我认为也许可以在$jr
上使用$s0
,但是我需要更改$s0
的地址。
我该如何解决这个问题?
答案 0 :(得分:2)
我想在MIPS中开发一种伪指令,以跳过下一条指令
更简单的方法是使用始终经过验证的“分支”。
beqc $0,$0,2
如果$ 0 == $ 0(即始终),将PC
替换为PC+(2*4)
,并跳过下一条指令。
这是一个经常用于处理if-then-else的技巧
if(a1)
a2=3;
else
a3=4;
beqc $a1, $0, else
addi $a2, $0, 3
beqc $0, $0, 2 ; go to end of if then else
else: addi $a3, $0, 4
# end of if-then else
beqc
是mips64-v6中引入的无延迟分支(以及许多其他零延迟时隙的分支/跳转)。
对于较旧版本的mips ISA,不可能跳过下一条指令,因为 all 分支将执行以下指令。跳过第二条下一条指令,想法是一样的。
beq $0,$0,2 ; delayed branch. execute next instruction and if test
; is true (ie always) go to pc+4+2*4
add $0, $0, $0 ; aka nop (because of the delay slot)
xxx $a1, $a2, $a3 ; this instruction will be skipped
yyy $t1, $t2, $t3 ; and this instruction will be executed