2016-04-16 3 views
1

В 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 в стек сразу.

+0

Что/кто генерирует этот код (то есть, кто/кто решает, как уменьшить декмер стека)? В MARS 's.d' является pesudo-инструкцией. Возможно, рассмотрение расширения псевдо-инструкций в контексте полной программы поможет ответить на ваш вопрос. – Zack

+0

@ Zack Я обновил исходное сообщение. – qwr

+0

Я также считаю, что указатель стека должен быть уменьшен на 8, а не на 4. Что побуждает вас думать, что 8 неверно? – Zack

ответ

0

Проверьте, не установлено ли значение $ sp только для значения, которое не кратно 8. Если это так, попробуйте следующее: andi $sp, $sp, 0xfffffff8. Это должно увеличивать $ sp до следующего кратного 8. Однако вам нужно позаботиться о том, чтобы вы могли правильно вернуть $ sp в исходное значение.

+0

Я использую 'add $ sp, $ sp , -4' и 'add $ sp, $ sp, 4', что существенно эквивалентно. Обоснование ошибки MARS в том, что меня больше интересует. – qwr

+1

MIPS требует, чтобы данные были «выровнены». Это означает, что адреса данных слова должны быть кратными 4, а адреса данных двойного слова должны быть кратными 8. Предположим, что $ sp инициализируется кратным 8, затем вы нажимаете целое число, а затем нажимаете float с двойным словом. Второе нажатие вызовет ошибку во время выполнения, потому что $ sp больше не будет кратным 8. «andi' above« rounds down »; он не вычитается. – Zack

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