命令プリフィックス

読み:めいれい・プリフィックス
外語:instruction prefix
品詞:名詞

オペコードの前に置いて使う、機能を変更したり指示したりするプリフィックス

CISCなどにおいて、命令を拡張したり、単純な命令の幅を広げたりする際に用いられる。

対してRISCの場合は、大抵は固定長命令を採用するため、こういったものは稀である。

IA-32

IA-32では、次のようなプリフィックスが使われている。

  1. オペランドサイズプリフィックス (66)
  2. アドレスサイズプリフィックス (67)
  3. セグメントオーバーライドプリフィックス (26、2E、36、3E、64、65)
  4. リピートプリフィックス (F2、F3)
  5. REXプリフィックス (40〜4F)
  6. VEXプリフィックス (C4、C5)

オペランドサイズプリフィックス

i386から採用された。

リアルモードでは、従来の16ビット命令の頭に「66」を置くことで、オペランドサイズが32ビットとなる。

66 41 ‐ inc eax

41 ‐ inc ax

プロテクトモードでは、従来の16ビット命令はそのままで32ビット命令となっているため、命令の頭に「66」を置くことで16ビット命令とする。

41 ‐ inc eax

66 41 ‐ inc ax

なお、SSE命令(0F xx xx)では、66は本来の意味とは無関係に命令拡張用プリフィックスとして用いられている。

アドレスサイズプリフィックス

i386から採用された。

命令の頭に「67」を置くことで、オフセットアドレスサイズが32ビットとなる。

66 a1 34 12 ‐ mov eax, [1234h]

67 66 a1 78 56 34 12 ‐ mov eax, dword ptr [12345678h]

オペランドサイズプリフィックスよりも前に置く。

セグメントオーバーライドプリフィックス

リアルモードでは、アドレスの指定にセグメントを用いる。プロテクトモードではセグメントが不要になったので、代わりにセレクタとなった。

80286まではCS、SS、DS、ESがあり、i386からFS、GSが追加されている。

  • 2E ‐ CS(コードセグメント)
  • 36 ‐ SS(スタックセグメント)
  • 3E ‐ DS(データセグメント)
  • 26 ‐ ES(データセグメント)
  • 64 ‐ FS(データセグメント)
  • 65 ‐ GS(データセグメント)

リピートプリフィックス

主としてストリング命令の前に付けて用いるプリフィックスである。次の二種類がある。

  • F2 ‐ REPNE/REPZE
  • F3 ‐ REP/REPE/REPZ

なお、SSE命令(0F xx xx)は、F2/F3は本来の意味とは無関係に命令拡張用プリフィックスとして用いられている。

REXプリフィックス

REXプリフィックスは、AMD64 ISA/Intel 64で採用された、命令を64ビットに拡張するプリフィックスである。

オペランドの64ビット化、追加されたレジスタの指定などに用いる。

VEXプリフィックス

開発コードネーム「Sandy Bridge」から搭載予定の拡張命令セット。

複雑化したMMX/SSE命令の整理と、更なる拡張を目的として新設される予定。

拡張が続き、複数のプリフィックスによって表現されていた命令を、新設するプリフィックスとその後に続くペイロードによってシンプルに表現し、命令解読の簡略化と高速実行の両立を目指すもの。