Если вам дают:
calc (int b) {
return b - 2;
}
Как бы это было преобразовано в MIPS?
Я учел следующее:
addi $v0, $a0, -2
jr $ra
***********************
jr $ra
addi $v0, $a0, -2
***********************
addi $v0, $a0, 2
jr $ra
***********************
lw $v0, 0($a0)
addi $v0, $v0, -2
jr $ra
Я просто изучаю функции в MIPS и буду признателен за советы. Есть ли смысл в этом случае использовать инструкцию ‘lw’?
Ваши результаты верны, по крайней мере, первый. В соответствии с Вот Ваш первый ответ:
addi $v0, $a0, -2
jr $ra
верно. Он использует наименьшее количество инструкций, что увеличивает скорость выполнения, не говоря уже о том, что использование немедленных инструкций уменьшает выборки из памяти. Посмотрите на таблицу в ссылке и скажу, что:
$v0
регистр, куда должно идти первое возвращаемое значение из функции.$a0
регистр первого входного параметра, который используется при вызове функций.$ra
является регистром, содержащим адрес возврата из предыдущей инструкции перехода.Итак, кто-то хотел вызвать вашу ассемблерную функцию:
int x = calc(5); // This line is the `C` equivalent and not part of assembly code.
Сборка будет:
li $a0, 5 # Load immediate the value 5 into register $a0.
jal __calc # Jump to the sub routine '__calc' and store return address in $ra.
# Result will now be in $v0.
...
__calc:
addi $v0, $a0, -2
jr $ra
Старайтесь держаться подальше от таких инструкций, как lw
если ты можешь. Они выходят в ОЗУ и извлекают память, которая очень медленная по сравнению с хранением значений в регистрах ЦП.
Других решений пока нет …