版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1李 林 电子科技大学 计算机学院李 林 电子科技大学 计算机学院3Opcode 为什么要学习Opcode机器码当你站在处理器的角度理解高级语言的运行细节时,若没有Opcode的帮助,可能无法理解许多底层细节为什么返回值喜欢用eax寄存器传递为什么寄存器清0,使用xor,而不是mov,如xor eax,eax为什么判断寄存器是否为0,使用test,而不是cmp,如test eax, eaxVs2008在局部变量间添加的0 xcc是什么?int 3编译器后端设计、反汇编器、病毒、破解等底层领域,处处可见Opcode的影子4Opcode Intel关于处理器的官方资料:IA-32 Intel Ar
2、chitecture Software Developers Manual Volume 1描述处理器结构IA-32 Intel Architecture Software Developers Manual Volume 2描述指令集IA-32 Intel Architecture Software Developers Manual Volume 3程序员指南5Opcode IA-32的指令格式 Prefixes Opcode ModR/M SIB 理解Intel手册格式6Opcode IA-32的指令格式 Prefixes Opcode ModR/M SIB 理解Intel手册格式IA-
3、32的指令格式Prefixes前缀:最多4个前缀每个前缀只有1个字节前缀间先后顺序无关可以没有任何前缀IA-32的指令格式Opcode主操作码可以有1个字节、2个字节、3个字节1字节:00FF2字节:0F开头3字节:0F38开头、0F3A开头IA-32的指令格式ModR/M:1字节Mod:模式,2bit,不同的值代表不同的寻址方式Reg/Opcode:3bit,可以是某个寄存器的编码,也可以是副操作码R/M:3bit,可以是寄存器编码,也可是内存寻址方式IA-32的指令格式SIBIndex和Base,均是32位通用寄存器的编码给出了新的寻址方式:Index*2Scale+BaseIndex不能
4、是esp,若是,将忽略Scale和IndexIA-32的指令格式Displacement偏移量,可以没有、1、2、4字节Immediate立即数,可以没有、1、2、4字节。立即数作为指令的一部分,解码后,“立即”可用12Opcode IA-32的指令格式 Prefixes Opcode ModR/M SIB 理解Intel手册格式Prefixes前缀可以分成4组第一组Lock前缀F0:在多处理器环境中,保证在当前指令执行期间,对内存进行独占式访问。仅对部分指令有效重复前缀,主要用于串操作F2:REPNE/REPNZF3:REP/REPE/REPZPrefixes第二组段前缀改写例如,movs
5、dword ptr es:edi, dword ptr esi对应的机器码是A5movs dword ptr es:edi, dword ptr es:esi对应的机器码是26:A5,26就是段前缀改写2E对应CS、36对应SS、3E对应DS、26对应ES、64对应FS、65对应GS跳转提示:仅用于条件跳转指令,给处理器一个提示,告知它最有可能的跳转分支2E:跳转分支3E:不跳转分支Prefixes第三组66:改变操作数的大小完成32位和16位之间的切换。假设CPU工作在32位环境下,前缀66会将操作数变成16位,反之亦然8B 06mov eax,dword ptr esi;32位下66:8B
6、 06 mov ax, word ptr esi;注意8位的操作,和66前缀是没有关系的8A 06mov al,byte ptr esi,机器码不同Prefixes第四组67:改变地址的大小8B 03mov eax,dword ptrebxebx:地址是32位的67:8B 03mov eax,dword ptrbp + dibp + di:地址是16位的前缀67为了完成32位地址模式与16位地址模式的转换17Opcode IA-32的指令格式 Prefixes Opcode ModR/M SIB 理解Intel手册格式主操作码Opcode主操作码Opcode、ModR/M中的Opcode副操作
7、码,共同构成了操作码在ModR/M中的3、4、5bit,究竟是副操作码,还是寄存器的编码,取决于主操作码的解释对于某种操作,其主操作码是多少、有无副操作码,副操作码是多少,都只有查找Intel手册才知道在一些Opcode中,编码了寄存器操作对象inc eax400100 0 000,000是eax的编码Inc ecx 410100 0 001,001是ecx的编码主操作码Opcode寄存器的编码AL、AX、EAX的编码都是相同的,怎么区分三者呢?究竟是AX还是EAX好区分前缀66,完成32位和16位间的切换AL如何区分呢?需要查看主操作码的w位。后面再描述20Opcode IA-32的指令格式
8、 Prefixes Opcode ModR/M SIB 理解Intel手册格式ModR/MModR/M和SIB一起,决定了操作数的寻址方式Reg/opcode决定一个操作数,reg编码看前面表格r/m、mod、SIB、偏移量决定一个操作数32位地址模式下,不同Mod的值代表不同的寻址方式,共四种情况ModR/MMod=00时,-表示ModR/M后面跟着SIBdisp32表示后面有32位偏移量ModR/MMod=01时,-表示ModR/M后面跟着SIBdisp8表示后面有8位偏移量ModR/MMod=10时,-表示ModR/M后面跟着SIBdisp32表示后面有32位偏移量ModR/MMod=1
9、1时,ModR/M例1:假设目前工作在32位模式下mov指令的操作码是89,那么89 C3是什么意思?89(11 000 011)Mod=11, reg/opcode=000, r/m=011查手册发现89无需副操作码,即reg/opcode为寄存器编码查寄存器编码表,000可以为al、ax、eax,究竟是哪一个呢?假设目前工作在32位模式下,又由于没有前缀66,所以000只能是al或者eax。此时,需要w位帮助判断ModR/M区分16位和32位,依靠前缀66假设工作在32位模式下89 18mov eax, ebx66 89 18 mov eax, bx注意66只改变操作数的位数,而不是地址的
10、位数,所以仍然为eaxw位:主操作码opcode的最后一位若最后一位等于1,则是32位操作数若最后一位等于0,则是8位操作数89的二进制是1000 1001,最后一位是1,所以操作数是32位,即eax寄存器继续查mod=11的表,r/m=011,另一个操作数可能是bl、bx、ebx同理,另一操作数是ebxModR/M所以,机器码89 C3对应的汇编语句应该是:mov ebx, eaxmov eax, ebx到底是哪一个呢,哪一个才是源操作数呢?d位决定reg/opcode和r/m字段,谁是源操作数,谁是目的操作数主操作码opcode的倒数第二位若d为等于1,reg/opcode是目的操作数,r
11、/m是源操作数若d为等于0,reg/opcode是源操作数,r/m是目的操作数89=1000 1001,d位为0eax是由reg/opcode推导的,而ebx是由r/m推导的eax是源操作数,ebx是目的操作数89 c3对应的汇编语句应该是:mov ebx,eax代码7.1,查看89 c3对应的汇编语句ModR/M例2:89 0E 对应的汇编语句,假设目前工作在32位模式下第一步判断有无前缀没有前缀第二步查Intel手册,确定reg/opcode字段究竟是副操作码还是寄存器编码无副操作码第三步分析ModR/M,0E=00 001 110第四步reg/opcode=001,寄存器为cl、cx、e
12、cx由于是在32位环境,有无前缀66,可以排除cx89=1000 1001,w位=1,32位操作数,即为ecx第五步分析mod和r/mMod=00,r/m=110,查表,另一个操作数为esi第六步确定d位d位=0,ecx为源操作数mov dword ptr esi, ecxModR/M例3:89 57 08 对应的汇编语句,假设目前工作在32位模式下第一步判断有无前缀没有前缀第二步查Intel手册,确定reg/opcode字段究竟是副操作码还是寄存器编码无副操作码第三步分析ModR/M,57=01 010 111第四步reg/opcode=010,寄存器为DL、DX、EDX由于是在32位环境,
13、有无前缀66,可以排除DX89=1000 1001,w位=1,32位操作数,即为EDX第五步分析mod和r/mMod=01,r/m=111,查表,另一个操作数为edi+disp8说明ModR/M后面有8位的偏移量,即08,即edi+8第六步确定d位d位=0,edx为源操作数mov dword ptr edi+8, edxModR/M例4:66 89 AB 78 56 34 12 对应的汇编语句,假设目前工作在32位模式下第一步判断有无前缀有前缀66,操作数的大小变成16位第二步查Intel手册,确定reg/opcode字段究竟是副操作码还是寄存器编码无副操作码第三步分析ModR/M,AB=10
14、 101 011第四步reg/opcode=101,寄存器为CH、BP、EBP由于是在32位环境,有前缀66,将从32位操作数变成16位,即BP第五步分析mod和r/mMod=10,r/m=011,查表,另一个操作数为ebx+disp32说明ModR/M后面有32位的偏移量,即78 56 34 12,即ebx+0 x12345678第六步确定d位d位=0,bp为源操作数mov word ptr ebx+12345678h, bp代码7.2ModR/M例5:8B 1D 78 56 34 12 对应的汇编语句,假设目前工作在32位模式下,8B也是mov对应的操作码第一步判断有无前缀没有前缀第二步查
15、Intel手册,确定reg/opcode字段究竟是副操作码还是寄存器编码无副操作码第三步分析ModR/M,1D=00 011 101第四步reg/opcode=011,寄存器为bl、bx、ebx由于是在32位环境,有无前缀66,可以排除bx8B=1000 1011,w位=1,32位操作数,即为ebx第五步分析mod和r/mMod=00,r/m=101,查表,说明后跟32位地址,操作数即disp32第六步确定d位d位=1,ebx为目的操作数mov ebx, dword ptr 12345678h,代码7.2ModR/M回看Mod=00时,没有ebp的寻址方式,被disp32给占了若想使用ebp寻
16、址,怎么办?看看Mod=01和10时的情况可以使用ebp+disp8或ebp+disp32,让disp8或disp32为0效率考虑,应该让disp8为0ModR/M例6:构建mov ebp,edx的机器码,假设32位模式mov指令的机器码是8989=10001001,w位1,说明是32位操作数;d位0,reg/opcode是源操作数,r/m是目的操作数需构建的指令,edx是源操作数,所以reg/opcode部分的编码应该是010使用mod=01时,r/m=101,即ebp+disp8所以ModR/M=01 010 101最后的机器码:89 55 00,最后的00是disp8代码7.3ModR/
17、M说明:16位地址模式下的各种mod表项,请查询Intel手册并不是所有指令的Opcode的最后一位都是w位,并不是所有指令的Opcode的倒数第二位都是d位w位的作用是确定操作数是32/16位还是8位;d位的作用是确定谁是源操作数只有在弄不清楚操作数到底是多大时,才会考虑w位只有在弄不清楚谁是源操作数时,才会考虑d位36Opcode IA-32的指令格式 Prefixes Opcode ModR/M SIB 理解Intel手册格式SIBSIB:Scale Index Base,标量索引寻址规则index和Base,均是32位通用寄存器的编码给出了新的寻址方式:Index*2Scale+Bas
18、eScale的只就是0、1、2、3,寻址方式:Index+BaseIndex*2+BaseIndex*4+BaseIndex*8+BaseIndex不能是esp,若是,将忽略Scale和IndexSIB例7:机器码89 04 24对应的汇编语句,假设32位模式第一步,确定无前缀第二步,查手册,确定89是mov指令,且无副操作码。89=10001001第三步分析ModR/M字段,04=00 000 100Reg/opcode=000,由于w位为1,所以其中一个操作数为eaxMod=00,r/m=100,查表,寻址方式是-,即后跟SIB由于d位=0,则reg/opcode为源操作数,即eax第四步
19、分析SIB字段,24=00 100 100Scale=0,index=100,base=100由于w位为1,则index表示esp,base表示esp若index为esp,则会忽略掉index和scale寻址方式是:esp确定结果:mov esp, eax代码7.4SIB例8:机器码89 44 8D 08对应的汇编语句,假设32位模式第一步,确定无前缀第二步,查手册,确定89是mov指令,且无副操作码。89=10001001第三步分析ModR/M字段,44=01 000 100Reg/opcode=000,由于w位为1,所以其中一个操作数为eaxMod=01,r/m=100,查表,寻址方式是-
20、+disp8,即后跟SIB和8位的偏移量由于d位=0,则reg/opcode为源操作数,即eax第四步分析SIB字段,8D=10 001 101Scale=2,index=001,base=101由于w位为1,则index表示ecx,base表示ebp寻址方式是:ecx*4+ebp再加上8位的偏移量:ecx*4+ebp+08h确定结果:mov ecx*4+ebp+08h, eax代码7.4SIB例9:机器码89 84 CD 78 56 34 12对应的汇编语句,假设32位模式第一步,确定无前缀第二步,查手册,确定89是mov指令,且无副操作码。89=10001001第三步分析ModR/M字段,
21、84=10 000 100Reg/opcode=000,由于w位为1,所以其中一个操作数为eaxMod=10,r/m=100,查表,寻址方式是-+disp32,即后跟SIB和32位的偏移量由于d位=0,则reg/opcode为源操作数,即eax第四步分析SIB字段,CD=11 001 101Scale=3,index=001,base=101由于w位为1,则index表示ecx,base表示ebp寻址方式是:ecx*8+ebp再加上32位的偏移量:ecx*8+ebp+12345678h确定结果:mov ecx*8+ebp+12345678h, eax代码7.4SIB例10:机器码89 04 C
22、D 78 56 34 12对应的汇编语句,假设32位模式第一步,确定无前缀第二步,查手册,确定89是mov指令,且无副操作码。89=10001001第三步分析ModR/M字段,04=00 000 100Reg/opcode=000,由于w位为1,所以其中一个操作数为eaxMod=00,r/m=100,查表,寻址方式是-,即后跟SIB由于d位=0,则reg/opcode为源操作数,即eax第四步分析SIB字段,CD=11 001 101Scale=3,index=001,base=101由于w位为1,则index表示ecx,base表示ebp寻址方式是:ecx*8+ebp“78 56 34 12
23、”是什么,表格只说了-,没说后面跟displacement啊?若是的话,则再加上32位的偏移量:ecx*8+ebp+12345678h确定结果:mov ecx*8+ebp+12345678h, eax代码7.4结果不对SIB特殊规则:若base为101,即ebp(32位环境),而mod=00,r/m=100,则寻址方式是index*2Scale+disp32例10:mov ecx*8+12345678h, eax43Opcode IA-32的指令格式 Prefixes Opcode ModR/M SIB 理解Intel手册格式理解Intel手册格式从汇编指令查主操作码参考资料: IA-32 I
24、ntel Architecture Software Developers Manual Volume 2,2003版理解Intel手册格式Intel常见的缩写词/digit:digit是从07的数字,指示reg/opcode是副操作码,digit的值就是reg/opcode的值/r:指示reg/opcode是寄存器+rb、+rw、+rd:主操作码加上寄存器编码,形成新的主操作码。b:字节,w:字,d:双字ib、iw、id:1字节、2字节、4字节立即数操作符存在如AND:25 id,表示 and eax,imm32cb、cw、cd、cp:说明在主操作码之后,将紧接1字节、2字节、4字节、6字节
25、值,被用来指定code offset、段寄存器新值如JMP指令中的E9 CD,表示JMP rel32通过汇编指令,查到的是主操作码和基本形式,要形成完整机器码,还得继续查表和前面所述的指令组成方式。理解Intel手册格式从机器码到完整汇编指令理解Intel手册格式理解Intel手册格式表格的第一列表示主操作码的高4个bit,第一行表示主操作码的低4个bit表格中的字母E、G、I、b、v等等都是Intel规定的缩写词理解Intel手册格式理解Intel手册格式理解Intel手册格式当查询上述表格,遇到1A时,说明有副操作码,要查询分组表格理解Intel手册格式例题:从机器码到汇编语句例1:C7 05 40 71 41 00 0C 00 00 00第一步:确定有无前缀没有前缀第二步:在指令表格中查C7,得到Grp 111A - Mov Ev,IvGrp 111A说明存在副操作码,再查分组表格此时Opcode主操作码=C7,而reg/opcode=000,因为05=00 00
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中学老师师德师风工作总结
- 2026气管插管术后患者护理个案解读
- 2026年牙签筒行业分析报告及未来发展趋势报告
- 2026年浊度传感器行业分析报告及未来发展趋势报告
- 2026年家庭美容保健仪器行业分析报告及未来发展趋势报告
- 2026年民航建设行业分析报告及未来发展趋势报告
- 2026年水解羽毛粉行业分析报告及未来发展趋势报告
- 2026年热熔断体行业分析报告及未来发展趋势报告
- 2026年婴儿奶瓶行业分析报告及未来发展趋势报告
- (2025年)驾驶员行车安全试题题库与答案
- 养老社区2025年定位手环协议
- 2026年医学微生物学复习押题宝典通关考试题库附答案详解【突破训练】
- 2026云南楚雄州武定县事业单位选调37人备考题库及答案详解(真题汇编)
- 高中政治必修+选必核心答题术语(简化版)
- 经典酒店设计案例分析
- (2026春新版)北师大版二年级数学下册全册教学设计
- 家政培训婴幼儿早教课件
- 22G101 混凝土结构施工图 平面整体表示方法制图规则和构造详图(现浇混凝土框架、剪力墙、梁、板)
- 2026年高考作文备考训练之题目解析及范文:人们常说凡事要“尽我所能”也要“敬我不能”
- P-III曲线水文频率计算电子表格程序
- 《医疗机构病历管理规定(2025年版)》
评论
0/150
提交评论