特定のイミディエートバイトサイズの数値をダイレクトメモリロケーションに「移動」する方法はありますか?つまり
MOV 10h,ffffh
値16
をメモリアドレスに書き込むには65535
?もしそうなら、それはどのオペコードですか、それとも最初にメモリアドレスをレジスタに格納する必要がありますか?
はい。オペコードはC6
. 無料で入手できるIntel ISA ドキュメントのコピーをダウンロードする必要があります。
あなたのフォローアップの質問に:あなたの例の完全なエンコーディングは次のとおりです:
c6 04 25 ff ff 00 00 10
opcode modr/m sib address immediate
インテル マニュアル ボリューム 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
とその直後にあると結論付けます。