代码之家  ›  专栏  ›  技术社区  ›  SoggyPancakes

机器代码中引用寄存器

  •  5
  • SoggyPancakes  · 技术社区  · 7 年前

    this as reference for opcodes for x86 this as reference for registers in x86 。我遇到了这些命令,我意识到我仍然错过了一大块拼图。

    8B 45 F8       - mov eax,[ebp-08] 
    8B 80 78040000 - mov eax,[eax+00000478]
    8B 00          - mov eax,[eax]
    

    基本上我不明白操作码后的两个字节是什么意思,我找不到任何地方可以提供命令的逐位格式

    CPU如何知道每个命令的长度?

    我认为可以将寄存器限制为只能使用16b和16b,32b和32b,但这只会释放一个位,不足以告诉CPU偏移量是多少字节。

    哪些值对应于哪些寄存器?

    1 回复  |  直到 7 年前
        1
  •  8
  •   prl    7 年前

    操作码后的第一个字节是ModR/M字节。您链接的第一个引用包含页面末尾的ModR/M字节表。对于这样的内存访问指令,ModR/M字节表示正在加载或存储的寄存器以及用于内存访问的寻址模式。

    ModR/M字节后面的字节取决于ModR/M字节的值。

    指令的操作数大小可以隐含在指令中,也可以由指令前缀指定。例如,对于mov指令,66前缀将表示16位操作数,如您的示例中所示。如果使用64位模式,48前缀将指示64位操作数。