2016-04-06 77 views
2

MIPSの学習を始めたばかりで、ジャンプ命令と分岐命令の範囲を理解するのに困っています。私は、遠いPCがどのようにジャンプしたり分岐したりできるかに限界があることを知っていますが、理由は分かりません。MIPSのジャンプと分岐命令の範囲

PCの現在の値が0x00000000の場合は、1つのJUMPをランダムアドレスにすることは可能ですか? PCの現在の値が0x00000600の場合、1つのブランチをランダムなアドレスにすることは可能ですか?

答えて

5

MIPSプロセッサは、各命令語がワード(つまり4バイト== 32ビット)の固定サイズの命令を使用します。したがって、これらの4バイトに詰めることができる情報は非常に限られています。

命令は、32ビットのうち6つを使用してオペコードを指定します。ターゲットアドレスを指定するために26ビットが残されます。

  • ターゲットアドレスの下位28ビットは右に2ビットシフトされていますが、ターゲットアドレスの下位28ビットは右にシフトされていますが、次に26個の最下位ビットが命令語に格納されます。すべての命令はワードで整列されなければならないので、シフトアウトした2ビットは常にゼロになるので、再作成できない情報は失われません。
  • ジャンプが発生すると、これらの26ビットが左に2ビットシフトされて元の28ビットが得られ、次にそれらはJ/JALに続く命令のアドレスの4つの最上位ビットと結合されて、ビットアドレス。

これは、ジャンプ命令が置かれているのと同じ256メガバイトレンジ(2^28)のいずれかの命令にジャンプすることができる。


分岐命令に利用可能な16ビットが存在しますターゲットアドレスを指定します。これらは、分岐命令に続く命令に関連した符号付きオフセットとして格納されます(シフトの2ビットが適用されます。これは、常に0であることがわかるものを格納する必要がないためです)。したがって、2つの最下位ビットを復元した後の実際のオフセットは18ビットであり、32ビットに符号拡張され、分岐命令に続く命令のアドレスに加算される。これにより、分岐命令内で+/- 128kBに分岐することができます。


は、アドレス0x00400024にロードされた次のコードを検討:

main: 
j foo 
nop 
foo: 
b main 
nop 

j foo命令0x0810000bとして符号化されます。下位26ビットは値0x10000bを持ち、2ビット左へシフトした後に0x40002cになります。 jに続く命令のアドレスの上位4ビットはゼロであるため、ターゲットアドレスはになります。これは0x40002cに等しく、アドレスはfooになります。

b main命令は、0x0401fffdとしてエンコードされます。 16個の最下位ビットは値0xfffdを持ち、2ビット左へシフトすると0x3fff4になります。これを32ビットに符号拡張すると0xfffffff4となります。そして、それをbに続く命令のアドレスに加えると、0x400030 + 0xfffffff4が得られます。これは、(32ビットに切り捨てられると)0x400024に等しくなります。アドレスはmainです。


あなたは、いくつかの任意のアドレスにジャンプアドレスをレジスタにロードし、ジャンプするjrまたはjalr命令を使用したい場合。

+0

命令のアドレスの4つの最上位ビット、すなわちPCを(26ビットの)ジャンプアドレスに追加するのはなぜですか? これらの4つのシグネチャビットが何を意味するのか?そしてなぜ最初の4ビットだけ。 – hsnsd

+0

@hsnsd:飛び越しが発生すると、これらの26ビットが2ビット左にシフトされて元の28ビットが得られ、次にそれらは ' J "/" JAL "を使用して32ビットアドレス" _。それは指示がどのように働くかです。 – Michael

関連する問題