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

リファレンス

編集
  1. ^ a b c Intel Corporation (2016年9月1日). “Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 2A”. 2021年9月13日閲覧。
  2. ^ a b Advanced Micro Devices (2021年3月1日). “AMD64 Architecture Programmer’s Manual Volume 3: General-Purpose and System Instructions”. 2021年9月13日閲覧。
  3. ^ Encoding instructions”. University of Alaska Fairbanks. 28 July 2022閲覧。
  4. ^ 80386 Programmer's Reference Manual -- Section 17.2”. www.scs.stanford.edu. 28 July 2022閲覧。

関連項目

編集