ModR/M
この記事はカテゴライズされていないか、不十分です。 |
ModR/Mバイトは、x86命令セットの命令エンコーディングの重要な部分である。
説明
編集x86のオペコードは通常1バイトだがしかし、2バイトの命令とプリフィックスも存在する。ModR/Mはオペコードに続くバイトで、命令がどのように実行されるかについての追加情報を追加する[1](§2.1)。フォーマットは以下の通りであり:
ビット | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
用途 | MOD | REG | R/M |
REGにはレジスタの指定が、R/MにはMODの値に応じてレジスタを格納するか、アドレッシングモードの指定が当て嵌まる。 一部の命令はModR/MバイトのREG部分を利用できない。これらの命令の多くは、(1つのオペコードで複数の命令を参照でき、そしてREGフィールドが命令を決定する)このフィールドを使用して「多重化」される(からである)。 オペコードのリストでは、これらはオペコードの後にスラッシュ (/) と数字0~7を続けることによって指定される[1](§3.1.1.1)。
64ビット切り替え
編集ModR/Mバイトは、AMDの64ビット拡張によってオリジナルの命令セットへ導入された変更の中心となる。ロングモードでは、最上位4ビットが0100
(10進数の4) であるオペコードは、新しいプリフィックスであるREXプリフィックスとみなされる[2](§1.2.7)。プリフィックスバイトの下位4ビットは、それに続くModR/MバイトのREGおよびR/Mフィールド用の追加ビットを含め、さまざまな目的に使用される。その他の変更点としては、これらの値を3ビットから4ビットに拡張すると、使用可能なプロセッサレジスタの数が8から16に倍増する[2](§1.4)。
SIBバイト
編集SIBバイトは、i386以降のx86アセンブリのオプションのポストオペコードバイトで、複雑なアドレス指定に使用される。 SIBバイトはModR/Mバイトと同様にフォーマットされ、(scale * index) + base + displacement
の形を取り、SCALEには1、2、4、または8が当て嵌まる。BASEとINDEXはそれぞれレジスタをエンコードする[3]。ディスプレイスメントは、最終アドレスに適用されるSIBバイトの後にエンコードされた定数オフセットである[4]。 REXプリフィックスを使用することにより、必要に応じてSIBバイトがSSEレジスタを使用できるようになる[1]。
ビット | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
用途 | SCALE | INDEX | BASE |
リファレンス
編集- ^ a b c Intel Corporation (2016年9月1日). “Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 2A”. 2021年9月13日閲覧。
- ^ a b Advanced Micro Devices (2021年3月1日). “AMD64 Architecture Programmer’s Manual Volume 3: General-Purpose and System Instructions”. 2021年9月13日閲覧。
- ^ “Encoding instructions”. University of Alaska Fairbanks. 28 July 2022閲覧。
- ^ “80386 Programmer's Reference Manual -- Section 17.2”. www.scs.stanford.edu. 28 July 2022閲覧。