跳过mips32中的下一条指令

时间:2019-02-16 09:52:12

标签: assembly mips

假设我要在MIPS中开发一个伪指令,在我将此跳过指令说成是之后,它会跳过下一条指令 skip $s0

我认为也许可以在$jr上使用$s0,但是我需要更改$s0的地址。

我该如何解决这个问题?

1 个答案:

答案 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