2013-02-18 3 views
0

Я читал в руководстве MIPS, что: «Обратите внимание, что мы используем« неподписанную »версию инструкции« добавить немедленную », потому что мы имеем дело с адресом, который является двоичным числом без знака. не хотел бы генерировать исключение только потому, что вычисляемый адрес пересекал среднюю точку пространства памяти ».MIPS: Использование стека

Что это значит? Конкретно пересекая среднюю точку пространства памяти.

А также, в следующем коде, я не понимаю, почему он пропускает от 8 ($ sp) до 20 ($ sp). Код загружается с 12 ($ sp) и 16 ($ sp) позже, но когда он делает что-то с этими частями памяти. Я думал о возможности в jal JILL, но на самом деле не так много объяснений.

addiu $sp, $sp, -24 
sw $t1, 0($sp) 
sw $t2, 4($sp) 
sw $t3, 8($sp) 
sw $ra, 20($sp) 
jal JILL 
lw $ra, 20($sp) 
lw $t4, 12($sp) 
lw $t5, 16($sp) 
addiu $sp, $sp, 24 
+0

это не «без знака добавление» его является дополнением с «неподписанным исключением». Сама операция добавления не знает о интерпретации битов. –

ответ

1

Assumming архитектуру MIPS32, который имеет 32-битное адресное пространство, в средней точке пространства памяти будет адрес 0x80000000 (то есть 2^31). В 32-битной подписанной (A2-комплимент) арифметике целые числа от 0 до 0x7FFFFFFF зарезервированы для положительных чисел, где целые числа от 0x80000000 до 0xFFFFFFFF зарезервированы для отрицательных чисел.

Когда вы выдаете подписанное дополнение, вы получите исключение переполнения, если результат добавления «пересекает» эту середину. Но в вашем примере вы действительно имеете дело с адресами памяти, а не с подписанными номерами ... поэтому знак адреса (интерпретируемый как 32-разрядное число) не имеет смысла, поэтому вы должны использовать беззнаковое дополнение.

Что касается вашего второго вопроса, вы должны смотреть в процедуру Джилл, чтобы увидеть, что он делает ... конечно, что процедура будет хранить некоторую информацию в 12($sp) и 16($sp)

+0

Итак, если я правильно вас понимаю, это просто предотвратить исключение переполнения, которое может произойти из-за дополнения дополнения двух. А также в отношении второго вопроса, какова будет разница между приведенной выше реализацией и просто корректировкой стека в JILL? Было бы намного сложнее в коде и концептуально? – John

+0

Да, это просто исключение исключения переполнения, которое может возникнуть, если стек находится около середины пространства памяти. Что касается вашего второго вопроса, все зависит от соглашения о вызове, используемого для вызова других процедур. В вашем примере вызывающий абонент резервирует место в стеке для вызываемой процедуры для хранения результатов, затем по возвращении из вызывающей программы ваша программа использует результаты и освобождает используемое пространство стека. Вы не можете легко переместить это поведение в процедуру JILL, потому что некоторые регистры должны быть сохранены вызывающим ($ t1, $ t2, $ t3 и $ ra) – gusbro

+0

Не могли бы вы рассказать о своем последнем предложении? – John