0

addi命令がオーバーフロー例外を引き起こすことに気づきました。私は現在、Bluespec HDLを使用して、例外の原因となるプロセッサをシミュレートし、それらを適切に処理しています。

とにかく、私は特にMIPSのaddiコマンドを使用してオーバーフロー例外をトリガーするいくつかのテストケースを書いています。

:私がテストしているプロセッサはSMIPSベースですが、例外や割り込みなどの目的でいくつかのMIPS命令をサポートしています。

オーバーフローを検出するためのロジックが正しいことを知っています(以下の擬似コード):

if (function == Addi) begin
  if(( a < 0 && b < 0 && result >= 0) || (a >0 && b > 0 && result < 0))
    return True;
  else 
   return False;
end

質問:オーバーフローの例は何ですか:私は次のことを試みています:(を使用したインラインアセンブリ__asm__

 addi $2, $0, 0x7fff
 addi $3, $2, 0x000f

これは例外をスローしていません。そして私がこれを試してみると:

 addi $2, $0, 0x7fffffff
 addi $3, $2, 0x0000000f

イミディエートは16ビットでなければならないため、アセンブラエラーが発生します。andiからオーバーフローを取得するにはどうすればよいですか?良い例を教えてください...上位ビットを埋めるために他の命令を使用する必要がありますか?

ありがとうございました

4

1 に答える 1

1

レジスタは32ビットであるため、最初のシーケンスではオーバーフロー例外は発生しません。32767 + 15 = 32782、32ビット以内。

MIPSの単一の命令で大きなイミディエートをロードすることはできません。最初にLUI命令を使用して上位16ビットをロードし、次にADDI(またはORI、またはXORI)を下位16ビットにロードします。

LWを使用して、メモリから32ビット値を取り込むこともできます。

于 2013-03-07T18:36:15.400 に答える