MIPS IF循环大于或等于 [英] MIPS if loop greater or equals to

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

问题描述

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

不太确定这是否正确。根据不同的来源把这些放在一起。看似简单,但我仍在学习基础知识。

stl $t1, $t5, $t4
beq $t0, $zero, endLoop
addi $8, $8, 1

主引用:Greater than, less than equal, greater than equal in MIPS

推荐答案

您有几个打字错误:

  1. stl→;slt
  2. 您的分支指令正在测试$t0,但slt的目标是$t1,因此不匹配。
  3. 您有一个带标签的条件分支指令,但没有定义标签。

否则看起来您的想法是正确的。 ;但这是很难纠正的问题。

明确地说,您知道与结构化编程的IF-THEN结构相比,我们必须颠倒(否定Re:Boolean逻辑)汇编语言的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,然后还颠倒了分支条件:beqvs 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和/或BRANCH FALSE上的分支)。

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

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