gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:45:39 24 4
gpt4 key购买 nike

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

在翻译这个函数时我需要将哪些变量保存在堆栈上,因为里面有另一个名为 get New 的函数。我知道 get New 会破坏 $r a 返回地址,所以我需要将 $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;
}

最佳答案

首先,欢迎来到 stackoverflow!

看起来您正在谈论调用约定。

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

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

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

有关更完整的解释,请阅读:link .

希望这有帮助!

关于C 到 Mips 转换嵌套函数哪些寄存器保存在堆栈上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52880849/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com