Что означает li $ v0,10 в Mips?

#assembly #mips #qtspim

#сборка #mips #qtspim

Вопрос:

Я только начинаю с Mips, так что это может показаться простым, но:
когда я писал приведенный выше код без инструкции li $ v0,10, я получил сообщение об ошибке: адрес памяти не привязан
, когда я добавил его, он работал без предупреждений.
Что это значит?

 .text
.globl main
main:
 li $t1,27
li $t2,2
mulou $t3,$t1,$t2
li $v0,10
syscall
  

Ответ №1:

li само по себе просто загружает немедленное в регистр. В этом конкретном случае процедура обслуживания на другой стороне syscall просматривает значение, $v0 чтобы определить, какая функция запрашивается. 10 это код для exit (см. Список системных вызовов, поддерживаемых spim). Если вы не установите $v0 , то будет выполнена некоторая случайная функция, основанная на том, какое значение $v0 содержится. Вероятно, этого не произойдет exit , поэтому процессор пытается продолжить выполнение всего, что находится после вашего кода в памяти, что рано или поздно приведет к сбою.

Комментарии:

1. итак, в терминах HLL 10 означает «выход» ?

2. ДА. Вы можете представить, что процедура обслуживания ОС имеет что-то вроде switch ($v0) { case 10: do_exit(); }

3. Я читал, что в регистрах v0, v1 хранятся результаты. Есть ли вероятность, что v0 используется для чего-то другого, кроме выхода из программы? И почему не все программы сборки заканчиваются этой инструкцией (я видел в Интернете некоторый код без нее).

4. Вы можете использовать $v0 для чего угодно. Это регистр общего назначения. В зависимости от среды могут быть другие способы выхода, например jal exit , или даже просто возврата jr $ra .

5. В случае, если это было неясно, это не li выполнение выхода. syscall Вызывается операционная система, которая затем просматривается $v0 . Вы можете 10 загрузиться $v0 , и ничего особенного не произойдет, если вы затем не перейдете к выполнению a syscall (так что твой процесс, который, будучи непослушным на мой взгляд, уничтожит его).