首页 文章

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

提问于
浏览
14

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

MOV 10h,ffffh

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

2 回答

  • 13

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

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

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

    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 ,以及后续内容 .

相关问题