【发布时间】:2013-03-03 07:13:34
【问题描述】:
给定两个寄存器$s0、$s1,如何仅使用slt(设置为小于)和beq 和bne(如果相等,则为分支,如果不相等则分支)指令。
if ($s0 > $s1) { goto label1 }
if ($s0 >= $s1) { goto label2 }
if ($s0 <= $s1) { go to label3 }
【问题讨论】:
给定两个寄存器$s0、$s1,如何仅使用slt(设置为小于)和beq 和bne(如果相等,则为分支,如果不相等则分支)指令。
if ($s0 > $s1) { goto label1 }
if ($s0 >= $s1) { goto label2 }
if ($s0 <= $s1) { go to label3 }
【问题讨论】:
我假设伪代码是按顺序执行的,所以较早的条件为真意味着您去那里并且永远不会到达后面的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,例如,
如艾哈迈德的回答所示。
【讨论】:
slt 会将值 1 放入 $t1
beq $t1,1, label1 应该是 bnez $t1, label1 或 bne $t1, $zero, label1。没有带有常量操作数的 beq/bne 指令(除了零寄存器)。汇编器可能在幕后为您做一些工作。
为了实现每个比较单独,而不是优化多个比较与早期的真实条件,使后面的不可达:
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。【讨论】: