1 x86的编码格式
x86采取可变长度的方式进行编码,其主要原因应是8086的机器性能不高,导致编码越短越好。而8086的编码模式相较于x64较简单,且x64兼容x86编码,所以,以下阐述将由8086一直讲到x64
1.1 8086编码
8086采取以下编码格式

其中opcode是必须的,其他的是可选的
opcode
opcode的格式前6位表示操作,后2位分为d or s以及w位

Mod R/M

Mod R/M表示寻址方式,下表表示寻址的类型
| ModRM.mod | 寻址模式 | 描述 |
|---|---|---|
| 00 | [base] | 内存寻址,提供[base]形式的memory寻址 |
| 01 | [base+disp8] | 内存寻址,提供[base+disp8]形式的memory寻址 |
| 10 | [base+disp16] | 内存寻址,提供[base+disp32]形式的memory寻址 |
| 11 | register | 两个寄存器之间赋值 |
首先以mod=11为例进行阐述
首先制定reg域的编码规则,此规则适用于任何mod方式
| REG | W=0 | W=1 |
|---|---|---|
| 000 | AL | AX |
| 001 | CL | CX |
| 010 | DL | DX |
| 011 | BL | BX |
| 100 | AH | SP |
| 101 | CH | BP |
| 110 | DH | SI |
| 111 | BH | DI |
假设指令为mov %sp %bp则指令序列为89 e5,根据上述的格式可知
89为opcode,e5为ModRM,对89进行分析
1000,1001==>[1000,00]为opcode
==>[01]为DW,其中W表示16位的值
对e5进行分析
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oxZJsKYA-1655714796572)(./images/regreg.png)].
下面以mod==00与mod=01为例进行解释
-
mod==00表示直接按照内存基址的方式进行访问
R/M 译码 000 [BX+SI] 001 [BX+DI] 010 [BP+SI] 011 [BP+DI] 100 [SI] 101 [DI] 110 111 [BX]
SI为源变址寄存器
DI为目的编制寄存器
这两个寄存器在8086中有特殊用途,此处不涉及,不赘述
由于ModR/M中的可执行操作可分为
- Register -> Memory
- Memory -> Register
因此,不管是何种方式,只要是有内存相关的数据,一定是放在r/m域中,而单纯寄存器相关的放在Register中
同理也可指mod=01及mod=10,其译码值只需要查表可知

本文详细探讨了从8086的内存寻址到x86-64的扩展,包括ModR/M编码、指令前缀、MMX和SSE技术,以及x64的REXprefix和扩展寄存器。重点介绍了x64编码的兼容性和新特性,适合理解现代CPU指令集架构。
最低0.47元/天 解锁文章
116

被折叠的 条评论
为什么被折叠?



