16

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

MOV 10h,ffffh

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

4

2 回答 2

14

是的。操作码是C6。您应该下载一份免费的英特尔 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是操作码,ModR/M05和立即数紧随其后。

于 2015-10-25T09:49:42.260 回答