16

特定のイミディエートバイトサイズの数値をダイレクトメモリロケーションに「移動」する方法はありますか?つまり

MOV 10h,ffffh

16をメモリアドレスに書き込むには65535?もしそうなら、それはどのオペコードですか、それとも最初にメモリアドレスをレジスタに格納する必要がありますか?

4

2 に答える 2

14

はい。オペコードはC6. 無料で入手できるIntel ISA ドキュメントのコピーをダウンロードする必要があります。

あなたのフォローアップの質問に:あなたの例の完全なエンコーディングは次のとおりです:

  c6      04      25   ff ff 00 00   10
opcode  modr/m   sib     address     immediate
于 2011-09-13T21:53:37.153 に答える
7

インテル マニュアル ボリューム 2 命令セット リファレンス - 325383-056US 2015 年 9 月セクション 3.2「MOV—Move」には、以下を含む表があります。

Opcode            Instruction
----------------  ----------------
C6 /0 ib          MOV r/m8, imm8
C7 /0 iw          MOV r/m16, imm16
C7 /0 id          MOV r/m32, imm32
REX.W + C7 /0 io  MOV r/m64, imm32

次に、次のことを知っておく必要があります。

  • r/mレジスタまたはメモリの場所を意味します
  • imm即時を意味します

これらはあなたが探しているエンコーディングです。

より経験的には、それを試して逆コンパイルすることもできます。

mov byte [0x1234678], 0x9A

それで:

as --32 -o a.o a.S
nasm -felf32 -o a.o a.asm

与えます:

00000000 <.text>:
   0:    c6 05 78 56 34 12 9a    movb    $0x9a,0x12345678

c6したがって、これが Opcode であり、 ModR/M05とその直後にあると結論付けます。

于 2015-10-25T09:49:42.260 に答える