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

C to Mips conversion nested functions which registers to save on stack?

我正在尝试处理我的学校项目,但在将嵌套函数从 c 转换为 mips 时遇到困难,我特别困惑哪些变量被认为会被内部函数 get New 丢弃,因此我需要将它们保存在堆栈中. 所以在例子中我有这个函数我需要翻译:

翻译此函数时我需要将哪些变量保存在堆栈中,因为内部还有另一个名为 get New 的函数。我知道 get New 会破坏 $r a return 地址,所以我需要确保将 $r a 保存在堆栈中。 p t r X 、 p t r Y 和 arguments 呢?我怎么知道哪些会被 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;
    } 

首先,欢迎来到Whosebug!

您似乎在谈论调用约定。

正如迈克尔在评论中所说,如果您正在翻译 getNew 代码,那么这将取决于您。如果不是,您将必须知道 getNew 遵循的是哪个约定。

如果你的情况是第一个:那么,根据这个 calling convention,在 MIPS32 中你必须保留 $fp 和 $gp 并且如果你使用 $s 寄存器(s 代表保存的临时寄存器)你必须将它们保留在被调用者身上以避免意外行为。除此之外,如果您使用 $t 寄存器(t 代表临时寄存器),调用者必须在调用另一个函数之前保存它们。

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

如需更完整的解释,请阅读:link

希望对您有所帮助!