MIPS嵌套函数调用

时间:2017-10-17 11:59:58

标签: c assembly mips mips32 nested-function

我正在尝试将C代码转换为MIPS代码。

   $fieldname = $_POST['fieldname'];

     foreach($fieldname as $entry):
     $output .= $entry.", ";

endforeach;

echo $output;

此代码包含测试函数内的嵌套函数调用。 我已将测试函数的返回地址放入堆栈并尝试将减去或相乘的值返回到main。

但就我而言,我的代码执行减法和乘法函数。 我想把结果放到s0。运行后,s0始终显示值的减法。如果我将乘法结果放到s1,则s1显示真值。

我认为减法函数会覆盖s0处的值。但是当情况相乘时,为什么要调用减法方法呢?我有一个if / else块,但这部分似乎无效。

这是我的MIPS代码,我做错了什么?

int main() {
  int a;
  int b;
  int result = 0;
  if (a != b)
    result = test(a, b);
  else
    result = a + b;
  return result;
}
int test(int a, int b) {
  if (a > b)
    return multiply(a, b)
  else
    return subtract(a, b)
}
int multiply(int a, int b) {
  return a * b;
}
int subtract(int a, int b) {
  return a - b;
}

1 个答案:

答案 0 :(得分:2)

问题是,从乘法返回后,仍然在下一行中调用减去。调用 multiply 后,您必须从函数 test 返回。 但是,由于函数调用都是函数的最后一条指令,因此可以使用以下快捷方式:

test:
        slt $s1,$a1,$a0
        bne $s1, 1, ELSE
        j multiply
ELSE:   j subtract

这样,您不必将$ ra存储在堆栈中,但您可以直接使用它跳回{中的 test 调用 减去乘以的{1}}。这样它应该按预期工作。

或者,从multiply返回后跳过jr $ra

jal subtract