给定两个寄存器$s0、$s1,如何仅使用slt(设置为小于)和beq和bne(等于则分支,不等于则分支)指令将以下伪代码转换为MIPS汇编语言。
$s0
$s1
slt
beq
bne
if ($s0 > $s1) { goto label1 } if ($s0 >= $s1) { goto label2 } if ($s0 <= $s1) { go to label3 }
s1ag04yj1#
我假设伪代码是顺序执行的,所以前面的条件为真意味着你到达那里,永远不会到达后面的if语句。这使得最后一个分支保证被执行,如果它被到达的话,所以它甚至不需要是有条件的。(还假设这是一个没有分支延迟槽的MIPS。)
if
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,例如,正如艾哈迈德的回答所示。
$s0 >= $s1
!($s0 < $s1)
slt $t1, $s0, $s1
beqz $t1, target
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:
相关:
return (z<=y);
int
vc9ivgsu3#
只要记住x〈y意味着y〉x。所以你可以创建set_bigger_than
3条答案
按热度按时间s1ag04yj1#
我假设伪代码是顺序执行的,所以前面的条件为真意味着你到达那里,永远不会到达后面的
if
语句。这使得最后一个分支保证被执行,如果它被到达的话,所以它甚至不需要是有条件的。(还假设这是一个没有分支延迟槽的MIPS。)如果不是这种情况,则需要将
$s0 >= $s1
实现为!($s0 < $s1)
与slt $t1, $s0, $s1
/beqz $t1, target
,例如,正如艾哈迈德的回答所示。
soat7uwm2#
要实现每个比较 * 单独 *,而不需要在多个比较中进行优化,其中较早的真条件使后来的条件不可达:
相关:
return (z<=y);
这样的东西,作为int
。vc9ivgsu3#
只要记住x〈y意味着y〉x。所以你可以创建set_bigger_than