有没有一种方法可以将特定的立即字节大小的数字移动到直接内存位置中?例如:
MOV 10h,ffffh
我需要将值16
写入内存地址65535
,应该使用哪个操作码?还是需要先将内存地址存储到寄存器中再进行操作?
有没有一种方法可以将特定的立即字节大小的数字移动到直接内存位置中?例如:
MOV 10h,ffffh
我需要将值16
写入内存地址65535
,应该使用哪个操作码?还是需要先将内存地址存储到寄存器中再进行操作?
是的。操作码是C6
。您应该下载英特尔ISA文件副本,这些文件可以免费获取。
至于您后续提出的问题:您示例的完整编码为:
c6 04 25 ff ff 00 00 10
opcode modr/m sib address immediate
英特尔手册第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
,并且后面跟着立即数。/0
部分(那里的另一个答案提供了有关阅读其余条目的信息)。 - Peter Cordes
mov byte ptr [0ffffh], 10h
。在AT&T语法中,movb $0x10, 0xffff
。请查阅您的汇编器文档以获取更多详细信息。 - Raymond Chen