2013-10-26 3 views
0

Допустим, у меня есть:MIPS: Сохранение адреса возврата в вложенных процедур

main: 

    // stuff 

    jal function_a 

function_a: 

    // function_a stuff 

    jal function_b 

    jr $ra 

function_b: 

    // function_b stuff 

    jr $ra 

Из того, что я понимаю, главный сохраняет соответствующий адрес возврата в $ ра, когда он делает JAL function_a, но затем function_a переписывает $ ра когда он выполняет jal function_b, поэтому, очевидно, $ ra необходимо сохранить в какой-то момент. Но я не могу найти ничего, что фактически говорит, что конвенция для этого. Я храню $ ra в стеке, пока в функции_a перед вызовом jal function_b? Я храню $ ra в s-регистре перед вызовом jal function_b, а затем сохраните этот s-регистр в начале функции function_b (что, я думаю, подразумевалось here)? Что-то другое? Это имеет значение?

ответ

1

Обычная практика заключается в том, чтобы сэкономить $ra на стеке. Хранение его (скажем) $s0 не имеет большого смысла, поскольку согласно нормальному коллизионному соглашению function_a также должен сохранить $s0, поэтому сначала вам нужно будет сохранить $s0 в стеке, чтобы освободить место для $ra. Если вы не следуете нормальному соглашению о вызове, вы можете делать все, что хотите, конечно.

+0

Имеет смысл, спасибо. – Tyler

Смежные вопросы