命令のサイズとアドレス可能なスペースとはちょっと混乱しています(命令のサイズはアドレスビットのサイズと同じでなければならないと思います。私が正しいとすれば、理論的には、32ビットアーキテクチャ(RISCスタイル)で2^32のアドレス可能な単位(バイト)を持っていれば、どのように4バイトサイズのロード命令がオペコードとアドレスを保持していますか?どのように32ビットIRホールドロード命令ですか?(RISCスタイルの32ビットアーキテクチャ)
答えて
範囲内で表現できる値の量を制限することによって、4バイト命令内で32ビットの即値をエンコードすることができます。
ARMは、イミディエイトを8ビットでエンコードし、さらに回転を指定する追加の4ビットフィールドをエンコードします。 CPUは、これらの8ビットをとり、4ビットフィールドで示される回数だけシフトすることによって即値を計算する。
メモリアクセス命令については、通常、命令はオフセット付きアドレスレジスタを使用します。フォームの何か:load R1, [R2 + 8]
。 ARM、x86、MIPSなどがこのモードを提供しています。コードの隣にある定数をフェッチできるようにするために、アドレスレジスタとしてPCを使用するオプションがよくあります。
ジャンプ命令では、アドレスレジスタを使用するだけでなく、レジスタを使用せずにX命令を前後にジャンプさせるオフセットジャンプがあることがよくあります。オフセットは通常、範囲が制限されており、ある量だけシフトされます(2、4 ...の倍数のアドレスに制限される)ので、小さな即値のオペランドに収まるようになります。
MIPSは、絶対ジャンプと相対ジャンプの組み合わせも使用します。j
命令は絶対アドレスにジャンプしますが、現在の命令の領域にジャンプします。正確に言えば、即時アドレスにはいくつかの上位ビットが欠けているので(それが収まるように)、代わりに現在のPCの上位ビットを使用します。
さらに1つのトリックがあります(ARMではこれも同じバージョンを使用します)。命令アドレスが4バイト境界でなければならない場合は、2つの最下位ビットを含めないでください。これでオペコードの2ビットが得られました。
一部のプロセッサでは、絶対アドレスはまったく直接的なものではなく、ちょっとした相対的なオフセットしかサポートしていません。これらのシステムでは、長いジャンプにトランポリンを使用しています。
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
- 1. 64ビットアーキテクチャの32ビットOS
- 2. mipsには32ビットのアドレスと32ビットの命令がありますか?
- 3. OpenCL:GPU上の32ビットおよび64ビットpopcnt命令?
- 4. 64ビットアセンブリの命令の32ビットのもの
- 5. 32ビットアーキテクチャ上で2つの10桁の32ビットの数値を掛ける
- 6. 64〜32ビットInterop - どのように?
- 7. 32ビットアーキテクチャの64ビットオペランドでの操作?
- 8. 32ビットアーキテクチャのCプログラムのコンパイルとリンク
- 9. 32ビットレジスタ/命令をリアルモードで使用できますか?
- 10. 32ビット/ 64ビットOS?
- 11. Officeの32ビットdll 64ビット
- 12. 32ビット対64ビットのカスタムフレームワーク
- 13. 32ビットと64ビットのセットアッププロジェクト
- 14. ARM Thumb命令セットを使用する場合、32ビット整数にアクセス(ロード/ストア)するのはアトミックですか?
- 15. Flywaydb 32ビット版
- 16. microsoft.rtc.collaboration 32ビット
- 17. シャードサイズ(32ビット)?
- 18. LoadLibrary Win7でエラー32ビット、Win XPで成功32ビット
- 19. 32ビットIntelプロセッサでのメモリアライメント
- 20. 64ビットの数値をVBScriptの上位32ビットと下位32ビットに分割するにはどうすればよいですか?
- 21. 64ビットアプリケーションの32ビット部分をどのようにデバッグ(GDB)できますか?
- 22. ubuntu 11.10 64ビットvs 32ビット
- 23. 32ビット、64ビット、参照ライブラリ
- 24. Java intは常に32ビットですか?
- 25. 32ビットLinuxクロック()オーバーフロー
- 26. 64ビットのDLLを32ビットのJVMにロードできますか?
- 27. 64ビットアーキテクチャと32ビットインテルアーキテクチャでアプリケーションをどのように実行する必要がありますか?
- 28. minSdkVersion正の32ビット整数
- 29. Ubuntuの32ビットsourceguardianエラー
- 30. は、32ビットの窓使用
あなたも、命令で*全く*アドレスのビットを持っていない可能性があり、あなたはあなたがいることを想定している – harold
持っていきアドレッシングモードに依存します単一命令は、任意の絶対アドレスからのロードを符号化することができる。ジャンプに柔軟性を持たせるためのトリックがありますが、コードは非常に遠いかもしれないデータのハードコードされたアドレスを含む必要はありません。 –
通常、即時モードを使用して任意のアドレスにアクセスすることはできません。 – Saravanan