硬编码基础三(变长指令的查询方式)
intel指令的格式可以看作如下形式:
前缀+操作码+modrm+sib+偏移+立即数
其中操作码决定了是否存在moderm
modrm中的rm位决定了是否存在sib
这边举个例子,
在intel白皮书中的A附录中的A.3章节有一个opcode的map表
在这个表里写了88这个操作码,他的格式是
0x88: mov Eb,Gb
其中b代表了长度为byte
E表示的是寄存器或者内存
G表示的是通用寄存器
E的意思可以在白皮书的2.1.2章节中找到具体的描述
88这个操作码表示说这个操作码后面会存在modrm字段
modrm字段的具体信息在白皮书的2.1.5章的2-2表中有详细描述(2-1是16位模式下的这张表)
modrm的格式是2位的mod 3位的源寄存器 3位的r/m描述
如图中所示
0x88 0b00_001 _000就代表了格式是mov byte ptr [eax], al
同理表中的其他写明了寄存器的行也是这样看的
要说的是当mod=100的时候表明了会跟随sib描述
sib的具体信息在白皮书的2-3的表中存在详细介绍
比如说0x88 0b00_100 _000 0b00_001_010就表明了
格式是mov byte ptr [edx+ecx*2的0次方], al
这种变长指令的部分就只能多根据白皮书去查了,熟能生巧