5

命令のサイズとアドレス可能なスペースとはちょっと混乱しています(命令のサイズはアドレスビットのサイズと同じでなければならないと思います。私が正しいとすれば、理論的には、32ビットアーキテクチャ(RISCスタイル)で2^32のアドレス可能な単位(バイト)を持っていれば、どのように4バイトサイズのロード命令がオペコードとアドレスを保持していますか?どのように32ビットIRホールドロード命令ですか?(RISCスタイルの32ビットアーキテクチャ)

+0

あなたも、命令で*全く*アドレスのビットを持っていない可能性があり、あなたはあなたがいることを想定している – harold

+0

持っていきアドレッシングモードに依存します単一命令は、任意の絶対アドレスからのロードを符号化することができる。ジャンプに柔軟性を持たせるためのトリックがありますが、コードは非常に遠いかもしれないデータのハードコードされたアドレスを含む必要はありません。 –

+0

通常、即時モードを使用して任意のアドレスにアクセスすることはできません。 – Saravanan

答えて

1

範囲内で表現できる値の量を制限することによって、4バイト命令内で32ビットの即値をエンコードすることができます。

ARMは、イミディエイトを8ビットでエンコードし、さらに回転を指定する追加の4ビットフィールドをエンコードします。 CPUは、これらの8ビットをとり、4ビットフィールドで示される回数だけシフトすることによって即値を計算する。

2

メモリアクセス命令については、通常、命令はオフセット付きアドレスレジスタを使用します。フォームの何か:load R1, [R2 + 8]。 ARM、x86、MIPSなどがこのモードを提供しています。コードの隣にある定数をフェッチできるようにするために、アドレスレジスタとしてPCを使用するオプションがよくあります。

ジャンプ命令では、アドレスレジスタを使用するだけでなく、レジスタを使用せずにX命令を前後にジャンプさせるオフセットジャンプがあることがよくあります。オフセットは通常、範囲が制限されており、ある量だけシフトされます(2、4 ...の倍数のアドレスに制限される)ので、小さな即値のオペランドに収まるようになります。
MIPSは、絶対ジャンプと相対ジャンプの組み合わせも使用します。j命令は絶対アドレスにジャンプしますが、現在の命令の領域にジャンプします。正確に言えば、即時アドレスにはいくつかの上位ビットが欠けているので(それが収まるように)、代わりに現在のPCの上位ビットを使用します。

1

さらに1つのトリックがあります(ARMではこれも同じバージョンを使用します)。命令アドレスが4バイト境界でなければならない場合は、2つの最下位ビットを含めないでください。これでオペコードの2ビットが得られました。

一部のプロセッサでは、絶対アドレスはまったく直接的なものではなく、ちょっとした相対的なオフセットしかサポートしていません。これらのシステムでは、長いジャンプにトランポリンを使用しています。

3

1つの命令が任意の絶対アドレスからのロードをエンコードできると仮定しています。これはx86では64ビットモードでも当てはまります(ただし、64ビットの絶対アドレスからロードするための特別なオペコードがあり、置換またはインデックスレジスタはなく、destはraxでなければなりません)。

ほとんどのRISCアーキテクチャでは、通常、絶対アドレスからのロードは2つのmov即時命令で実行され、レジスタの上半分と下半分を設定し、そのレジスタを負荷のアドレスとして使用します。例えば

int a; 
int foo(void) { return a; } 

compiles to (ARM gcc 4.8.2 on godbolt)

foo(): 
    movw r3, #:lower16:.LANCHOR0 @ tmp113, 
    movt r3, #:upper16:.LANCHOR0 @ tmp113, 
    ldr r0, [r3] @, a 
    bx lr @ 
a: 
    .space 4 
関連する問題