Конвертировать функцию C ++ в MIPS

Если вам дают:

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’?

1

Решение

Ваши результаты верны, по крайней мере, первый. В соответствии с Вот Ваш первый ответ:

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 если ты можешь. Они выходят в ОЗУ и извлекают память, которая очень медленная по сравнению с хранением значений в регистрах ЦП.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector