有没有一种x86指令,可以将一个立即字节移动到一个直接的内存位置(不使用寄存器)?

18

有没有一种方法可以将特定的立即字节大小的数字移动到直接内存位置中?例如:

MOV 10h,ffffh

我需要将值16写入内存地址65535,应该使用哪个操作码?还是需要先将内存地址存储到寄存器中再进行操作?


4
在Intel语法中,mov byte ptr [0ffffh], 10h。在AT&T语法中,movb $0x10, 0xffff。请查阅您的汇编器文档以获取更多详细信息。 - Raymond Chen
2个回答

15

是的。操作码是C6。您应该下载英特尔ISA文件副本,这些文件可以免费获取

至于您后续提出的问题:您示例的完整编码为:

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

谢谢Stephen,但是C6指令不需要一个r/m字节吗?如果是这种情况,那么得到的指令只有四个字节长,肯定不足以容纳完整的内存地址,对吧? - Nicholas Hill
1
@Nicholas Hill:得到的指令长度并不只有4个字节。 - Stephen Canon

10

英特尔手册第2卷指令集参考 - 325383-056US 2015年9月 第3.2节“MOV-移动”包含以下表格:

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,并且后面跟着立即数。

https://www.felixcloutier.com/x86/mov 上有您引用的手册条目。如何阅读英特尔操作码符号详细介绍了如何阅读/0部分(那里的另一个答案提供了有关阅读其余条目的信息)。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接