我正在尝试执行我的学校项目,但是我很难将嵌套函数从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;
}
答案 0 :(得分:1)
首先,欢迎您使用stackoverflow!
您似乎在谈论通话惯例。
正如Michael在评论中所说,如果您要翻译getNew代码,那将取决于您。如果没有,您将必须知道以下哪个约定是getNew。
如果是第一种情况:那么,根据此calling convention,在MIPS32中必须保留$ fp和$ gp,如果使用$ s寄存器(s代表已保存的临时文件),则必须保留它们在被调用方上,以免发生意外行为。除此之外,如果您使用$ t寄存器(t代表临时变量),则调用者必须在调用另一个函数之前保存它们。
因此,在您的情况下,getNew如果正在使用$ s寄存器,则应该保存$ s;如果使用它们,则moveRobots应该保存$ t寄存器。
有关更完整的说明,请阅读:link。
希望这会有所帮助!