win7_x64旗舰版、VS2015企业版架构
图在Intel手册2.1章节编码
1.1)Instruction Prefixes:指令前缀,可选项,每一个前缀一个字节,可选0个前缀到4个不等;指令前缀分为四组,每组都容许设置指定的前缀代码。spa
Group 1:锁定和重复前缀。操作系统
Group 2:段覆盖前缀。.net
Group 3:操做数大小覆盖前缀。3d
Group 4:地址大小覆盖前缀。code
1.2)Opcode:操做码,这是惟一不可省略的项,一、2或3个字节,在某些状况下会有额外的三个位做为补充opcode,这三个位是ModR/M中的Reg/Opcode域。htm
1.3)ModR/M:一共有三个域,Mod,Reg/Opcode, R/M。blog
Reg/Opcode在特定状况下做为Opcode的补充操做码,特定状况下做为第一个或第二个操做数寄存器。 内存
对于89 /r,Reg/Opcode表示第二个操做数寄存器,而对于8B /r,Reg/Opcode则表示第一个操做数寄存器。
Mod域和R/M域总共5个位,定义了32种寻址方式,可选项。
1.4)SIB:定义ModR/M的寻址方式的补充寻址方式,使用"Base + Scaled Index"格式。
1.5)Displacement:偏移,可选,0,1,2,4个字节。
1.6)Immediate:当即数,可选,0,1,2,4个字节。
图在Intel手册2.2.1章节
2.1)IA-32e模式有两个子模式
Compatibility Mode:使64位操做系统可以不加修改地运行大多数传统保护模式软件。
64-Bit Mode:使64位操做系统可以运行为访问64位地址空间而编写的应用程序。
2.2)REX Preflx
REX前缀是在64位模式下使用的指令前缀字节,与x86模式的不一样之处就是多了这个REX Preflx,其余基本与x86相同。
图在Intel手册2.5.1章节Addressing-Mode Encoding of ModR/M and SIB Bytes
解释:
3.1)[--][--]:表示使用SIB结构。
3.2)disp32:表示32位偏移。
3.3)[--][--]+disp8:表示使用SIB结构,且SIB结构后面有一个8位的偏移。
3.4)[--][--]+disp32:表示使用SIB结构,且SIB结构后面有一个32位的偏移。
图在Intel手册2.5.1章节Addressing-Mode Encoding of ModR/M and SIB Bytes
SIB结构使用"Base + Scaled Index"格式。
Base的可选值为:
Scaled Index的可选值为:none、[REG]、[REG*2]、[REG*4]、[REG*8],REG为实际的某个寄存器。
none表示没有Scaled Index,即Scaled Index的为0。
[REG]表示使用一个寄存器如[EAX]、[ECX]和[EDX]等等。
[REG*2]表示使用寄存器乘以2如[EAX*2]、[ECX*2]和[EDX*2]等等。
图在Intel手册4.3章节MOV-Move小节
解释:
5.1)r:寄存器,r8表示8位寄存器,r16表示16位寄存器,r32和r64依次类推。
5.2)m:内存地址,m8表示8位地址,m16表示16位地址,m32和m64依次类推。
5.3)r/m:寄存器或内存
5.4)/r:表示操做码有ModR/M结构,且ModR/M结构的Reg/Opcode域为Reg,表示第二个操做码寄存器。
5.4)REX:表示该操做码有REX Preflx字段。
5.5)REG.W:表示该操做码有REX Preflx字段且W位值为1。
5.6)rb:表示使用byte寄存器,即8位寄存器。
5.7)ib:表示使用byte当即数,即8位当即数。
5.8)rw:表示使用word寄存器,即16位寄存器。
5.9)iw:表示使用word当即数,即16位当即数。
5.10)rd:表示使用dword寄存器,即32位寄存器。
5.11)id:表示使用dword当即数,即32位当即数。
5.12)/0:表示指定有ModR/M选项。
完整解释请看Intel手册第3.1.1.1章节Opcode Column in the Instruction Summary Table (Instructions without VEX Prefix)
图在Intel手册3.2章节ADD-Add小节
图在Intel手册4.3章节MOVSX/MOVSXD—Move with Sign-Extension小节
完整解释请看Intel手册第3.1.1.1章节Opcode Column in the Instruction Summary Table (Instructions without VEX Prefix)
9.1)示例一(x86环境)
012E17DD 8B 45 EC mov eax,dword ptr [ebp-14h]
解析mov eax,dword ptr [ebp-14h]的机器代码:
eax为32位寄存器,[ebp-14h]是一个内存地址,因此指令应该是"MOV r32,m32",根据第五节 MOVE-Move指令格式,符合条件的只有
经过8B /r进行分析
Instruction Prefixes:该操做码没有Instruction Prefixes。
Opcode:操做码为8B。
ModR/M:/r表示操做码有ModR/M结构,且ModR/M结构的Reg/Opcode域为Reg,表示第一个操做码寄存器。
第一个操做码寄存器为eax,根据第三节 ModR/M字节的32位寻址表,Reg域为000,[ebp-14h]是相对寄存器寻址,因此Mod域为01,R/M域为101,最后的ModR/M为01 000 101,即45H。
SIB:无。
Displacement:相对ebp寄存器的偏移为-14h,-14h的源码为0001 0100,反码为1110 1011,补码为1110 1100,即EC。
Immediate:无。
最后的机器码为:8B 45 EC。
9.2)示例二(x86环境)
012E17E3 89 45 EC mov dword ptr [ebp-14h],eax
解析mov dword ptr [ebp-14h],eax的机器代码:
[ebp-14h]是一个内存地址,eax为32位寄存器,因此指令应该是"MOV m32,r32",根据第五节 MOVE-Move指令格式,符合条件的只有
经过89 /r进行分析
Instruction Prefixes:该操做码没有Instruction Prefixes。
Opcode:操做码为89H。
ModR/M:/r表示操做码有ModR/M结构,且ModR/M结构的Reg/Opcode域为Reg,表示第二个操做码寄存器。
第二个操做码寄存器为eax,根据第三节 ModR/M字节的32位寻址表,Reg域为000,[ebp-14h]是相对寄存器寻址,因此Mod域为01,R/M域为101,最后的ModR/M为01 000 101,即45H。
SIB:无。
Displacement:相对ebp寄存器的偏移为-14h,-14h的源码为0001 0100,反码为1110 1011,补码为1110 1100,即EC。
Immediate:无。
最后的机器码为:89 45 EC。
9.3)示例三(x86环境)
012E17E6 01 04 8E add dword ptr ds:[esi+ecx*4],eax
解析add dword ptr ds:[esi+ecx*4],eax的机器代码:
[esi+ecx*4]是一个内存地址,eax为32位寄存器,因此指令应该是"ADD m32,r32",根据第五节 ADD-Add指令格式,符合条件的只有
经过01 /r进行分析
Instruction Prefixes:该操做码没有Instruction Prefixes。
Opcode:操做码为01H。
ModR/M:/r表示操做码有ModR/M结构,且ModR/M结构的Reg/Opcode域为Reg,表示第二个操做码寄存器。
第二个操做码寄存器为eax,根据第三节 ModR/M字节的32位寻址表,Reg域为000,[esi+ecx*4]是寄存器间接寻址且且使用SIB结构
因此Mod域为00,R/M域为100,最后的ModR/M为00 000 100,即04H。
SIB:根据[esi+ecx*4],SS为10,Index为001,r32为esi寄存器即110,因此SIB为10 001 110 = 8EH。
Displacement:无。
Immediate:无。
最后的机器码为:01 04 8E。
9.4)示例四(x64环境)
000000013F3D1212 48 63 4C 24 20 movsxd rcx, dword ptr [esp+20h]
解析movsxd rcx, dword ptr [esp+20h]的机器代码:
rcx为64位寄存器,[esp+20h]是一个内存地址,esp为32位寄存器,内存地址是32位地址,因此指令应该是"movsxd r64,mr32",根据第七节 MOVSX/MOVSXD—Move with Sign-Extension指令格式,符合条件的只有
经过REX.W + 63 /r进行分析
Legacy Prefixes:无。
REX Prefixes:REX.W表示操做码有REX Prefixes结构,且W位为1,则REX Prefixes为 0100 1000,即48H。
Opcode:操做码为63H。
ModR/M:/r表示操做码有ModR/M结构,且ModR/M结构的Reg/Opcode域为Reg,表示第一个操做寄存器。
第一个操做寄存器为rcx,根据第三节ModR/M字节的32位寻址表,Reg域为001,[esp+20h]是相对寄存器寻址,因此Mod域为01,表中找不到esp寄存器,因此R/M域为100。
最后的ModR/M为01 001 100,即4CH。
SIB:根据[--][--]+disp8能够看出,必定有SIB结构,SIB结构为"Base + Scaled Index",[esp+20h]没有Scaled Index,因此SS为00,Index为100,Base为esp寄存器即100,最后SIB为00 100 100 = 24H。
Displacement:相对esp寄存器的偏移为+20h,+20h的补码为0010 0000,即20H。
Immediate:无。
最后的机器码为:48 63 4C 24 20。
1)[原创]X86汇编之指令格式解析:https://bbs.pediy.com/thread-191802.htm
2)[原创]X64汇编之指令格式解析:https://bbs.pediy.com/thread-206780.htm
3)X86指令编码内幕 --- 指令格式:https://blog.csdn.net/xfcyhuang/article/details/6228030
4)Intel硬编码(一):Opcode Map、定长指令与指令前缀:https://blog.csdn.net/apollon_krj/article/details/77524601
5)Intel硬编码(二):不定长指令、ModR/M与SIB详解(基于P6微架构):https://blog.csdn.net/apollon_krj/article/details/77524601