首页
社区
课程
招聘
[原创]x86指令编码格式解析
发表于: 2011-5-8 18:32 27098

[原创]x86指令编码格式解析

2011-5-8 18:32
27098

提到编码,只要学过一点汇编的人都应该知道一些常用的汇编指令的编码,比如:B8 78 56 34 12,一看到B8就知道对应的汇编指令是MOV EAX,0X12345678 占用5字节,一看到E8就知道是E8后面跟的是JMP的4字节偏移,一见90就知道是NOP,因为这些指令都很常用,编码也都很简单,想必大家对这些指令编码都熟记于心了。如果提到 MOV EBX,XXXXXXXX  MOV ECX,XXXXXXX这些指令也许大家对指令编码就不怎么记得了,因为X86的编码太多了,要把他全记住那可不是件容易的事。其实要把X86的编码指令记住并不是件难事,因为X86编码指令看似复杂庞大,其实这大部分编码有是有规律可寻的。


在这里先说组寄存器:


0    1    2    3    4    5    6     7


EAX  ECX  EDX  EBX  ESP  EBP  ESI   EDI


0    1    2    3    4    5    6     7


AL   CL   DL   BL   AH  CH   DH    BH


不知道各位同学当年学汇编的时候寄存器是不是按这个顺序记的,如果是按这个顺序记住的话,接下来讲的编码你可能一看就记住了


B8是MOV EAX 大家都很清楚的记得,那么B9呢?B9就是MOV ECX ,BA  MOV EDX 聪明的同学应该很快的看出规律出来了吧!BB 是MOV EBX ,BC是MOV ESP 一直到BF 是MOV EDI


B0是MOV AL,XX 2字节立即数,对照上面的表格,大家应该很容易的说出B1是MOV CL,XX,一直到B7是MOV BH,XX


90是NOP大家都知道,其实他的真正编码指令是XCHG EAX,EAX,91 XCHG EAX,ECX 一直到97 XCHG EAX,EDI


40到47是INC EAX 到 INC EDI ,48到4F是DEC EAX到DEC EDI


50到57是PUSH EAX 到 PUSH EDI ,58到 5F是 POP EAX 到 POP EDI


现在对于这一类的指令编码,大家是不是感觉记起来轻松了


对内存访问的指令在汇编中也经常出现,现在在说说这些指令的编码格式


ADD  OR  ADC  SBB  AND  SUB  XOR  CMP


ES   CS  SS   DS


DAA  DAS  AAA  AAS


就跟上面我说的寄存器一样先按顺序记下这些东西再说


要讲对内存访问的编码就不得不先说说X86通用的编码指令格式





上图参考INTEL开发手册卷二,想具体了解的可以去参考下,看不懂英文的,论坛的翻译版块有部分章节的翻译。大家可以去找找 


Opcode(操作码),之前所说的B8 XX XX XX XX指令B8就代表Opcode(操作码),之后跟的是4字节的Immediate (立即数),一看到B8开头的编码,就要知道B8代表Opcode,后面带有4字节Immediate的属性


在举个列子,B0 XX,B0代表 Opcode,后面带有1字节Immediate的属性


00 是ADD EB,GB (EB代表1字节内存,GB代表8位寄存器)


碰到00编码,00代表着Opcode(操作码),后面的第2个1字节编码就代表着ModR/M


编码    对应的汇编指令


ModR/M字节的二进制6 7位MOD为0


00 00   ADD BYTE PTR DS:[EAX],AL


00 01   ADD BYTE PTR DS:[ECX],AL


。。。。。


00 07   ADD BYTE PTR DS:[EDI],AL 


00 08   ADD BYTE PTR DS:[EAX],CL


。。。。


00 0F   ADD BYTE PTR DS:[EDI],CL


00 10   ADD BYTE PTR DS:[EAX],DL


。。。。


00 3F   ADD BYTE PTR DS:[EDI],BH


ModR/M字节的二进制6 7位MOD为1,第三个编码为1字节Displacement


00 40 XX ADD BYTE PTR DS:[EAX+XX],AL 


00 41 XX ADD BYTE PTR DS:[ECX+XX],AL


。。。。


00 7F XX ADD BYTE PTR DS:[EDI+XX],BH


ModR/M字节的二进制6 7位MOD为2, 从第三个编码开始为4字节Displacement


00 80 XX XX XX XX ADD BYTE PTR DS:[EAX+XXXXXXXX],AL


00 81 XX XX XX XX ADD BYTE PTR DS:[ECX+XXXXXXXX],AL


00 BF XX XX XX XX ADD BYTE PTR DS:[EDI+XXXXXXXX],BH


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (22)
雪    币: 314
活跃值: (271)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
前排站 位,顶起
2011-5-8 18:46
0
雪    币: 37
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不错可以做参考
2011-5-8 19:00
0
雪    币: 578
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼主总结的很透彻
2011-5-8 19:13
0
雪    币: 287
活跃值: (593)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5

在上传个反汇编引擎的代码给大家参考下,代码不全,只写了文中讲过的编码指令
上传的附件:
2011-5-8 19:22
0
雪    币: 422
活跃值: (130)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
挺好的         顶
2011-5-8 19:59
0
雪    币: 287
活跃值: (593)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
孙大牛相顶倍感荣幸
2011-5-8 20:16
0
雪    币: 45
活跃值: (51)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
学长 威武~~~
2011-5-8 20:24
0
雪    币: 384
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
妈的,实在太棒了
2011-5-8 20:38
0
雪    币: 56
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
你怎么学这么深啊,你那切的图是是什么资料 啊。。这么强
2011-5-8 21:03
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
学的时候被那些指令格式吓到,其实每条指令的Opcode才是最重要的,后面他是倒着放都没关系,只要你的CPU够强劲。
2011-5-8 21:29
0
雪    币: 179
活跃值: (26)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
12
收藏,备用。感谢楼主
2011-5-8 21:40
0
雪    币: 80
活跃值: (292)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
嘿嘿,强烈支持!顺便把漏掉的功课补上!
2011-5-8 22:12
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
非常好的学习笔记
2011-5-8 22:23
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
**... 写的不错..打这么多字,挺辛苦.
2011-5-8 22:38
0
雪    币: 287
活跃值: (593)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
16
新手求精华鼓励
2011-5-8 22:48
0
雪    币: 88
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
无法下载???失效。。。
2011-5-9 00:50
0
雪    币: 287
活跃值: (593)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
18
重新传了份
2011-5-9 07:45
0
雪    币: 58
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
写的不错..打这么多字,挺辛苦
2011-5-9 13:30
0
雪    币: 7365
活跃值: (1330)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
正在学习中!向楼主致敬!
2011-5-9 14:45
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
很不错,值得学习一下
2011-5-10 09:05
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
在学80X86汇编呢 都是英文指令 要用16进制来表示么?难道要手写十六进制代码汇编啊··
2011-5-11 16:23
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
23
帮黑哥顶起,大力顶起
2011-5-18 09:06
0
游客
登录 | 注册 方可回帖
返回