2016-06-01 2 views
1

Код обработчика исключений MIPS НЕ работает: В следующем коде я пытаюсь распечатать адреса инструкции, вызвавшей исключение (регистр $ 14) и Тип исключения (регистр $ 13). Я исчерпал все возможные пути, о которых я мог думать.Печать исключений MIPS Не работает

Сообщение об ошибке дает:

":" LW Слишком мало или неправильно отформатированные операнды. Ожидаемые: lw $ t1, -100 ($ t2)

Спасибо!

mfc0 $k0,$14 # Coprocessor 0 register $14 has address of trapping instruction 

    lw $a0, $k0 # address of string to print 

    li $v0, 4 # Print String service 

    syscall 

    mfc0 $k0,$13 # Coprocessor 0 register $13 has type of exception 

    lw $a0, $k0 # address of string to print 

    li $v0, 4 # Print String service 

    syscall 
+0

Чувак, нажмите ссылку «изменить» под своим вопросом, выберите весь свой код, затем нажмите кнопку с фигурными фигурными скобками, чтобы правильно отформатировать его. –

+1

в порядке спасибо за подсказку! –

ответ

0

Вместо:

lw <regdst>,<regsrc> 

Do:

move <regdst>,<regsrc> 

move является псевдо-оп, который будет [скорее всего] порождают:

addu <regdst>,<regsrc>,$zero 

Или это также можно было бы сделать:

addiu <regdst>,<regsrc>,0 

Side Примечание: Я написал полный обработчик исключений раньше, поэтому убедитесь, что первая инструкция [больше или меньше]:

move $k0,$at 

И эпилога выглядит так:

move $at,$k0 
eret 

Я также устанавливаю фрейм стека, как и для нормальной функции [sa ving все остальные регистры, которые меняются] и pop из него в конце

Причина, по которой я упоминаю об этом, заключается в том, что обработчик исключений должен сохранять каждый регистр, который он изменит, и восстановить исходное значение при выходе, если оно вернется к базовый код (например, он может заблокировать и исправить исключение переполнения).

Это также [особенно] верно для обработки контрольных точек.

Смежные вопросы