宿題から質問があります。
でBNE
指示0x88888888
があり、合法的なジャンプ範囲を教えておく必要があります。
私の理論は、オフセットが私に行くことができることを教えてくれるということです:
- 0x8888888から-4*2 15
- 0x88888888 + 4 *(2 15 -1)へ
なぜ、どのように機能するのか本当にわかりません。誰か説明してもらえますか?
http://en.wikipedia.org/wiki/MIPS_architectureなどの命令エンコーディングを示す命令リファレンスを検索します
000100ss sssttttt CCCCCCCC CCCCCCCC
sとtは、比較対象のレジスタを5ビット保持し、それぞれ0〜31個のレジスタを提供します。下位16ビットは、命令単位のオフセットです。
(mipsの場合)プログラマーの観点から、プログラムカウンターは1命令先、4バイトであると想定します。したがって、アドレス0x88888888の場合、アドレス0x88888888 + 4=0x8888888Cを使用して計算を行います。
命令エンコーディングは2の補数を使用するため、最大順方向分岐は0x7FFF命令であり、0x7FFF << 2=0x1FFFCバイトです。符号拡張が0xFFFF8000命令の場合、最大後方分岐は0x8000で、バイト数は0xFFFF8000 << 2 = 0xFFFE000
0x8888888C + 0x0001FFC = 0x888A8888
0x8888888C + 0xFFFE000 = 0x88868888
プログラムカウンターの調整は、動作中のアセンブラーによって生成された動作中のコードの逆アセンブルから理解するのは非常に簡単です。(さらに、少なくとも使用する必要のあるビット数を確認するのに十分な命令リファレンス)。
00002030 <back>:
2034:
2038: 1443fffd bne v0,v1,2030 <back>
203c: 00000000 nop
2040: 1443fffb bne v0,v1,2030 <back>
2044: 00000000 nop
2048: 1443fff9 bne v0,v1,2030 <back>
204c: 00000000 nop
2050: 14430003 bne v0,v1,2060 <fore>
2054: 00000000 nop
2058: 14430001 bne v0,v1,2060 <fore>
205c: 00000000 nop
00002060 <fore>:
0x1443FFFDと0x1443FFFBは8バイト離れており、2つの命令が離れています。命令のオフセットの違いは2のカウントであるため、エンコードはバイトやハーフワードではなく、命令/ワードの単位で行われることを意味します。前方参照は最初に行うのが簡単です0x2060-0x2050は0x10バイトで、これは4命令です。オフセットは3命令、0x2060から3命令を引いたものは、bneを実行する命令の次の命令0x2054です(多くの意味があります。パイプライン化されているかどうかに関係なく、PCは通常、実行するまでに少なくとも次の命令にあります。あなたがPCで数学を実行するとき、PCはすでにそれを進めています)。これは、他の3つのブランチで確認できます。0x2058は、等しくない場合は1つの命令ヘッドを分岐することを示します。これは、PCが1つ先の0x205Cであることを意味します。0xFFFD、反転して1=2 + 1 = 3を追加します。したがって、3つ戻り、0x2030に到達するには、エンコードされた命令の1つ前の0x203Cにいる必要があります。0xFFFB 4 + 1 = 5、5命令戻ります。これは、0xFFFBでエンコードされた分岐後の命令である0x2044から開始することを意味します。
他の命令セットはそれほど単純ではありません。Armはかなり単純です。armモードとthumbモードはどちらも、命令の先頭を含むアドレスから2命令先にあると想定しているため、thumbモードでは4バイト、armモードでは8バイトです。主に32ビット命令であるthumb2でさえ、プログラマーの観点から見たプログラムカウンターは2命令先にあります。
可変ワード長の命令セット。arm、mipsなどほど規則的ではありません。実際のアドレスがプリフェッチされているにもかかわらず、ハードウェアはthumb2の場合と同じように固定ルールを使用します。または、命令のサイズからプログラムカウンターがどこにあるかを知り、その参照を使用する必要があります。これらのプロセッサでの最初のカットは、実行時に1つまたは2つの命令のすぐ前にあった可能性がありますが、それらの多く(arm、mips)に埋め込まれたパイプラインは通常ですが、はるかに先にある可能性があります。分岐予測を使用してスーパースカラーを使用すると、フェッチはどこにでも行うことができ、ハードウェアのレジスタに触れることもできます(たとえば、優れたハードウェア設計では、単純な読み取りでは何も変更されず、書き込みのみで、値を読み取らず、ハードウェアポインタが自動インクリメントされます。
このSPIMリファレンスには次のように書かれています。
分岐命令は、符号付き16ビットオフセットフィールドを使用します。したがって、2 15 -1命令(バイトではない)を前方にジャンプしたり、215命令を後方にジャンプしたりできます。
命令は常に4バイト幅であるように見えるので、あなたの推論は正しいように見えますが、あなたは符号を交換しました。
(下位アドレスへの)最大後方分岐は2 15 -1命令、つまり32767命令または131068バイトであるため、に到達できます0x88888888 - 131068 = 8886888c
。
同様に、最大フォワードブランチはに移動し0x88888888 + 131072 = 0x888a8888
ます。