C到Mips转换嵌套函数将哪些寄存器保存在堆栈中?

时间:2018-10-18 19:02:17

标签: c mips mips32

我正在尝试执行我的学校项目,但是我很难将嵌套函数从c转换为mips,Im特别困惑于内部函数将废弃哪些变量视为New,因此我需要将它们保存在堆栈中。 因此,在示例中,我需要执行以下功能:

在翻译此函数时,我需要将哪些变量保存在堆栈中,因为还有另一个名为get New inside的函数。我知道get New会浪费$ r个返回地址,因此,我肯定需要在堆栈上保存$ r a。那么p t r X,p t r Y和参数呢?我怎么知道get New将丢弃那些垃圾邮件?

int moveRobots(int *arg0, int *arg1, int arg2, int arg3)
{
  int i, *ptrX, *ptrY, alive = 1;

ptrX = arg0;
ptrY = arg1;

for (i=0;i<4;i++) {
*ptrX = getNew(*ptrX,arg2);  
*ptrY = getNew(*ptrY,arg3); 


if ((*ptrX == arg2) && (*ptrY == arg3)) {
  alive = 0;
  break;
}
ptrX++;
ptrY++;
   }
    return alive;
 }

这是getNew函数

 int getNew(int arg0, int arg1)
 {
 int temp, result;

 temp = arg0 - arg1;
  if (temp >= 10)
    result = arg0 - 10;
  else if (temp > 0)
    result = arg0 - 1;
  else if (temp == 0)
    result = arg0;
  else if (temp > -10)
    result = arg0 + 1;
   else if (temp <= -10)
    result = arg0 + 10;

   return result;
    } 

1 个答案:

答案 0 :(得分:1)

首先,欢迎您使用stackoverflow!

您似乎在谈论通话惯例。

正如Michael在评论中所说,如果您要翻译getNew代码,那将取决于您。如果没有,您将必须知道以下哪个约定是getNew。

如果是第一种情况:那么,根据此calling convention,在MIPS32中必须保留$ fp和$ gp,如果使用$ s寄存器(s代表已保存的临时文件),则必须保留它们在被调用方上,以免发生意外行为。除此之外,如果您使用$ t寄存器(t代表临时变量),则调用者必须在调用另一个函数之前保存它们。

因此,在您的情况下,getNew如果正在使用$ s寄存器,则应该保存$ s;如果使用它们,则moveRobots应该保存$ t寄存器。

有关更完整的说明,请阅读:link

希望这会有所帮助!