发明内容
本发明旨在解决现有技术中没有一种高效的方法将汇编语言转换成高级语言的技术问题,提供一种汇编语言到高级语言的代码转换方法,该代码的转换用程序的方法来实现,通过该程序可有效实现汇编语言到高级语言的转换。
本发明提供一种汇编语言到高级语言的代码转换方法,包括获取芯片中的汇编指令,所述代码转换方法还包括以下步骤:
步骤S100,建立高级语言的输出文本,并用该高级语言代码来模拟汇编指令对应的处理器运行环境;
步骤200,查找汇编指令对应的高级语言函数,并建立汇编指令与高级语言函数之间的映射关系表;
步骤S300,遍历汇编指令,提取包含指令地址、操作符和若干个操作码的数据项,并用数据结构表示;
步骤S400,解析出数据结构中的所有函数,自动生成并输出所有函数的声明到高级语言的输出文本中;
步骤S500,查找汇编指令与高级语言函数映射表,将每个函数生成对应的高级语言代码,并输出到高级语言的输出文本中;
步骤S600,在输出文本中加入使高级语言代码成功执行的辅助代码。
优选地,所述步骤S200包括,
若一条汇编指令直接转换成高级语言后,语句超过三句,则将该语句表示成函数,作为基本库函数,并将操作符作为函数名,操作码和相关寄存器的值作为函数的参数,然后参照处理器的指令说明实现这个函数;
否则,直接生成对应的高级语言函数
优选地,步骤S400具体包括,
步骤S410,搜索所有函数的入口地址;
步骤S420,搜索函数的结束地址,将所有的汇编指令的数据结构分割成一个个单独的函数;
步骤S430,判断是否还有未处理的函数,如果是,则返回步骤S410;如果否,则进入步骤S440;
步骤S440,根据记录下来的函数入口地址,自动生成并输出所有函数的声明到高级语言的输出文件中。
优选地,搜索函数的入口地址的具体方法为:从头遍历所有汇编指令的数据结构,寻找函数调用类语句,找到一个函数调用类语句后,根据后面操作码中的地址查找是否记录过该函数,
若否,则记录下来;
若是,则放弃记录并搜索下一个函数调用类语句。
优选地,搜索函数的结束地址的具体方法为:从每个函数的入口地址开始,搜索跳转类语句和返回类语句,找到一个返回类语句后,判断该语句的地址是否在遍历过程中碰到的所有的跳转语句的目的地址之后,
如果是,则这个返回语句就是函数的结尾;
否则,继续往下遍历,直到找到满足条件的返回语句。
优选地,在搜索函数的结束地址时,如果搜索到的是返回语句,则以返回语句所在的语句为函数结尾,如果搜索到的是延迟返回语句,则以该语句后的N个周期的指令为函数结尾,其中N为整数,具体数值根据所述处理器确定。
优选地,所述步骤S500中,将每个函数生成对应的高级语言代码的具体方法为,从每个函数的入口遍历函数,自动生成函数名和函数开始符号,并根据函数内每行的操作符和操作码在高级语言的输出文本中输出转换后对应的高级语言代码,函数结尾处生成函数结尾符号,复杂指令使用预先写好的基本函数库中的函数转换。
优选地,如果在转换过程中遇到未识别的操作符,则在输出文件中直接输出该指令和错误标志。
优选地,在所述步骤S500之后,步骤S600之前,还包括步骤S550,
检查产生的高级语言输出文本,若有错误标志或者有未识别出来的操作符,在步骤S500中加入对该符号的转换方法,直到所有需要的汇编语句都转换成高级语言代码。
本发明还提供一种汇编语言到高级语言的代码转换装置,包括汇编指令获取单元,用于获取芯片中的汇编指令,该汇编语言到高级语言的代码转换装置还包括,
输出模拟单元,用于建立高级语言的输出文本,并用该高级语言代码来模拟汇编指令对应的处理器运行环境;
映射单元,用于查找汇编指令对应的高级语言函数,并建立汇编指令与高级语言函数之间的映射关系表;
数据提取单元,用于提取汇编指令中包含指令地址、操作符和若干个操作码的所有数据项,并将其表示成数据结构;
函数解析单元,用于解析出数据结构中的所有函数,自动生成并输出所有函数的声明到高级语言的输出文本中;
高级语言转换单元,用于查找汇编指令与高级语言函数映射表,将每个函数生成对应的高级语言代码,并输出到高级语言的输出文本中
校验单元,用于在生成的高级语言的输出文本中加入使高级语言代码成功执行的辅助代码。
以上所述技术方案,通过先读取汇编指令文本,建立高级语言的输出文本,并用高级语言代码来模拟汇编指令对应的处理器运行环境,根据芯片指令集的翻译规则,将每汇编指令有用的数据项翻译成对应的高级语言,在对应的高级语言前后通过添加的一些辅助代码,将汇编指令的文本输出成对应的能直接通过编译的高级语言文本。该转换方法在大规模的汇编语言转换成高级语言的过程中,与完全人工转换相比,可以避免人的疏忽出错,减少机械性的劳动,高效的将汇编代码正确地转换为高级语言。
具体实施方式
为了使本发明所解决的技术问题、技术方案及有益效果更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
如图1所示,图1示出了本发明一种实施例的汇编语言到高级语言的代码转换方法,在所述代码转换前,首先获取芯片中的汇编指令,而本发明重点描述的是在已经获得汇编指令的基础上的后续汇编语言到高级语言的代码转换方法。 当然,该汇编指令也可在所述代码转换方法中用到该汇编指令时进行获取。获取汇编指令的一般方法是:使用专用设备可以从芯片电路或ROM内存中读取芯片运行的机器指令代码,将读取的指令代码改写成规定格式的机器指令输入文件,将机器指令文件按对应的起始地址导入对应的编译器中,得到对应的汇编指令,同时可以得到对应的汇编指令和该指令在内存空间中的存放地址。将全部的汇编指令保存为文本格式,优选地,每条指令一行。
所述汇编语言到高级语言的代码转换方法包括以下步骤:
步骤S100,建立高级语言的输出文本,并用该高级语言代码来模拟汇编指令对应的处理器运行环境;
在高级语言输出文件中,用该高级语言代码来模拟汇编指令对应的处理器运行的环境,代码运行时的堆栈空间和要用到的ROM内存表示成同样大小和类型的数组,CPU寄存器的值可以表示成全局变量,对用到的寄存器中特定的位,单独表示成一个变量,对照运行到特定位置时内存和寄存器的值,将堆栈空间和数组的值初始化。
步骤200,查找汇编指令对应的高级语言函数,并建立汇编指令与高级语言函数之间的映射关系表;
简单的汇编指令都有对应的高级语言函数,而复杂的汇编指令需要重新编写函数,若一条汇编指令直接转换成高级语言后,语句超过三句,则将该语句表示成函数,作为基本库函数,并将操作符作为函数名,操作码和相关寄存器的值作为函数的参数,然后参照处理器的指令说明实现这个函数;否则,直接生成对应的高级语言函数。最后建立各种汇编指令与高级语言函数之间的映射关系表。
步骤S300,遍历汇编指令,提取包含指令地址、操作符和若干个操作码的数据项,并用数据结构表示;
步骤S400,解析出数据结构中的所有函数,自动生成并输出所有函数的声明到高级语言的输出文本中;
步骤S500,查找汇编指令与高级语言函数映射表,将每个函数生成对应的高级语言代码,并输出到高级语言的输出文本中;
步骤S600,在输出文本中加入使高级语言代码成功执行的辅助代码。
以上实施例中,优选地,如图2所示,所述步骤S400具体包括,
步骤S410,搜索所有函数的入口地址;
步骤S420,搜索函数的结束地址,将所有的汇编指令的数据结构分割成一个个单独的函数;
步骤S430,判断是否还有未处理的函数,如果是,则返回步骤S410;如果否,则进入步骤S440;
步骤S440,根据记录下来的函数入口地址,自动生成并输出所有函数的声明到高级语言的输出文件中。
进一步地,在所述步骤S410中,搜索函数的入口地址的具体方法为:从头遍历所有汇编指令的数据结构,寻找函数调用类语句,找到一个函数调用类语句后,根据后面操作码中的地址查找是否记录过该函数,若否,则记录下来;若是,则放弃记录并搜索下一个函数调用类语句。函数调用类语句包括函数调用语句和函数延迟调用语句等。
进一步地,在所述步骤S420中,搜索函数的结束地址的具体方法为:从每个函数的入口地址开始,搜索跳转类语句和返回类语句,找到一个返回类语句后,判断该语句的地址是否在遍历过程中碰到的所有的跳转语句的目的地址之后,如果是,则这个返回语句就是函数的结尾;否则,继续往下遍历,直到找到满足条件的返回语句。
跳转类语句包括直接跳转语句、条件跳转语句、延迟跳转语句等,返回类语句包括返回语句和延迟返回语句等。找到一个返回语句后,判断该语句的地址是否在遍历过程中碰到的所有的跳转语句的目的地址之后,如果是,那么这个返回语句就是函数的结尾;如果不是,说明这只是函数中一个分支的返回语句,不是最后一个返回语句,那么继续往下遍历,直到找到满足条件的返回语句。如果是延迟返回语句,则以该语句后的N个周期的指令为函数结尾,其中N为整数,具体数值根据所述处理器确定。通过这种方法找到每个函数的结尾地址,将所有的汇编指令的数据结构分割成一个个单独的函数。
优选地,在所述步骤S500中,将每个函数生成对应的高级语言代码的具体方法为,从每个函数的入口遍历函数,自动生成函数名和函数开始符号,并根据函数内每行的操作符和操作码在高级语言的输出文本中输出转换后对应的高级语言代码,复杂指令使用预先写好的基本函数库中的函数转换。
根据操作码和已知的汇编表示符号,将数据结构中的项目识别为操作符、地址、寄存器符号、条件判断符号、立即数等,按照指令集,每个操作码对应的操作符总是固定的一种或几种,对有多种操作符情况的操作码,根据操作符的情况判断;扫描识别到的寄存器符号、地址等,转换成预定的全局变量和数组位置,给变量加上适当的括号和强制类型转换,数值转换成能被正确识别的形式;扫描识别到其他的符号,转换成对应的高级语言符号。
要调整语句顺序的指令,如延迟跳转、延迟调用、延迟条件判断、延迟返回等,先转换后面N个指令周期内的指令,然后按普通方式转换跳转、调用或返回指令放到后面。在延迟中执行的指令不影响指令延迟条件判断的判断条件,块循环指令可以全部用do-while形式的语句替换,语句开始的部分用“do{”转换,转换循环块中的所有行后,在结尾的部分插入“}while(…)”来转换,括号中间的“…”是块循环次数;如果指令中有未识别的操作符,在输出文件中直接输出该指令和错误标志。
进一步优选地,所述步骤S500之后,步骤S600之前,还包括步骤S550,
检查产生的高级语言输出文本,若有错误标志或者有未识别出来的操作符,在步骤S500中加入对该符号的转换方法,直到所有需要的汇编语句都转换成高级语言代码。所有语句中出现的操作符和操作参数都有对应的识别和转换方式。
以上转换方法在大规模的汇编语言转换成高级语言的过程中,与完全人工转换相比,可以避免人的疏忽出错,减少机械性的劳动,高效的将汇编代码正确地转换为高级语言。
如图3所示,本发明还提供一种汇编语言到高级语言的代码转换装置,包括汇编指令获取单元10,用于获取芯片中的汇编指令,所述代码转换装置还包括,
输出模拟单元20,用于建立高级语言的输出文本,并用该高级语言代码来模拟汇编指令对应的处理器运行环境;
映射单元30,用于查找汇编指令对应的高级语言函数,并建立汇编指令与高级语言函数之间的映射关系表;
对于简单的汇编指令,映射单元30直接查找对应的高级语言函数,并建立汇编指令与高级语言函数之间的映射关系表。
对于复杂指令,优选地,所述映射单元30还包括函数转换模块35,用于将复杂指令直接转换成高级语言后,则将该语句表示成函数作为基本库函数,并将操作符作为函数名,操作码和相关寄存器的值作为函数的参数,然后参照处理器的指令说明实现这个函数,之后在建立该负责指令与该函数之间的映射关系表。所述负责指令是指,一条汇编指令直接转换成高级语言后,语句超过三句的指令。
数据提取单元40,用于提取有用的数据项,即汇编指令中包含指令地址、操作符和若干个操作码的所有数据项,并将其表示成数据结构;
函数解析单元50,用于解析出数据结构中的所有函数,自动生成并输出所有函数的声明到高级语言的输出文本中;
高级语言转换单元60,用于查找汇编指令与高级语言函数映射表,将每个函数生成对应的高级语言代码,并输出到高级语言的输出文本中
校验单元70,用于在生成的高级语言的输出文本中加入使高级语言代码成功执行的辅助代码。
进一步地,所述解析单元50还包括,
函数入口地址搜索模块52,用于从头遍历所有汇编指令的数据结构,寻找函数调用类语句;
函数结束地址搜索模块54,用于搜索跳转类语句和返回类语句,并判断该返回类语句是否就是函数的结尾;
判断模块56,用于判断是否还有未处理解析的函数;
转换输出模块58,用于根据函数入口地址,自动生成并输出所有函数的声明到高级语言的输出文件中。
更近一步地,所述高级语言转换单元60还包括校对模块65,用于检查产生的高级语言输出文本中的错误标志或者未识别出来的操作符,并加入对该符号的转换方法。
以上技术方案中,通过汇编指令获取单元10获取汇编指令后,通过输出模拟单元20、映射单元30、数据提取单元40、函数解析单元50、高级语言转换单元60及校验单元70可以实现最终高级语言文本的输出,确保转换后的该高级语言代码成果执行。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。