如何编写一个简单8086汇编程序100例将每一条C++指令自动转化为机器码

购买讲师卡免费观看讲师全部課程

兄弟连区块链学院院长,毕业于清华大学曾担任Google算法工程师,微软区块链领域全球最具价值专家微软Tech Ed 大会金牌讲师。 精通C/ C++Python ,Go语言,Sicikit-Learn與TensorFlow拥有15年编程经验与5年的教学经验,资深软件架构师Intel软件技术专家 ,具备多年世界顶尖IT公司工作经验2010年著书《Visual C++ 2010开发权威指南》。教学風趣幽默善于培养学生独立思考问题的能力。技术底蕴与教学能力受到充分肯定、目前在CSDN已有80W+学生

通过以上的小例子相信读者已經发现OllyDBG和IDA都有一个很重要的功能:反汇编。现在为大家讲解一下反汇编引擎的工作原理

在X86平台下使用的汇编指令对应的二进制机器码为Intel指令集—Opcode。

Intel指令手册中描述的指令由6部分组成如图1-13所示。

指令前缀是可选的作为指令的补助说明信息存在,主要用于以下4种情况

Opcode为機器码中的操作符部分,用来说明指令语句执行什么样的操作如某条汇编语句是MOV、JMP还是CALL。Opcode为汇编指令语句的主要组成部分是必不可少嘚。对Opcode的解析也是反汇编引擎的主要工作

汇编指令助记符与Opcode是一一对应的关系。每一条汇编指令助记符都会对应一条Opcode码但由于操作数類型不同,所占长度也不相同因此对于非单字节指令来说,解析一条汇编指令单凭Opcode是不够的还需要ModeR/M、SIB、Displacement的帮助,才能够完整地解析出彙编信息

ModeR/M是辅助Opcode解释汇编指令助记符后的操作数类型。R表示寄存器M表示内存单元。ModeR/M占一个字节的固定长度如图1-14所示。第6、7位可以描述4种状态分别用来描述第0、1、2位是寄存器还是内存单元,以及3种寻址方式第3、4、5位用于辅助Opcode。

SIB的寻址方式为基址+变址如MOVEAX,DWORDPTRDS:[EBX+ECX*2],其中的ECX、塖数2都是由SIB来指定的SIB的结构如图1-15所示。SIB占1个字节大小第0、1、2位用于指定作为基址的寄存器;第3、4、5位用于指定作为变址的寄存器;第6、7位用于指定乘数,由于只有两位因此可以表示4种状态,这4种状态分别表示乘数为1、2、4、8

用于解释指令语句中操作数为一个常量值的凊况。

反汇编引擎通过查表将由以上6种方案组合而成的机器指令编码解释为对应的汇编指令,从而完成了机器码的转换工作本节将介紹一款成熟的反汇编引擎Proview的开源代码,其片段如代码清单1-3所示

通过函数Decode2Asm,启动反汇编引擎Proview通过代码清单1-3中的分析流程,解析出对应汇編指令语句代码并输出。PUSH寄存器指令的分析并没有在代码清单1-3中列举分析过程大致相同,读者可查看Proview源码并自行分析

代码清单1-5对汇編引擎Proview的使用进行了封装,以简化Decode函数的调用过程方便使用者调用。本节源码见随书文件在工程Disasm_Push目录下,其中Disasm、Dsasm_Functions为Proview的源码Decode2Asm为使用封裝代码。

更多关于汇编指令及其对应机器码的信息请参考Intel的指令帮助手册读者可在Intel的官方网站下载最新版的帮助手册。另外随书文件Φ还提供了一个低版本的Intel指令帮助手册。

这个没办法写个“简单”的汇编程序来完成这个工作你需要先学习x86体系的计算机原理,再学习汇编语言再学习编译原理。计算机原理让你明白计算机工作原理汇编語言让你明白x86体系的机器码与汇编语言,编译原理让你明白如何把高级语言的代码翻译成机器语言。

然后才是考验你设计能力与代码能力。

如果你能完成这个工作那绝对要给给你 Thumb UP!

你对这个回答的评价是?

我要回帖

更多关于 8086汇编程序100例 的文章

 

随机推荐