-
IA32
指令也就是常见的x86指令,指(intel architecture 32位) -
这里的指令是指machine code
-
以x86为例学习machine code转汇编的方法,以后可类比解析其他少见架构的machine code
格式
- 汇编指令有6部分组成
Prefix----指令前缀(可选项)
Opand----操作指令(必选项)
Mod R/M—操作数辅助说明(可选项)
SIB----Mod R/M辅助说明(可选项,但是出现Mod R/M 这个必须有)
Displacement—操作数作为内存地址时用来表示位移(可选项)
Immediate ----表示操作数为立即数(可选项)
1)指令前缀prefix大小为一个字节,用来辅助说明指令的具体功能,可选项
例如:66:81FE 4746 CMP SI,474红色字体就是指令前缀,后面跟一个:。
2)操作指令opand,这个没啥好说的,必选项,大小为1到3字节,通常为一个字节,多字节后面会有说明.例如:66:81FE 4746 CMP SI,474
3)Mod R/M 大小为一个字节,由三部分组成,分别为 Mod(字节前两位),Reg(字节中间三位),R/M(字节后三位)。Mod R/M的主要功能就是说明操作数的寻址方式,包括寄存器选择,内存操作数的偏移等等。例如:66:81FE 4746 CMP SI,474
4)SIB,大小为一个字节,也是用来辅助操作数寻址的,一般用于辅助Mod R/M,当出现基址加变址寻址或者基址寻址时要用到。898424 50020000 Mov [ESP+250],EAX.
有用的表格
Intel® 64 and IA-32 Architectures Software Developer Manuals
table 2-2 32-bit Addressing forms with the ModR/M Byte, page 510
table 2-3 32-bit Addressing forms with the SIB Bytes, page 511
APPENDIX A ,page 487
A.2.1 Codes for Addressing Method
A.2.2 Code for Operand Type
Table A-2 .one –byte Opcode Maps
Table A-3.two-bytes Opcode Maps
pages :2519-2530
Table A-6 Opcode Extension for one-and Two Opcodes by Group Number
pages:2535-2537
关键部分
具体参见intel手册进行解析
解析步骤
操作码映射
首先我们解析一个长度为一的操作码,对应的表是Table A-2 .one –byte Opcode Maps
指令:41,将指令拆成4和1,4对应表的行向量,1对应表列向量,如下图:
操作数使用
指令68 A0B44000,我们先拆分68为6和8还是使用表Table A-2 .one –byte Opcode Maps
来查找操作指令。查看可得是push 指令,操作数的寻址方式有Iz规定
字符I规定了寻址方式,在code for Addressing Method查找对应含义
第二个小写字符z在表code for opcode type 中查找,
z表示使用的字符大小为字或者双字,由于是在32位系统中默认使用双字(使用单字的情况是使用前缀来说明),故这里是个双字,Iz一起就是表明使用双字立即数,表明指令68 A0B44000中A0B44000就是使用的双字立即数。完整的指令翻译过来就是:
Push 0004B4A0
总结
对机器码的解析归根结底要好好阅读相关手册,严格按照用户手册的规定上来一步步解析即可
事实上并不难,但是要耐心