X86-64 Instruction Encoding

General Overview

x86-64 instruction最多15字节,include:

  • Legacy prefixes(1-4 bytes 非必须)
  • Opcode with prefixes(1-4 bytes 必须)
  • ModR/M(1 byte 必须)
  • SIB(1 byte scale index base 必须)
  • Displacement(1,2,4 or 8 bytes 非必须)
  • Immediate(1,2,4 or 8 bytes 非必须)

Legacy Prefixes

Opcode

x86-64 instruction定义了许多操作码和编码方式,取决于指令本身及其功能

Legacy opcodes

Legacy (and x87) opcodes consist of, in this order:

  • mandatory prefix;
  • REX prefix;
  • opcode.

Encoding

img|720x227

  • W 为1时表示64位,为0时取默认值(大多数但并非所有指令都是 32 位)
  • R MODRM.reg 字段的扩展
  • X SIB.index 字段的扩展
  • B MODRM.rm 字段或 SIB.base 字段的扩展

opcode

opcode可以是1,2,3个字节

  • <op>
  • 0x0F <op>
  • 0x0F 0x38 <op>
  • 0x0F 0x3A <op>

ModR/M and SIB bytes

ModR/M 和 SIB 字节用于对一条指令的操作数(最多两个)进行编码,每个操作数都是直接寄存器或有效内存地址。

ModR/M

全称:Mode-Register/Memory
img|720x164

  • MODRM.mod 该字段为b11时采用直接寻址方式,否则为间接寻址
  • MODRM.reg 有两种情况
    • A 3-bit opcode extension 由某些指令使用,但除了将该指令与其他指令区分开来之外没有其他含义。
    • A 3-bit register reference 可用作指令的源或目标(取决于指令),引用的寄存器取决于指令的操作数大小和指令本身。REX.R、VEX.~R 或 XOP.~R 字段可以将此字段从 1 个最高有效位扩展为总共 4 位。
  • MODRM.rm 指定直接或间接寄存器操作数,可选地带有位移,REX.B,VEX.B或XOP.B字段可以将此字段从1个最高有效位扩展至总共4位。

SIB

img

实战运用

0x49最低位为1拓展了MODRM.rm,0x00选取寄存器r8,0x48最低为为0,0x03选取寄存器rbx
img|529x96
以ptrace读取寄存器的值后模拟执行
img|720x333
参考文章:
https://wiki.osdev.org/X86-64_Instruction_Encoding#32/64-bit_addressing_2
https://blog.csdn.net/JimFire/article/details/112652145

posted @ 2025-07-24 22:26  Un1corn  阅读(25)  评论(0)    收藏  举报