MIPS 如果大于或等于

MIPS if greater or equals to

if ($t4 >= )
    $t8 = $t8+1

鉴于该伪代码,我根据各种来源将此尝试组合在一起。看起来很简单,但我仍在学习基础知识。不太确定这是否正确。

slt $t1, $t5, $t4
beq $t0, $zero, endLoop
addi , , 1

主要参考:Greater than, less than equal, greater than equal in MIPS

你有一些错别字:

  1. 您的分支指令正在测试 $t0,但 slt 的目标是 $t1,因此不匹配。
  2. 您有一个带有标签的条件分支指令,但没有定义标签。
  3. 您的标签名称是 endLoop,但这 只是 一个 if,而不是 while 或其他循环条件,并且if 控制的语句不是 break.

否则看起来你的想法是正确的。 但这很难做到正确。

需要明确的是,与结构化编程的 if-then 构造相比,您知道我们必须反转(否定 re:布尔逻辑)汇编语言的 if-goto 风格的条件意义。

if (t4 >= t5)
    t8++;

变成

  if (t4 < t5) goto skip;  //  !(a >= b)  --->  a < b
  t8++;
skip: ;

现在,我会更直接地在汇编中编写上面的代码:

  slt $t1, $t4 $t5       # let's see if t4 < t5
  bne $t1, $zero, skip   # yes? goto skip
  addi $t8,$t8,1
skip:

相反,您反转了操作数 $t4$t5,然后还反转了分支条件:beq 与我的 bne。这非常接近于(结构化风格)C 的三重否定(这会起作用),但有细微差别。

所以,你写的是:

  if (!(t5 < t4)) goto skip;
  t8++;
skip: ;

其中 — 转换为结构编程 — 是:

if (t5 < t4)      // logically: remove the negation and incorporate then
    t8++;

我们可以看到,如果我们反转操作数但同时切换关系,我们有:

if (t4 > t5)      // same exact logical condition as immediately above
    t8++;

因此,您的代码不会产生与 C 代码相同的条件测试,因为相等条件下的操作与原始代码不同。

您的汇编代码正在执行 t4 > t5,而 C 代码正在执行 t4 >= t5。看出区别了吗?


这东西很棘手,因为:

  1. 在结构化语句和 if-goto 样式之间切换时,我们必须反转(否定)条件,并且,
  2. MIPS 只提供一种有序的关系运算(它有 < 但没有 <=>>=),所以,这意味着当我们需要什么 sge 我们必须模拟它(通过 slt 通过反转操作数 and/or 反转 true 与 branch false 的分支)。

相关:

  • Mutiple conditions in if in MIPS - if( x<y && x<z ) 或类似的。一种方法是将布尔值与 AND 或 OR 一起进行比较,而不是通过执行多个分支来短路。
  • - if (x < 10 && x > 5) 或类似:有两个分支,或有范围检查技巧。
  • How to do less than or equal in Assembly Language(MIPS)? - 比较 slt
  • 以外的条件的布尔整数