私は現在、MIPS プロセッサの下でアセンブリ言語を使用しています。現在、MARS シミュレーターを使用していますが、理由は不明ですが、実行するたびに次のエラー メッセージが表示されます。
Go: try.s の実行
エラー: 無効なプログラム カウンタ値: 0
Go: 実行はエラーで終了しました。
使用しているコードとは関係なく、このエラー メッセージが表示されます。これが MARS シミュレーターのバグなのか、それとも私が見逃しているものなのか疑問に思っているだけです。
私は現在、MIPS プロセッサの下でアセンブリ言語を使用しています。現在、MARS シミュレーターを使用していますが、理由は不明ですが、実行するたびに次のエラー メッセージが表示されます。
Go: try.s の実行
エラー: 無効なプログラム カウンタ値: 0
Go: 実行はエラーで終了しました。
使用しているコードとは関係なく、このエラー メッセージが表示されます。これが MARS シミュレーターのバグなのか、それとも私が見逃しているものなのか疑問に思っているだけです。
jr $ra
おそらく、 (return to caller)でプログラムを終了します。ただし、MARS によって実行されるコードには呼び出し元がありません。起動時に実行され、戻る関数がないため、の内容$ra
はゼロです。
MARS でプログラムを終了する正しい方法は、「exit」syscall を使用することです。
li $v0, 10
syscall
私は 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
main をスワップ前に移動したことに注意してください。main は予約済みのラベルだと誤解していました。そして、最初に自動的にメインに直接ジャンプします。しかし、メインで jal swap を呼び出す前に jr $ra 命令を実行していたため、そうではないようです。
とにかく、これが役立つことを願っています。
私はこの質問が古いことを知っていますが、私のようで必死に答えを探していた人は誰でも: return の代わりに上記の syscall を試し、メイン関数を他のすべてのラベルの前に置いてみてください。また、設定メニューの下に「定義されている場合はグローバル「メイン」へのプログラムカウンターの初期化」があります。がチェックされていることを確認してください。これを有効にすると、メイン ラベルを他のラベルの後に配置できるかどうかはわかりません。まだ試していないからです。私が説明したことは、それを機能させるために私がしたことであり、他には何もありません。幸運を!