单片机从可执行文件找回汇编文件的实现方法

文档序号:6536287阅读:206来源:国知局
单片机从可执行文件找回汇编文件的实现方法
【专利摘要】本发明公布了一种单片机从可执行文件找回汇编文件的实现方法,包括单片机内的汇编指令,其特征在于:单片机内的汇编指令实现数据与代码段的分离,并且将程序分段表示为子程序及跳转程序,子程序及跳转程序有各自对应的标号,并且每句程序有相应的注释,同时,单片机内的汇编指令直接导入到对应型号的开发环境中进行编译调试,可以保证反编译出的汇编程序可以直接在原开发环境中正确的编译通过。本发明集成了多种系列的单片机反汇编功能,用户可自行选择对应的单片机,然后导入格式文件,系统会自动反编译出对应汇编文件。
【专利说明】单片机从可执行文件找回汇编文件的实现方法
【技术领域】
[0001]本发明属于单片机反汇编工具,具体说涉及一种单片机从可执行文件找回汇编文件的实现方法。
【背景技术】
[0002]在单片机应用设计工作或学习时,有时可能会因为意外事故或工作交接等原因丢失原设计汇编或C代码。但后期产品可能因市场需求,功能需要改进和升级,如何通过已固化在单片机中的二进制文件反向获取正确可读性的利于分析性的汇编文件或C文件成为这样情况的难题。
[0003]现有的获取方式,基本上都是利用对应单品机的开发环境进行简单的翻译成汇编指令,但代码跟数据混在一起,不易读懂程序,同样也要浪费大量的时间和精力,大大增加开发修改成本。

【发明内容】

[0004]为解决【背景技术】中的问题,本发明提供了一种用户可自行选择对应的单片机,然后导入格式文件,系统会自动反编译出对应汇编文件的单片机从可执行文件找回汇编文件的实现方法。
[0005]本发明的技术方案是:
[0006]一种单片机从可执行文件找回汇编文件的实现方法,包括单片机内的汇编指令,其特征在于:单片机内的汇编指令实现数据与代码段的分离,并且将程序分段表示为子程序及跳转程序,子程序及跳转程序有各自对应的标号,并且每句程序有相应的注释,同时,单片机内的汇编指令直接导入到对应型号的开发环境中进行编译调试,可以保证反编译出的汇编程序可以直接在原开发环境中正确的编译通过。
[0007]作为进一步的技术方案,单片机从可执行文件找回汇编文件的实现方法的系统工作步骤如下:
[0008]I)、打开要反汇编的源文件,工具会读取这些文件的内容,并转换成可视的十六进制字符串的;
[0009]2)、工具会将选择的芯片型号作为一个全局变量进行保存,在反翻译和追踪的过程中都会选择与该芯片型号对应的指令信息数据表、相关的处理函数、方法、对象;
[0010]3)、根据选择的芯片型号调取其指令执行的位数信息,将第一步中读取的文件数据按照这个单位进行截取,生成一个原数据的数组;
[0011]4)、反翻译的过程,反翻译的过程就是按照对应表,将机器码反向翻译成助记符,从而帮助开发者重新看懂程序,获取算法,进而改善或修改程序;
[0012]所述对应表是正常翻译指令的过程是将对应指令的助记符翻译成该指令唯一对应的机器码,在这其中必须要有一个相配合的对应表;
[0013]所述翻译是获取各种系列芯片的机器码表和对应的指令格式,然后依据此指令的机器码格式获取了这整个芯片系列的所有指令码基础数据表,同时,此指令中包含有指令掩码,指令掩码负责过滤出指令操作码部分数据,而后的操作码则与过滤出的指令操作码数据部分比较,如果一致则说明当前数据是本条指令,确定为那一条指令后再利用掩码筛选出对应的原操作数,目的操作数或其他特殊的得数据,筛选出对应的数据后则分别取替换对应当前指令的指令格式中的对应的字符,这样这一条指令就被识别并反成汇编语言;
[0014]而翻译出所有的指令就是要建立一个原数据数组的索引,索引从零开始,以依次加一的方式来遍历原数据数组成员,按照上述操作步骤将每一个数组成员反应成对应的指令,如果该数组成员的数据不符合任何一条指令的机器码格式则说明此数组成员数据是汇编语言中定义的数据,最后也要将其定义成汇编语言的数据格式,将翻译的结果不管是指令还是数据都保存到一个对应数目的新的指令数组里面,在下面的步骤5中的指令追踪,分离数据段和程序段,添加跳转标号,给程序分段各种操作中就以此数组数据为依据进行;
[0015]5)、追踪指令过程:是利用软件模拟单片机正常的执行流程,但不同的是这里只要认为单片机能够能执行的地方全都要追踪过去,这样做的目的就是为了实现指令与数据段的分离,同时在追踪的过程中可以将跳转语句和子程序调用语句标示出来,从而实现指令的分段;
[0016]6)、利用多文档程序结构显示反汇编结构,并按照功能按钮的控制进行显示或者导出。
[0017]作为进一步的技术方案,步骤5)中追踪指令过程如下:首先要建立四个大小可以根据数据自动调整的字符串集合,分别是访问过的指令集合A,子程序调用或中断处理程序调用时保存其断点的集合B,保存其分支判断语句的另一条指令的集合C和访问过的跳转标号集合D ;然后开始追踪,程序将按照指定的入口地址,去访问已经翻译好的指令数组,其数组的下标其实也就是该条指令的对应的地址,第一步判断该地址是否是已经被访问过或者超越最大地址或者是中断或子程序返回语句,如果不是,则把改指令加入集合A中,进而判断该语句是否是分支跳转语句,如果是则保存该分支跳转语句的另一条分支地址到集合B中,目的是当一条分支走完后,在重新走另一条分支;如果不是分支跳转语句,则判断是否是子程序调用或者是直接跳转语句,如果是子程序调用则先要保存一下该子程序调用完要返回的地址到集合C中,否则是直接跳转语句则按照其跳转的地址直接跳转;如果上述指令都不是,则是普通的运算类或逻辑类指令,将指令地址加I后重新重新调用该函数,进行进行下一条指令的追踪;到这里返回到开始如第一步判断为假的话,那么继续判断该指令是否是子程序或中断返回;如果是的话则同样将该指令加入到集合A中,否则,判断集合C中是否为空,不为空的话拿出最后一条指令,去追踪并将该条指令从集合中删除,直到该指令集合为空的时候以同样分方式再去拿集B合中的指令去跟踪,按照此流程直到把所有的指令跟踪完后,没有在已访问过的指令集合中的则肯定是数据段了,而对应的分段的信息则保存在访问过的集合D中;最后是根据这些已保存的信息,遍历整个指令数据,在遍历的过程中首先判断该指令知否在已集合A中,如果是说明此指令是一条正确的指令,进而再判断此指令是否在集合D中,如果是在说明要在这个地方进行分段处理;如果该指令没有在已追踪过的指令则定义成数据段,这样指令追踪,数据段根代码段分离,指令分段便完成了。[0018]由于采用了上述技术方案,与现有技术相比较,本发明集成了多种系列的单片机反汇编功能,用户可自行选择对应的单片机,然后导入BIN等格式文件,系统会自动反编译出对应的汇编文件,此汇编文件可实现数据与代码段的分离,并且将程序分段表示,子程序及跳转程序有对应的标号,每句程序有相应的注释,程序一目了然,结构层次分明,基本上如同手工编写的汇编文件,可以最大程度帮助开发者阅读及分析程序,同时,可将此汇编文件直接导入到对应型号的单片机开发环境中进行编译调试,现程序可以保证反编译出的汇编程序可以直接在原开发环境中正确的编译通过。
【专利附图】

【附图说明】
[0019]图1为本发明一种实施例的程序流程图。
【具体实施方式】
[0020]实施例
[0021]如图1所示,一种单片机从可执行文件找回汇编文件的实现方法,具体执行步骤如下:
[0022]步骤1:打开软件,单击打开文件按钮,弹出文件选择对话框,选择要打开的文件,文件的格式为.BIN,.HEX,.SN8。
[0023]步骤2:调用操作系统的文件操作函数,读取文件,生成可视化的十六进制字符
串O
[0024]步骤3:选择芯片系列和型号,保存为全局参数,根据芯片系列和型号,调取相应的处理数据表,函数,对象,属性,方法和结构体。
[0025]步骤4:读取已经建立好的芯片信息表,获取其指令位数,按指令位数将数据字符串截取生成数组,其下标即为地址,每一个数组成员反翻译过来就是一条指令,获取数组长度Length,声明存放反翻译出的指令数组Instrut。
[0026]步骤5:从数据库中筛选出该型号的芯片对应的指令表信息:指令掩码OpA、操作码OpB,原操作数掩码OpC、目的操作数掩码OpD,其他特殊数据掩码OpE,指令格式Foma,指令名称Name,指令位数Bit,指令类型Type,读取数据以行的形式放入内存表对象DataTable中,声明访问数组的索引Index,访问数据表的索引I,获取其数据表的行数Count0
[0027]步骤6:判断数组索引Index是否小于数组的总长度Length,如果则执行步骤7。否则则执行步骤18。
[0028]步骤7:获取对应下标的数组成员值按照其是大端还是小端进行转换得到要翻译的数据Data。
[0029]步骤8:判断访问数据表索引I是否小于指令数据表的总长度Count,如果是的话则执行步骤9 ;否则则执行步骤15。
[0030]步骤9:得到DataTabel中索引为I的行的指令掩码OpA,操作码OpB,原操作数掩码OpC,目的操作数掩码OpD,其他特殊数据掩码OpE,指令格式Fomat,指令名称Name,指令位数Bit,指令类型Type。Data与OpA与运算得到识别指令需要位数的数据DataA。
[0031]步骤10:判断DataA是否等于操作码OpB,如果相等的话则执行步骤11 ;否则则执行步骤15。
[0032]步骤11:判断原操作数OpC是否为空,如果不为空则OpC与Data与运算得到原操作数OpCdata ;否则则执行步骤14。
[0033]步骤12:判断目标操作数OpD是否为空,如果不为空,则OpD与Data与运算得到原操作数OpData,否则则执行步骤14
[0034]步骤13:判断其他类型的操作数OpE (主要是一些子程序调用和跳转语句,这类语句有特殊的操作数那就是跳转地址)是否为空,如果不为空,则OpE与Data与运算得到原操作数OpData,否则则执行步骤14。
[0035]步骤14:用上述步骤11、步骤12、步骤13获取的OpCdata, OpDdata, OpEdata分别替换Fomat中对应的部分,获取指令字符串,添加到指令数组Instruct [Index],同时退出指令表识别循环程序,跳转到步骤16进行下一条指令的识别。
[0036]步骤15:数据表索引I自动加1,同时跳转到步骤8,重复执行步骤8至步骤14过程,至到步骤8判定条件不在成立即指令数据表中所有的指令都,则执行步骤16。
[0037]步骤16:判定存储当前数据翻译出的指令的数组Instruct [Index]是否为空,如果为空,则说明当前数据不是任何一条指令的机器码,即当前数据就是数据段中的数据。即此时将该数据定义成汇编文件中的数据格式即可。否则如果不为空则执行步骤17
[0038]步骤17:数据数组访问索引Index自加1,同时跳转到步骤6,继续进行下一条指令的执行。
[0039]步骤18:从这一步骤开始进入指令追踪部分,用来给程序添加跳转或子程序调用的标号,定义数据段等功能,首先就是设定程序追踪的入口地址tracelndex,定义存储已访问过的地址集合A,保存分支另一条地址的集合B,保存子程序调用返回点或中断返回点的集合C,记录跳转标号的集合D。
[0040]步骤19:判断tracelndex是否小于指令条数的总长度Length并且tracelndex不在集合A中并且当前指令不是返回指令。如果条件满足则将该地址存入集合A中顺序向下执行,不满足则执行步骤23。
[0041]步骤20:判断当前指令是否是分支跳转如果是的话则将要跳转的地址给tracelndex,将另一分支的地址存入集合B中。否则向下执行。
[0042]步骤21:判断当前指令是否是子程调用语句,如果是的话则将要调用的地址给tracelndex,将一条指令的地址存入集合C中,同时将该地址存在集合D中。否则顺序向下执行。
[0043]步骤22:判断当前指令是否是直接跳转指令,如果是的话将要跳转的地址给tracelndex,同时将该地址存在集合D中。否则的话则将tracelndex自加I跳转到步骤
19执行。
[0044]步骤23:判断当前指令是否是返回指令,如果是则将该指令存入集合A中。
[0045]步骤24:判断集合C是否为空,如果不为空则将集合C最后一个地址给tracelndex,并移除该项,并跳转到步骤19。
[0046]步骤25:判断集合B是否为空,如果不为空则将该集合B中的最后一个地址给tracelndex,并移除该项,并跳转到步骤19。
[0047]步骤26:声明一个存放结果的字符串对象Str,建立一个循环索为ResultIndex引从O开始,长度为Length即数据数组的总长度,遍历数据数据,在遍历的过程中要判断该索引是否在存储已访问过的地址集合A中如果是说明当前索引的数据是指令,即将Intruct[ResultIndex]添加到对象Str中。否则将当前索引数据定义为数据段格式,如果当前索引在记录跳转标号的集合D中,就要在当前位置加入该索引对应的标号。同时还可以加入分割线(要放在注释里面)以便反出来的程序在编译的时候可以顺利通过。这样最终的结果就保存在了 Str对象里面,可以将此对象的内容显示在软件的显示数据控件里,或者导出到asm文件中,这样的完整的反汇编流程就完成了。
[0048]本发明不局限于上述的优选实施方式,任何人应该得知在本发明的启示下做出的变化,凡是与本发明具有相同或者相近似的技术方案,均属于本发明的保护范围。
【权利要求】
1.一种单片机从可执行文件找回汇编文件的实现方法,包括单片机内的汇编指令,其特征在于:单片机内的汇编指令实现数据与代码段的分离,并且将程序分段表示为子程序及跳转程序,子程序及跳转程序有各自对应的标号,并且每句程序有相应的注释,同时,单片机内的汇编指令直接导入到对应型号的开发环境中进行编译调试,可以保证反编译出的汇编程序可以直接在原开发环境中正确的编译通过。
2.根据权利要求1中所述的单片机从可执行文件找回汇编文件的实现方法,其特征在于:单片机从机器语言找回汇编语言的工具的系统工作步骤如下: 1)、打开要反汇编的源文件,工具会读取这些文件的内容,并转换成可视的十六进制字符串的; 2)、工具会将选择的芯片型号作为一个全局变量进行保存,在反翻译和追踪的过程中都会选择与该芯片型号对应的指令信息数据表、相关的处理函数、方法、对象; 3)、根据选择的芯片型号调取其指令执行的位数信息,将第一步中读取的文件数据按照这个单位进行截取,生成一个原数据的数组; 4)、反翻译的过程,反翻译的过程就是按照对应表,将机器码反向翻译成助记符,从而帮助开发者重新看懂程序,获取算法,进而改善或修改程序; 所述对应表是正常翻译指令的过程是将对应指令的助记符翻译成该指令唯一对应的机器码,在这其中必须要有一个相配合的对应表; 所述翻译是获取各种系列芯片的机器码表和对应的指令格式,然后依据此指令的机器码格式获取了这整个芯片系列的所有指令码基础数据表,同时,此指令中包含有指令掩码,指令掩码负责过滤出指令操作码部分数据,而后的操作码则与过滤出的指令操作码数据部分比较,如果一致则说明当前数据是本条指令,确定为那一条指令后再利用掩码筛选出对应的原操作数,目的操作数或其他特殊的得数据,筛选出对应的数据后则分别取替换对应当前指令的指令格式中的对应的字符,`这样这一条指令就被识别并反成汇编语言; 而翻译出所有的指令就是要建立一个原数据数组的索引,索引从零开始,以依次加一的方式来遍历原数据数组成员,按照上述操作步骤将每一个数组成员反应成对应的指令,如果该数组成员的数据不符合任何一条指令的机器码格式则说明此数组成员数据是汇编语言中定义的数据,最后也要将其定义成汇编语言的数据格式,将翻译的结果不管是指令还是数据都保存到一个对应数目的新的指令数组里面; 5)、追踪指令过程:是利用软件模拟单片机正常的执行流程,但不同的是这里只要认为单片机能够能执行的地方全都要追踪过去,指令追踪分离数据段和程序段,添加跳转标号,给程序分段各种操作中就以此数组数据为依据进行;这样做的目的就是为了实现指令与数据段的分离,同时在追踪的过程中可以将跳转语句和子程序调用语句标示出来,从而实现指令的分段; 6)、利用多文档程序结构显示分汇编结构,并按照功能按钮的控制进行显示或者导出。
3.根据权利要求2中所述的单片机从可执行文件找回汇编文件的实现方法,其特征在于:步骤5)中追踪指令过程如下:首先要建立四个大小可以根据数据自动调整的字符串集合,分别是访问过的指令集合A,子程序调用或中断处理程序调用时保存其断点的集合B,保存其分支判断语句的另一条指令的集合C和访问过的跳转标号集合D ;然后开始追踪,程序将按照指定的入口地址,去访问已经翻译好的指令数组,其数组的下标其实也就是该条指令的对应的地址,第一步判断该地址是否是已经被访问过或者超越最大地址或者是中断或子程序返回语句,如果不是,则把改指令加入集合A中,进而判断该语句是否是分支跳转语句,如果是则保存该分支跳转语句的另一条分支地址到集合B中,目的是当一条分支走完后,在重新走另一条分支;如果不是分支跳转语句,则判断是否是子程序调用或者是直接跳转语句,如果是子程序调用则先要保存一下该子程序调用完要返回的地址到集合C中,否则是直接跳转语句则按照其跳转的地址直接跳转;如果上述指令都不是,则是普通的运算类或逻辑类指令,将指令地址加I后重新重新调用该函数,进行进行下一条指令的追踪;到这里返回到开始如第一步判断为假的话,那么继续判断该指令是否是子程序或中断返回;如果是的话则同样将该指令加入到集合A中,否则,判断集合C中是否为空,不为空的话拿出最后一条指令,去追踪并将该条指令从集合中删除,直到该指令集合为空的时候以同样分方式再去拿集B合中的指令去跟踪,按照此流程直到把所有的指令跟踪完后,没有在已访问过的指令集合中的则肯定是数据段了,而对应的分段的信息则保存在访问过的集合D中;最后是根据这些已保存的信息,遍历整个指令数据,在遍历的过程中首先判断该指令知否在已集合A中,如果是说明此指令是一条正确的指令,进而再判断此指令是否在集合D中,如果是在说明要在这个地方进行分段处理;如果该指令没有在已追踪过的指令则定义成数据段, 这样指令追踪,数据段根代码段分离,指令分段便完成了。
【文档编号】G06F9/44GK103885770SQ201410025682
【公开日】2014年6月25日 申请日期:2014年1月21日 优先权日:2014年1月21日
【发明者】唐道成 申请人:唐道成
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1