29

アセンブリ命令のIntelOpcodeに関する資料を読んでいますが、opcodeバイトに続くとはどういう意味か理解できません。例:、、、、、。cw_ cd_/2cp/3

それが何を意味するのか、または完全なリファレンスをどこで見つけることができるのか、ヒントを教えてください。

E8 cw CALL rel16次の命令に対する近く、相対、変位を呼び出す
E8 cd CALL rel32次の命令に対する近く、相対、変位を呼び出す
FF / 2 CALL r / m16コールニア、絶対間接、r/m16で指定されたアドレス
FF / 2 CALL r / m32コールニア、絶対間接、r/m32で指定されたアドレス
9A cd CALL ptr16:16オペランドで指定された遠方、絶対、アドレスを呼び出す
9A cp CALL ptr16:32オペランドで指定された遠方、絶対、アドレスを呼び出す
FF / 3 CALL m16:16遠方、絶対間接、m16:16で指定されたアドレスを呼び出す
FF / 3 CALL m16:32 m16:32で指定された、遠方、絶対間接、アドレスを呼び出す
4

3 に答える 3

33
于 2017-01-12T15:14:24.723 に答える
21

私のお気に入りのソースは、インテル自体です。インテル®64およびIA-32アーキテクチャーソフトウェア開発者マニュアル。また、過去のバージョンとは異なり、すべてのボリュームが1つの(3044ページ)PDFにうまくまとめられています。

最も役立つセクションは、第2巻の第3章の3.1.1.1(私がこれを書いている日付の最新のPDFの432ページ)のようです。

于 2013-02-22T05:48:07.660 に答える
10

を含む、命令の即時バージョンの多くのオペコードは、ModR/Mバイト83の3ビット/rフィールドを3つの追加のオペコードビットとして使用します。Intelのvol.2マニュアルにはこれが記載されており、付録のオペコード表に含まれていると思います。

これが、 dst / srcオペランド、およびイミディエートオペランドを意味するオペコードのエンコードに両方のModRMフィールドが使用される場合とは異なり、または両方のModRMフィールドが使用される場合とは異なり、ほとんどのオリジナルの8086イミディエート命令がand r/m, immまだ2つのオペランドのみを許可する理由です。shrd eax, edx, 4imul edx, [rdi], 12345

SHRD / SHLDは386で追加され、imul-immediateは186で追加されました。copy-and-AND(and eax, edx, 0xf)がエンコードできないのは残念なことかもしれませんが、少なくともx86は非常に一般的なコピーと追加にLEAを使用できます。サブ操作。

しかし、すべての即時および1オペランドの命令(pushまたはなどnot)がそれ自体に対して完全なオペコードを必要とする場合、8086は1バイトのオペコードを使い果たしてしまいます。(特に、設計者がALとAXのmodrmバイトのない短い形式に多くのコーディングスペースを費やすことを選択したためです。たとえばcmp ax, 12345、16ビットモードでは4バイトではなく3バイトであるか、32cmp eax, imm32では6バイトではなく5バイトであるなどです。 cmp r/m32, imm32-ビットモード。シングルバイトのxchg-with-ax、および1バイトのinc / decレジスタの場合。)


例:デコード48 83 C4 38「レジスタ/オペコード」フィールドに応じて、1つのオペコードバイトをどのように異なる命令にデコードしますか?それは何ですか?、このQの複製から)

48はREX.Wプレフィックスです(Wビットのみが設定されているREXであるため、64ビットのオペランドサイズを示しますが、上位レジスタはありません)。

オペコード83は、「レジスタ/オペコードフィールド」と呼ばれるフィールドに応じて、7つの異なる命令になる可能性があると述べています

各命令の独自のドキュメント、たとえばadd(vol2マニュアルのhtml抽出)
REX.W + 83 /0 ibには、のようなエンコーディングが示されADD r/m64, imm8ています。これは、あなたが持っているものです。

wiki.osdev.orgのModRMビットフィールドの図

  7                           0
+---+---+---+---+---+---+---+---+
|  mod  |    reg    |     rm    |
+---+---+---+---+---+---+---+---+

0xc4 = 0b11000100であるため、regフィールド= 0です。したがって83 /0、Intelの表記では、オペコードはです。

残りのModRMフィールドは次のとおりです。

  • mode = 0b11であるため、rmフィールドは、アドレッシングモードのベースレジスタではなく、レジスタオペランドをエンコードします。
  • rm=0b100。reg#4 = SPL / SP / ESP/RSP。(この場合、RSPは64ビットのオペランドサイズであるため)。表については、Intelのマニュアル、またはhttps://wiki.osdev.org/X86-64_Instruction_Encoding#Registersを参照してください。

だから指示はadd rsp, 0x38

ndisasm -b64同意する:

$ cat > foo.asm
db 0x48, 0x83, 0xC4, 0x38
$ nasm foo.asm     # create a flat binary with those bytes, not an object file
$ ndisasm -b64 foo
00000000  4883C438          add rsp,byte +0x38
于 2018-12-30T08:37:23.430 に答える