Если соглашение о вызовах передает аргументы в регистрах, вам не нужно сохранять их в стеке вообще .Вызывающий резервирует домашнее пространство перед вызовом, но именно вызывающий выбирает, как его использовать.
(Компилятор, выполняющий отладочную сборку, обычно сохраняет свои аргументы в памяти, но он может делать все, что захочет).
Соглашение о вызовах определяет вещи только тогда, когда у вас больше аргументов, чем умещается в регистрах: в этом случае все соглашения C помещают более ранние (слева) аргументы по более низким адресам, поэтому такие функции как printf
don 'Не нужно знать, сколько всего аргументов нужно найти, например, шестое.Это делает не ошибкой printf("hello\n", 1, 2, 3, 4);
.Printf просто никогда не будет смотреть на аргументы после первого, и ему все равно, что вызывающая сторона поместит 4
в стек.
Если вы хотите быть согласующимся с этим при выдаче аргументов регистра (это в основном весь смысл домашнего пространства), тогда вы сохраните их с первым аргументом по самому низкому адресу.
Я не эксперт по соглашениям о вызовах MIPS.Поскольку jal
не изменяет $sp
, я полагаю, что вызываемый может быть ответственным за резервирование "домашнего пространства".
Но если вызываемый пользователь резервирует домашнее пространство, тогда это просто дополнительная вещь, которую они могутделайте, если хотите, и не нуждаетесь в специальном имени!
Это отличается, например, в Windows x64, где инструкция call
помещает адрес возврата в стек, поэтому важно, чтобы вызывающий резервировал теневое пространство до вызова, чтобы вызываемый мог сделать непрерывный массив аргументов.
Но так как MIPS jal
передает адрес возврата в $ra
а не в стеке, нет причин вносить это в соглашение о вызовах.