MIPSの学習を始めたばかりで、ジャンプ命令と分岐命令の範囲を理解するのに困っています。私は、遠いPCがどのようにジャンプしたり分岐したりできるかに限界があることを知っていますが、理由は分かりません。MIPSのジャンプと分岐命令の範囲
PC
の現在の値が0x00000000
の場合は、1つのJUMPをランダムアドレスにすることは可能ですか? PC
の現在の値が0x00000600
の場合、1つのブランチをランダムなアドレスにすることは可能ですか?
MIPSの学習を始めたばかりで、ジャンプ命令と分岐命令の範囲を理解するのに困っています。私は、遠いPCがどのようにジャンプしたり分岐したりできるかに限界があることを知っていますが、理由は分かりません。MIPSのジャンプと分岐命令の範囲
PC
の現在の値が0x00000000
の場合は、1つのJUMPをランダムアドレスにすることは可能ですか? PC
の現在の値が0x00000600
の場合、1つのブランチをランダムなアドレスにすることは可能ですか?
MIPSプロセッサは、各命令語がワード(つまり4バイト== 32ビット)の固定サイズの命令を使用します。したがって、これらの4バイトに詰めることができる情報は非常に限られています。
命令は、32ビットのうち6つを使用してオペコードを指定します。ターゲットアドレスを指定するために26ビットが残されます。
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
命令を使用したい場合。
命令のアドレスの4つの最上位ビット、すなわちPCを(26ビットの)ジャンプアドレスに追加するのはなぜですか? これらの4つのシグネチャビットが何を意味するのか?そしてなぜ最初の4ビットだけ。 – hsnsd
@hsnsd:飛び越しが発生すると、これらの26ビットが2ビット左にシフトされて元の28ビットが得られ、次にそれらは ' J "/" JAL "を使用して32ビットアドレス" _。それは指示がどのように働くかです。 – Michael