assembly 大于、小于等于、大于等于(MIPS)

6za6bjd0  于 2023-04-21  发布在  其他
关注(0)|答案(3)|浏览(147)

给定两个寄存器$s0$s1,如何仅使用slt(设置为小于)和beqbne(等于则分支,不等于则分支)指令将以下伪代码转换为MIPS汇编语言。

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

s1ag04yj1#

我假设伪代码是顺序执行的,所以前面的条件为真意味着你到达那里,永远不会到达后面的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实现为
!($s0 < $s1)slt $t1, $s0, $s1/beqz $t1, target,例如,
正如艾哈迈德的回答所示。

soat7uwm

soat7uwm2#

要实现每个比较 * 单独 *,而不需要在多个比较中进行优化,其中较早的真条件使后来的条件不可达:

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:

相关:

vc9ivgsu

vc9ivgsu3#

只要记住x〈y意味着y〉x。所以你可以创建set_bigger_than

相关问题