В MIPS для хранения двойного значения (8 байт) указатель стека $sp
уменьшается на 4:
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
.
s.d
является псевдоинструкцией. Возможно, просмотр расширения псевдоинструкции в контексте полной программы поможет ответить на ваш вопрос. - person Zack   schedule 17.04.2016Runtime exception at 0x0040000c: address not aligned on doubleword boundary 0x7fffeff4
(дляaddi $sp, $sp, -8
) - person qwr   schedule 18.04.2016