是否有x86操作码用于将立即字节移动到直接存储器位置(不使用寄存器)?

时间:2011-09-13 21:49:19

标签: assembly x86 opcodes

有没有办法将特定的立即字节大小的数字'移动到直接内存位置?即。

MOV 10h,ffffh

将值16写入内存地址65535?如果是,那是哪个操作码,或者我是否必须先将存储器地址存储到寄存器中?

2 个答案:

答案 0 :(得分:13)

是。操作码是C6。您应该下载英特尔ISA文档的副本,即freely available

您的后续问题:您的示例的完整编码是:

  c6      04      25   ff ff 00 00   10
opcode  modr/m   sib     address     immediate

答案 1 :(得分:5)

Intel Manual Volume 2 Instruction Set Reference - 325383-056US September 2015 第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是操作码,其中包含ModR / M 05,以及后续内容。