В MIPS, хранить двойной (8 байт), указатель стека $sp
уменьшается на 4:MIPS границы и двойного слова указатель стека
addi $sp, $sp, -4
s.d $f10, 0($sp)
Это не имеет смысла для меня, как 8 байт взятый в памяти, но указатель стека движется, как если бы он использовал одну границу слова. Для хранения двух дублей, кажется, указатель стека должен быть уменьшен на 12, а не 16, как и ожидалось:
addi $sp, $sp, -12
s.d $f10, 0($sp)
s.d $f12, 8($sp)
Почему происходит такое поведение? Затем он вызывает проблемы, если подпрограмма называется рекурсивно (первый раз выровнен, второй - нет)
Редактировать: Я запускаю этот код с MARS 4.5. s.d $f10, 8($sp)
выливается
lui $1,0
addu $1,$1,$29
sdc1 $f10,8($1)
указатель стека не перемещается в течение этого времени. Шаг через него выглядит так: sdc1
помещает как $f10
, так и $f11
в стек сразу.
Что/кто генерирует этот код (то есть, кто/кто решает, как уменьшить декмер стека)? В MARS 's.d' является pesudo-инструкцией. Возможно, рассмотрение расширения псевдо-инструкций в контексте полной программы поможет ответить на ваш вопрос. – Zack
@ Zack Я обновил исходное сообщение. – qwr
Я также считаю, что указатель стека должен быть уменьшен на 8, а не на 4. Что побуждает вас думать, что 8 неверно? – Zack