x87FPU命令のデコードに関してあいまいなケースに直面しています。Vol2AIntelの命令セットマニュアル[1]の3-380ページから抜粋した次の命令を参照してください。
D9 /0 --> FLD m32fp --> Push m32fp onto the FPU register stack.
D9 C0+i --> FLD ST(i) --> Push ST(i) onto the FPU register stack.
これらの命令は両方とも同じシングルバイトベースのオペコードを持っています0xD9
。最初の命令の拡張オペコードは0x00
。です。拡張オペコードは、ModR/Mバイトの「reg」フィールドで指定されます。ただし、2番目の命令は、「レジスタを取得するために追加」機能を備えた2バイトのオペコードです。この意味は:
D9 C0 --> FLD ST0
D9 C1 --> FLD ST1
(and so on)
これら2つの指示を区別することに関して私は小さな問題を抱えています。小さな例は次のとおりです。
ここで、オペコードシーケンスを取得するとします"D9 C1"
。それが命令"FLD m32fp"
であるかどうかを確認する必要がある場合は、ModR/Mバイトの「reg」フィールドが0x00であるかどうかを確認する必要があります。もしそうなら、それは確か"FLD m32fp"
に使用されている命令です。
のバイナリ表現はC1
です"1100 0001"
。bit0がLSBであるとすると、bit3-bit5(両端を含む)はModR/Mバイトの「reg」フィールドを構成します"C1"
。0x00
確かに(3つのゼロ)であることがわかります。
そこで、オペコードシーケンス"D9 C1"
を命令にマッピングし"FLD m32fp"
ます。"ecx"
さらにデコードすると、この場合、オペランドが実際になることがわかります。しかし、これに"FLD ST1"
もオペコードシーケンス"D9 C1"
があり、これがそのオペコードシーケンスに使用されている実際の命令であることがわかります。
"D9 C1"
本質的に、オペコードシーケンスが命令に対応し、では"FLD ST1"
ないことをどのように確認でき"FLD ecx"
ますか?
"FMUL"
ここと同じようにオペランドをとるので、命令についても非常によく似た問題が発生"FLD"
します。
[1] http://www.intel.com/design/intarch/manuals/243191.HTM
よろしくお願い
いたします。HrishikeshMurali