2016-06-01 7 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> 

の操作を行います。

move <regdst>,<regsrc> 

moveを生成し、その意志[最も可能性が高い]擬似オペコードです:

addu <regdst>,<regsrc>,$zero 

または、次のようにすることもできます:

addiu <regdst>,<regsrc>,0 

サイドノート:私は前に完全な例外ハンドラを書いたので、最初の命令であることを確認してください[多かれ少なかれ]:

move $k0,$at 

そして、エピローグ次のようになります。

move $at,$k0 
eret 

また、通常の関数と同様にスタックフレームを確立します[sa他のすべてのレジスタを変更して終了]で終了します。

私がこれを言及している理由は、例外ハンドラはすべてのレジスタを保存して元の値に戻す必要があります。ベースコード(例:オーバーフロー例外をトラップして修正する可能性があります)。

これは[特に]ブレークポイントの処理にも当てはまります。

関連する問題