MIPS语言中的嵌套和递归过程

Nested and recursive procedures in MIPS language

本文关键字:递归 过程 嵌套 语言 MIPS      更新时间:2023-10-16

F和G是两个过程,定义如下(在伪语言high级别):

int G(int n) {
int b = 0;
int u = 0;
for (int k = 0; k <= n; k++) {
    u = F(k);
    b = (b*b)+u;
}   
return b;
}
int F(int m) {
    if(m == 0) {
       return 1; 
    } 
    else {
       int p = F(m-1);
       return (2*p)+m;
    }
 }
 System.out.println(G(n));     //where n is a natural number

使用QtSpim,编写并测试一个程序,该程序读取第一个自然数n,并在控制台上显示:

  • 过程G(n)返回的值,如所述实现G和F先前对两个过程G和F的调用必须使用指令jal(跳转和链接)来实现

  • 带有嵌套调用序列的轨迹(参数介于括号)和各种嵌套调用返回的值(括号之间的返回值),对于G和F

n=1:情况下的控制台输出示例

  • 结果:G(1)=4
  • 轨迹:G(1)->F(0)->F返回(1)->F(1)>>F返回(2)->F返回(3)->G返回(4)

有人能帮我用MIPS语言翻译这个C/C++代码吗?

"伪语言高级"代码是纯C(89)。您必须更改F和G的顺序,或者添加正向声明。顺便说一句,只有F是递归的,并且没有任何嵌套。G只是打电话给F.

#include <stdio.h>
int F(int m)
{
  if(m == 0) {
    return 1; 
  } 
  else {
    int p = F(m-1);
    return (2*p)+m;
  }
}
int G(int n)
{
  int b = 0;
  int u = 0;
  for (int k = 0; k <= n; k++) {
    u = F(k);
    b = (b*b)+u;
  }   
  return b;
}
int main(int argc, char** argv)
{
  printf("%un", G(2));
  return 0;
}

一旦进入C,您就可以调用gcc为MIPS编译它(您可以选择处理器或通用ISA的名称):

gcc -Wall -std=c99 -march='mips3' -S -c filename.c

并且您已经将您的代码最终编译为MIPS。当然,如果这是家庭作业,让gcc为你做这项工作可能会被视为作弊。