以前回复别人的一段话,贴给楼主.
=====================
【汇编和译码】
代码是被汇编成CPU指令序列的,每条指令都必须遵循Intel的变长指令格式,略。
然后在程序运行的时候,CPU内部会有专门的取指单元来取指,指令译码单元来解析指令的操作方式、操作数、寻址方式、特殊用途等等。
【域的概念】
也就是说汇编的时候会将代码转换成一个【二进制数据流】,运行的时候再对这个二进制数据流的每个【域】(关于域的定义和分类,参照Intel指令格式)进行”查表“(从人类的理解角度来表述,Intel确实有关于指令细节的描述表格,逆向必备),确定该指令的具体动作和约束。
举例来讲:opcode.w 用来控制 operand size,
当 w = 0 时:operand size 是 byte
当 w = 1 时:operand size 是 default operand size
【速成部分 --- 指令的核心】
简单地讲x86/x64 通用指令编码的核心是:Opcode,ModRM 以及 SIB这三个部分
Opcode 提供指令的操作码
ModRM 提供操作数的寻址,以及对 opcode 进行辅助补充
SIB 提供更丰富的 memory 寻址
依旧举例,在8086指令集中,有如下的对应关系
89D8 mov eax,ebx
88D8 mov al,bl
1)这两条指令的区别在于Operand的size,一个是2字节,一个是1字节
opcode = 89 ,也就是1000 100【1】 默认大小(8086的16位模式)
opcode = 88, 也就是1000 100【0】 byte
2)联系就是,他们的寻址方式是一样的,也就是ModRM是一致的!