MIPS IF循环大于或等于 [英] MIPS if loop greater or equals to
本文介绍了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
推荐答案
您有几个打字错误:
stl
→;slt
。- 您的分支指令正在测试
$t0
,但slt
的目标是$t1
,因此不匹配。 - 您有一个带标签的条件分支指令,但没有定义标签。
否则看起来您的想法是正确的。 ;但这是很难纠正的问题。
明确地说,您知道与结构化编程的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
,然后还颠倒了分支条件:beq
vs 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
。 ;看到区别了吗?
这个东西很棘手,因为:
- 在结构化语句和IF-GOTO样式之间切换时,我们必须反转(否定)条件,并且,
- MIPS只提供一种有序关系操作(它有
<
,但没有<=
、>
、>=
),因此,这意味着当我们需要时,我们必须模拟它(通过slt
通过颠倒操作数和/或颠倒TRUE和/或BRANCH FALSE上的分支)。
这篇关于MIPS IF循环大于或等于的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文