MIPS,如果大于或等于 [英] MIPS if greater or equals to

查看:0
本文介绍了MIPS,如果大于或等于的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

if ($t4 >= $5)
    $t8 = $t8+1
给出该伪代码,我根据各种来源进行了这一尝试。看似简单,但我仍在学习基础知识。不太确定这是否正确。

slt $t1, $t5, $t4
beq $t0, $zero, endLoop
addi $8, $8, 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与Mybne。这非常接近于(结构化样式)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只提供一种有序的关系操作(它有<,但没有<=>>=),因此,这意味着当我们需要时,我们必须模拟它(通过slt通过颠倒操作数和/或颠倒True和分支False上的分支)。

相关:

这篇关于MIPS,如果大于或等于的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆