2010-05-13 3 views
2

В настоящее время я работаю с языком ассемблера под процессором MIPS. Я в настоящее время с помощью MARS тренажера и по неизвестным причинам я получаю следующее сообщение об ошибке после каждого запуска:Неверное значение счетчика программ: 0

Go: бег try.s

Ошибка: недопустимое значение счетчика программы: 0

Перейти: выполнение завершено с ошибками.

Я получаю сообщение об ошибке зависит от кода, я использую, просто интересно, если это ошибка в тренажере MARS или если это то, что я пропускаю.

+0

Кажется, что MARS сбрасывает некоторые регистры (например, $ ra) при вызове jr $ 31 в конце файла. В настоящее время я использую точки останова в конце файла, но не должен ли быть другой способ? – Krewie

+0

На домашней странице MARS: «Отправить вопросы и комментарии MARS доктору Пете Сандерсону на [email protected] или д-р Кен Фолмар в [email protected]». Вероятно, это ваш лучший призыв к чему-то конкретному. В противном случае вы можете добавить дополнительную информацию, например, исходный код, который проваливается (простейший случай) и что вы с ним делаете? –

+0

Я только что загрузил MARS (3.8) и попробовал один из предоставленных файлов примеров (Fibonacci.asm). Я не вижу эту ошибку в любой момент. Что вы делаете, чтобы получить эту ошибку? –

ответ

5

Возможно, вы закончили свою программу с jr $ra (возврат к вызывающему абоненту). Однако код, выполненный MARS, не имеет вызывающего абонента - он выполняется при запуске и не имеет функции для возврата, поэтому содержимое $ra равно нулю.

Правильный способ закончить программу MARS использует «выход»: системный вызов

li $v0, 10 
    syscall 
+0

Примечание. Если вы хотите вернуть целое число как часть выхода, см. [Этот ответ] (http://stackoverflow.com/a/18728114/35690). – Senseful

5

Я новичок в MIPS и я имел эту проблему. Это то, что я имел:

.data 

    .text 

swap: 
    # do stuff 
    jr $ra 

main: 
    # do stuff 
    jal swap 
    li $v0,10 
    syscall 

Я установил ее, изменив его следующим образом:

.data 

    .text 
main: 
    # do stuff 
    jal swap 
    li $v0,10 
    syscall 

swap: 
    # do stuff 
    jr $ra 

Обратите внимание, я переехал главным быть, прежде чем своп. Я ошибочно предположил, что основным является зарезервированный ярлык. И что он автоматически автоматически перейдет прямо к главному. Но, по-видимому, это не так, потому что он ударил мою команду jr $ ra, прежде чем мне пришлось называть jal swap в основном.

В любом случае, я надеюсь, что это поможет.

3

Я знаю, что этот вопрос старый, но для всех, кто был таким же, как я, и отчаянно пытался найти ответ на этот вопрос: попробуйте выполнить вышеупомянутую задачу syscall вместо возврата и попробуйте поставить свою основную функцию перед всеми другими ярлыками. Кроме того, в меню «Настройки» есть «Инициализировать программный счетчик к глобальному», «если он определен»; убедитесь, что этот флажок установлен. Я не знаю, разрешаю ли это включить вашу основную метку после других ярлыков, поскольку я еще не пробовал это. То, что я описал, это то, что я сделал, чтобы заставить его работать, и больше ничего. Удачи!

+0

Не работает. В моем случае я все равно получаю ту же ошибку. –

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