MIPS,如果大于或等于 [英] MIPS if greater or equals to
本文介绍了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
推荐答案
您有一些打字错误:
- 您的分支指令正在测试
$t0
,但slt
的目标是$t1
,因此不匹配。 - 您有一个带标签的条件分支指令,但没有定义标签。
- 您的标签名称是
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
。看到区别了吗?
这件事很棘手,因为:
- 在结构化语句和IF-GoTo样式之间切换时,我们必须颠倒(否定)条件,并且,
- MIPS只提供一种有序的关系操作(它有
<
,但没有<=
、>
、>=
),因此,这意味着当我们需要时,我们必须模拟它(通过slt
通过颠倒操作数和/或颠倒True和分支False上的分支)。
相关:
- Mutiple conditions in if in MIPS-
if( x<y && x<z )
或类似。一种方法是将布尔值AND或OR放在一起进行比较,而不是通过执行多个分支来缩短路径。 - How can I implement if(condition1 && condition2) in MIPS?-
if (x < 10 && x > 5)
或类似:使用两个分支,或使用范围检查技巧。 - How to do less than or equal in Assembly Language(MIPS)?-对
slt
以外的条件进行布尔整数比较
这篇关于MIPS,如果大于或等于的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文