给定两个寄存器$s0和$s1,如何仅使用slt (设置为小于)和beq和bne (如果等于则为分支,如果不等于则为分支)指令将以下伪代码转换为MIPS汇编语言。
if ($s0 > $s1) { goto label1 }
if ($s0 >= $s1) { goto label2 }
if ($s0 <= $s1) { go to label3 }发布于 2013-03-03 17:33:14
我假设伪代码是按顺序执行的,因此前面的条件为真意味着您到了那里,永远不会到达后面的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实现为
使用slt $t1, $s0, $s1 / beqz $t1, target的!($s0 < $s1),例如,
正如艾哈迈德的回答所示。
发布于 2018-01-13 23:11:54
要单独实现每个比较,而不对多个比较进行优化,则会导致后面的条件无法实现:
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.进行无分支比较到寄存器中
https://stackoverflow.com/questions/15183346
复制相似问题