
1.本发明涉及计算机信息处理技术领域,尤其涉及一种多层级的汇编代码片段解析方法、系统及装置。
背景技术:2.由于汇编代码在编译的过程中失去了高级语言原本的抽象语义,造成代码逻辑关系难以理解,开发人员需要自己处理每条指令和每一个数据的存储分配和输入输出,还需理清程序运行过程中每步所处的工作状态,所以手工的修改汇编代码对于开发人员花费巨大,同时汇编代码的代码量一般较大,开发人员手动的修改更容易出错,同时内联汇编的方法只适用于对部分小代码片段的替换,大量的使用内联汇编会影响高级语言的可读性。现有的汇编代码优化器只能识别一些已经定义的代码特征,并在此基础上做出修改。这些代码特征往往只是表现在小范围的,无法满足开发人员对于任意指定的范围代码进行自定义修改和替换的要求文件读数据的效率也同样很低下。
技术实现要素:3.为了解决上述技术问题,本发明的目的是提供一种多层级的汇编代码片段解析方法、系统及装置,可以分析汇编代码的不同层次信息,并根据开发人员的要求,替换对应层次的汇编代码。
4.本发明所采用的第一技术方案是:一种多层级的汇编代码片段解析方法,其特征在于,包括以下步骤:
5.获取汇编文件并根据汇编文件读取汇编代码;
6.将汇编代码转换为中间格式表示并按序连接,得到线性链表;
7.对线性链表进行分析,得到不同层次的代码信息。
8.进一步,所述一种多层级的汇编代码片段解析方法,其特征在于,还包括替换步骤,具体包括:
9.根据不同层次的代码信息构造分区查找表;
10.获取替换信息并结合分区查找表,修改待替换代码的线性链表,得到替换后的中间格式。
11.进一步,所述读取生成的汇编代码这一步骤,其具体包括:
12.根据源代码获取对应的汇编文件;
13.基于编译器对汇编文件进行编译,并在命令行中给编译器添加
“‑
s”选项,得到汇编代码。
14.进一步,所述将汇编代码转换为中间格式表示并按序连接,得到线性链表这一步骤,其具体包括:
15.将汇编代码转换为中间格式表示;
16.所述中间格式表示包括汇编代码的操作符、操作数和类别信息;
17.根据每一条汇编代码各自在原有代码中的相对位置,将对应的中间格式进行连接,得到线性链表。
18.进一步,所述获取替换信息并结合分区查找表,修改待替换代码的线性链表,得到替换后的中间格式这一步骤,其具体包括:
19.获取替换信息并根据替换信息和分区查找表寻找待替换代码的汇编代码文件的代码片段,确定代码片段的范围;
20.根据代码片段的范围,将链表中替换代码入口指令的上一条的语句所指向下一条语句的指针指向被替换代码的入口指令,将待替换代码出口指令的下一条语句指向替换代码出口语句的下一条语句;
21.得到替换后的中间格式。
22.进一步,所述获取替换信息并结合分区查找表,修改待替换代码的线性链表,得到替换后的中间格式这一步骤还包括:
23.查看待替换代码片段中是否存在对外部代码的控制依赖和数据依赖;
24.检查替换后的代码中是否存在外部代码里已定义的变量和函数。
25.本发明所采用的第二技术方案是:一种多层级的汇编代码片段解析系统,其特征在于,包括:
26.读取模块,用于获取汇编文件并根据汇编文件读取汇编代码;
27.线性链表模块,用于将汇编代码转换为中间格式表示并按序连接,得到线性链表;
28.信息模块,对线性链表进行分析,得到不同层次的代码信息。
29.本发明所采用的第二技术方案是:一种多层级的汇编代码片段解析装置,其特征在于,包括:
30.至少一个处理器;
31.至少一个存储器,用于存储至少一个程序;
32.当所述至少一个程序被所述至少一个处理器执行,使得所述至少一个处理器实现如上所述一种多层级的汇编代码片段解析方法。
33.本发明方法、系统及装置的有益效果是:本发明提出的一种多层级的汇编代码片段解析方法、系统及装置,可以对汇编代码在多个层级进行分析和提取,从而允许开发人员对汇编代码在不同范围进行代码的修改和替换,不必依赖于特定的代码模式,另外,对比手工修改汇编代码,本发明可以自动替换指定的代码片段,减少开发人员工作量和出错概率。
附图说明
34.图1是本发明具体实施例代码解析的流程示意图;
35.图2是本发明具体实施例代码替换的流程示意图;
36.图3四本发明具体实施例一种多层级的汇编代码片段解析系统的结构框图。
具体实施方式
37.下面结合附图和具体实施例对本发明做进一步的详细说明。对于以下实施例中的步骤编号,其仅为了便于阐述说明而设置,对步骤之间的顺序不做任何限定,实施例中的各步骤的执行顺序均可根据本领域技术人员的理解来进行适应性调整。
38.参照图1和图2,本发明提供了一种多层级的汇编代码片段解析方法,该方法包括以下步骤:
39.s1、获取汇编文件并根据汇编文件读取汇编代码;
40.s1.1、根据源代码获取对应的汇编文件;
41.s1.2、基于编译器对汇编文件进行编译,并在命令行中给编译器添加
“‑
s”选项,得到汇编代码。
42.具体地,首先需要获得源代码对应的汇编文件,在可执行文件的编译过程时,通过在命令行中给编译器添加
“‑
s”选项,使得编译器输出每个源文件的汇编代码;同时编译器需要使用
“‑‑
target”选项指定目标平台,目标平台为可执行文件运行的环境,以确保生成对应目标平台的汇编代码,生成的汇编代码将以文本文件的形式保存;
43.s2、将汇编代码转换为中间格式表示并按序连接,得到线性链表;
44.s2.1、将汇编代码转换为中间格式表示;
45.s2.2、所述中间格式表示包括汇编代码的操作符、操作数和类别信息;
46.s2.3、根据每一条汇编代码各自在原有代码中的相对位置,将对应的中间格式进行连接,得到线性链表。
47.具体地,每一行汇编代码从结构上可以被分为两部分:操作符和操作数;操作符表示了代码的功能或提供指示信息,操作符为操作数提供执行功能所需的参数,操作数的数目根据指令的要求是可变的,一般可以从0到3个。根据汇编代码的功能不同,汇编代码可以被分为三类:标签,伪指令,指令。标签用于指令的跳转和对代码范围的标识;伪指令为编译过程提供额外的辅助信息,例如:定义数据的长度和类型,它们并不直接参与代码的执行,也不产生真正的机器代码;指令是cpu运行的基本单位,控制了cpu的执行。根据代码生成的通用的中间表示保存了汇编代码原有的操作符、操作数和类别的信息,以便后续代码的分析和还原。每一条代码的中间表示按照各自在原有的代码中的相对位置相互连接,形成一条线性的链表,这条链表代表着这个汇编文件所有代码。同时汇编代码的顺序十分重要的,除非是遇到控制流相关的指令而造成的指令跳转之外,指令一般是从上到下顺序执行的,所以汇编代码解析的顺序需要按照原有的顺序从上到下读取,这个顺序信息也表现在链表中的不同中间表示的相对位置关系中。
48.s3、对线性链表进行分析,得到不同层次的代码信息;
49.具体地,在读取完所有的汇编代码之后,对之前得到的中间表示构成的链表进行分析以得到代码中不同层次的信息:指令层次是最小的层次信息,保存在每条指令的中间表示中,例如:在链表中指针值,指令的序号,前后的指令信息等。基本块是一组指令的集合,并且保证不会存在跳转指令从基本块中间跳出,它的信息包括:标签名字,入口指令,出口指令,上一个基本块等。函数层次包含了多个基本块,基本块之间构成控制流图,它的信息包括:函数名,函数参数,返回值。不同的指令按照功能的区别分类为不同的节(section)中,构成节层级,例如只读数据节、代码节等,它的信息包括:节所在位置的指针,节中包含的指令数量等。最大的层次是编译单元,包含了一个汇编文件里的所有代码信息。
50.s4、根据不同层次的代码信息构造分区查找表;
51.具体地,每个层级会对应一个分区查找表,来确定每个层级中的分区信息,以便快速检索分区和查找分区位置。
52.通过这个识别部分,可以解析汇编代码并且得到不同层级的代码信息,生成的链表结构保留了原有汇编代码文件中的所有原始信息。
53.s5、获取替换信息并结合分区查找表,修改待替换代码的线性链表,得到替换后的中间格式;
54.s5.1、获取替换信息并根据替换信息和分区查找表寻找待替换代码的汇编代码文件的代码片段,确定代码片段的范围;
55.s5.2、根据代码片段的范围,将链表中替换代码入口指令的上一条的语句所指向下一条语句的指针指向被替换代码的入口指令,将待替换代码出口指令的下一条语句指向替换代码出口语句的下一条语句;
56.s5.3、得到替换后的中间格式。
57.具体地,代码替换时根据上面得到的被替换汇编代码文件和替换汇编代码文件的解析结果,以及指定层次的替换信息,如:函数名,文件名等,进行汇编代码的替换。首先使用利用两个文件的解析信息得到两条链表表示的指令和相关的层次信息,然后根据指定的替换信息在两边寻找对应的代码片段,确定代码片段的范围和依赖信息。将链表中替换代码入口指令的上一条的语句所指向下一条语句的指针指向被替换代码的入口指令,然后将被替换代码出口指令的下一条语句指向替换代码出口语句的下一条语句,这样就完成代码的基本替换。
58.s5.4、查看待替换代码片段中是否存在对外部代码的控制依赖和数据依赖;
59.s5.5、重名分析。
60.具体地,控制依赖是指被替换代码中存在当前代码不合法的分支跳转语句,数据依赖是指替换代码中存在当前代码不合法的数据定义。由于这些依赖项存在于替换文件中,所以也要将替换文件中的所有涉及依赖项复制到被替换文件中,这些指令直接加到对应层级区域的链表最后即可,例如:如果存在一些变量未定义导致的数据依赖,需要在替换文件的数据节中找到这个数据定义相关的指令,将其添加到被替换文件中数据节的最后。
61.另外,还需要进行重名分析,防止原有代码和替换代码发生重名冲突。如果出现重名,需要重新为其中一个生成一个新的名字。依次检查替换后的代码中所有被定义的变量名和函数名是否在分区查找表中记录的符号信息中出现,如果找到,则意味着出现相同了重名。修改的方法是:对于出现重名的函数或变量定义,生成一个由6位数字组成的随机数作为后缀附加在原有定义的名字后面,作为新函数或变量名,并再次进行重名分析,直至重名被消除。
62.s6、将替换后的中间格式还原为汇编代码并输出,得到替换之后的汇编代码文件。
63.具体地,将中间格式还原为汇编代码并输出,以中间表示链表中的第一条语句作为入口语句,将每个结构所代表的指令打印为代码字符串到文本文件中,依次打印整条链表中的所有语句,得到替换之后的汇编代码文件。
64.该部分可以将汇编文件中不同层次的代码片段与目标汇编代码自动匹配和替换。
65.相对于现有的汇编级别的优化器,本方法可以在多个层次进行对任意指定的代码替换,解除对指令数目和特定代码模式的限制
66.如图3所示,一种多层级的汇编代码片段解析系统,包括:
67.读取模块,用于获取汇编文件并根据汇编文件读取汇编代码;
68.连接模块,用于将汇编代码转换为中间格式表示并按序连接,得到线性链表;
69.分析模块,对线性链表进行分析,得到不同层次的代码信息。
70.进一步,还包括:
71.构造模块,用于根据不同层次的代码信息构造分区查找表;
72.替换模块,用于获取替换信息并结合分区查找表,修改待替换代码的线性链表,得到替换后的中间格式;
73.还原模块,用于将替换后的中间格式还原为汇编代码并输出,得到替换之后的汇编代码文件。
74.上述方法实施例中的内容均适用于本系统实施例中,本系统实施例所具体实现的功能与上述方法实施例相同,并且达到的有益效果与上述方法实施例所达到的有益效果也相同。
75.一种多层级的汇编代码片段解析装置:
76.至少一个处理器;
77.至少一个存储器,用于存储至少一个程序;
78.当所述至少一个程序被所述至少一个处理器执行,使得所述至少一个处理器实现如上所述一种多层级的汇编代码片段解析方法。
79.上述方法实施例中的内容均适用于本装置实施例中,本装置实施例所具体实现的功能与上述方法实施例相同,并且达到的有益效果与上述方法实施例所达到的有益效果也相同。
80.以上是对本发明的较佳实施进行了具体说明,但本发明创造并不限于所述实施例,熟悉本领域的技术人员在不违背本发明精神的前提下还可作出种种的等同变形或替换,这些等同的变形或替换均包含在本技术权利要求所限定的范围内。