#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
, и ничего особенного не произойдет, если вы затем не перейдете к выполнению asyscall
(так что твой процесс, который, будучи непослушным на мой взгляд, уничтожит его).