C в Mips преобразование вложенных функций, которые записываются для сохранения в стеке? - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь работать над своим школьным проектом, но у меня возникают трудности с переводом вложенных функций из c в mips. Я не совсем понимаю, какие переменные будут выбраны внутренней функцией get New, поэтому мне нужно сохранить их в стеке.Так, в примере у меня есть эта функция, мне нужно перевести:

, какие переменные мне нужно сохранить в стеке при переводе этой функции, так как есть другая функция, которая называется get New внутри.Я знаю, что get New будет уничтожать адрес возврата $ ra, поэтому мне нужно наверняка сохранить $ ra в стеке.Как насчет ptr X, ptr Y и аргументов?как я узнаю, какие из них будут уничтожены при получении 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 голосов
/ 18 октября 2018

Прежде всего, добро пожаловать в stackoverflow!

Похоже, вы говорите о соглашении о вызовах.

Как сказал Майкл в комментариях, если вы переводите код getNew, тогда вам решать.Если нет, вам нужно знать, какое соглашение getNew следует следующим.

Если ваш случай является первым: Затем, в соответствии с этим соглашением о вызовах , в MIPS32 вы должны сохранить $ fp и$ gp, и если вы используете регистры $ s (s означает сохраненные временные данные), вы ДОЛЖНЫ сохранить их в вызываемом вызове, чтобы избежать неожиданного поведения.В дополнение к этому, если вы используете регистры $ t (t обозначает временные), вызывающая сторона должна сохранить их перед вызовом другой функции.

Итак, в вашем случае getNew должен сохранить регистры $ s, если он используетим и moveRobots следует сохранить регистры $ t, если он их использует.

Для более полного объяснения прочитайте это: ссылка .

Надеюсь, это поможет!

...