MIPS 中的大于、小于等于、大于等于

Posted

技术标签:

【中文标题】MIPS 中的大于、小于等于、大于等于【英文标题】:Greater than, less than equal, greater than equal in MIPS 【发布时间】:2013-03-03 07:13:34 【问题描述】:

给定两个寄存器$s0$s1,如何仅使用slt(设置为小于)和beqbne(如果相等,则为分支,如果不相等则分支)指令。

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

完全不适用于 MIPS。一方面,MIPS 没有标志寄存器。阅读它。 当然适用。当然 MIPS 没有标志寄存器,但这无关紧要。如果 $s0 > $s1slt 会将值 1 放入 $t1 beq $t1,1, label1 应该是 bnez $t1, label1bne $t1, $zero, label1。没有带有常量操作数的 beq/bne 指令(除了零寄存器)。汇编器可能在幕后为您做一些工作。【参考方案2】:

为了实现每个比较单独,而不是优化多个比较与早期的真实条件,使后面的不可达:

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:

相关:

How to do less than or equal in Assembly Language(MIPS)? - 像 C return (z&lt;=y); 这样的东西的无分支比较注册为 int

【讨论】:

以上是关于MIPS 中的大于、小于等于、大于等于的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis中的大于等于和小于等于

请问:等于,不等于,大于,小于,大于等于,小于等于的英文English是啥?

如何找到小于或等于 X 的最大值和大于或等于 X 的最小值?

mongodb查询的语法(大于,小于,大于或等于,小于或等于等等)

将特殊字符(大于/小于或等于符号)插入 SQL Server 数据库

xml CDATA区、特殊字符:<= 小于等于、>= 大于等于