19

给定两个寄存器$s0, $s1,我如何仅使用slt(set on less than) and beqand bne(branch if equal, branch if not equal) 指令将以下伪代码转换为 MIPS 汇编语言。

   if ($s0 > $s1) { goto label1 }
   if ($s0 >= $s1) { goto label2 }
   if ($s0 <= $s1) { go to label3 }
4

2 回答 2

37

我假设伪代码是按顺序执行的,所以早期的条件为真意味着你去那里并且永远不会到达后面的if语句。这使得最后一个分支保证在到达时被采用,所以它甚至不需要是有条件的。(同时假设这是一个没有分支延迟槽的 MIPS。)

slt  $t1,$s1,$s0      # checks if $s0 > $s1
bne  $t1,$zero,label1 # if $s0 >  $s1, goes to label1
beq  $s1,$s2,label2   # if $s0 == $s2, goes to label2 
# beq  $t1,$zero,label3 # if $s0 <  $s1, goes to label3
b    label3            # only possibility left

如果不是这种情况,您将希望使用/来实现,$s0 >= $s1例如, 如 Ahmed 的回答中所示。
!($s0 < $s1)slt $t1, $s0, $s1beqz $t1, target

于 2013-03-03T09:33:13.887 回答
3

分别实现每个比较,而不是在多个比较中优化与早期的真实条件,使后面的不可达:

slt $at, $s1, $s0           # $s0 > $s1  as ($s1 < $s0) != 0
bne $at, $zero, label1

slt $t0, $s0, $s1           # $s0 >= $s1 as (s0<s1) == 0
beq $t0, $zero, label2

slt $t1, $s1, $s0           # $s0 <= $s1 the same but reversing the inputs
beq $t1, $zero, label3

label1:
label2:
label3:

有关的:

于 2018-01-13T15:11:53.820 回答