【问题标题】:Mutiple conditions in if in MIPSMIPS 中 if 中的多个条件
【发布时间】:2013-03-13 01:10:22
【问题描述】:

MIPS 提供分支指令,如相等时分支、不等于寄存器时分支、小于或等于 0 时分支、大于或等于 0 时分支等...所有分支指令仅使用两个操作数还有一个条件。如果我们在 if 语句中突然遇到多个条件会发生什么。

所以问题是如何编写 MIPS 代码:

if( (a<b) & ( b>c ) || (c==d)) {

}
else 
{

 }

请帮忙处理 if 语句中的这种多重条件。

【问题讨论】:

  • 想一想如何重构上面的 C 代码,以便每个 if... 只有一个条件项
  • 这会限制使用 MIPS 设计编译器。现在我正在尝试为“if”和“while”语句构建一个编译器。
  • 一旦你重组了 C 代码,你应该很清楚如何在汇编程序中实现等效。
  • 我们只能在和条件下进行重组
  • 这不是 MIPS 或 if 条件所独有的。阅读一下编译器设计中的表达式评估,希望它会变得更清晰。

标签: if-statement assembly conditional-statements mips


【解决方案1】:

你可以重写:

if( (a<b) && ( b>c ) || (c==d)) {

}

像这样:

bool altb = a < b;
bool bgtc = b > c;
bool ceqd = c == d;
bool and1 = altb && bgtc;
bool condition = and1 || ceqd;
if (condition) {
} else {
}

这是大多数编译器在 if 语句中评估复杂条件的方式。这样做也比将许多条件分支链接在一起要快得多。

【讨论】:

    【解决方案2】:

    假设$t0有a,$t1有b,$t2有c,$t3有d:

         outter_if_lbl: 
         bge $t0,$t1,exit_outter   #if a>=b break
         ble $t1,$t2,exit_outter   #if b=< c break
         bne $t2,$t3,exit_outter   #if c != d break
         #add functionality here   
    
         exit_outter:
         jr $ra #or whatever does your job
    

    我使用伪指令,所以如果你愿意,你可以转换它们。谷歌如何。这背后的想法是,您必须使用 if 语句的相反情况才能使代码类似地工作(这是通用的 C 到 Mips 转换规则)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      • 2016-08-05
      • 1970-01-01
      相关资源
      最近更新 更多