首页> 中国专利> 一种生成快速出栈的汇编代码的编译方法及编译器

一种生成快速出栈的汇编代码的编译方法及编译器

摘要

本发明提供一种生成快速出栈的汇编代码的编译器,包括生成中间代码的前端处理模块和最终生成汇编代码的后端处理模块;所述后端处理模块增加:出栈检测模块,用来在前端处理模块生成中间代码后,判断当前程序是否有出栈操作;出栈地址处理单元,用来判断当前出栈地址是否符合C*core所规定的出栈地址要求;若符合,则以此地址作为最终的出栈地址直接输出,否则将堆栈地址通过地址计算单元改写成为符合C*core对堆栈地址要求的堆栈地址。本发明的优点和积极效果是:要比以前编译器编译出来的汇编指令中出栈指令要少,而在程序的运行过程中,压栈出栈是经常使用的指令;因此处理器所要执行的有效指令的条数要比以前少很多,从而提高了处理器的处理速度和性能。

著录项

  • 公开/公告号CN104216754A

    专利类型发明专利

  • 公开/公告日2014-12-17

    原文格式PDF

  • 申请/专利权人 天津国芯科技有限公司;

    申请/专利号CN201410490577.5

  • 发明设计人 兰光洋;王忠海;肖佐楠;郑茳;

    申请日2014-09-23

  • 分类号G06F9/45;

  • 代理机构天津滨海科纬知识产权代理有限公司;

  • 代理人杨慧玲

  • 地址 300457 天津市滨海新区开发区第四大街80号天大科技园软件大厦南楼309室

  • 入库时间 2023-12-17 03:04:46

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2017-05-17

    授权

    授权

  • 2015-01-07

    实质审查的生效 IPC(主分类):G06F9/45 申请日:20140923

    实质审查的生效

  • 2014-12-17

    公开

    公开

说明书

技术领域

本发明涉及处理器体系结构和编译器开发技术领域,尤其是涉及一种生成快速出栈的汇编代码的编译方法及编译器。 

背景技术

随着处理器技术和现代工艺的进步,处理器的运算速度越来越快,性能越来越强,同时人们对处理器的要求也越来越高。但仅仅依靠工艺的发展来满足人们日益增长对处理器性能的要求是远远不够的。因此,提高软件编写效率并最终减少有效代码长度变得越来越重要。 

在软件应用中,对堆栈的使用是很频繁的,比如函数中的参数值的保存,局部变量的保存等。现有技术中堆栈的出栈效率不高,极大的影响到了处理器的性能。 

例如,在含有堆栈指针的情况下,编译器针对C*core架构编译出的出栈指令如下: 

从上述C*core出栈操作的编译过程中的虚线框中内容可以看出,编译器在取出r4的堆栈指针后(r6中的值),根据C*core对堆栈指针的要求, 将r6的最低3位置成0(若低3位有值则此地址增加1),这样的话就增加了出栈时所需要的指令条数,降低了出栈速度。 

发明内容

本发明要解决的问题是提供一种生成快速出栈的汇编代码的编译方法及编译器,尤其适用于32位嵌入式CPU--C*core的处理器架构及其指令集。 

为解决上述技术问题,本发明采用的技术方案是: 

一种生成快速出栈的汇编代码的编译方法,包含: 

在对源程序进行预处理生成中间代码后,针对中间代码的堆栈操作,判断当前程序是否有出栈操作,并进行分类标记,同时提取出栈地址并进行保存; 

若无出栈操作,输出汇编指令; 

若有出栈操作,根据标记对其出栈地址进行分析,判断当前出栈地址是否符合C*core所规定的堆栈地址要求; 

若符合,则以此出栈地址作为最终的出栈地址,输出汇编指令; 

否则将出栈地址改写成为符合C*core对堆栈地址要求的出栈地址,输出汇编指令。 

进一步的,将出栈地址改写成为符合C*core对堆栈地址要求的出栈地址的方法是针对出栈地址的属性:字、半字或者字节来计算出其真正所需要的堆栈地址的基地址,并将其值赋给原来的地址寄存器。 

一种生成快速出栈的汇编代码的编译器,包括用于对源程序进行预处理并生成中间代码的前端处理模块和最终生成汇编代码的后端处理模块;所述后端处理模块增加: 

出栈检测模块,用来在前端处理模块生成中间代码后,判断当前程序是否有出栈操作; 

出栈地址处理单元,用来判断当前出栈地址是否符合C*core所规定的 出栈地址要求;若符合,则以此地址作为最终的出栈地址直接输出,否则将堆栈地址通过地址计算单元改写成为符合C*core对堆栈地址要求的堆栈地址。 

本发明具有的优点和积极效果是: 

经过本发明编译方法和编译器编译出来的出栈指令均要比以前编译器编译出来的汇编指令中出栈指令要少,而在程序的运行过程中,压栈出栈是经常使用的指令;因此,处理器所要执行的有效指令的条数要比以前少很多,从而提高了处理器的处理速度和性能。 

附图说明

图1是本发明的编译方法的流程示意图; 

图2是本发明的编译器的出栈检测模块的处理流程图; 

图3是本发明的编译器的出栈地址处理单元的处理流程图。 

具体实施方式

本发明的实施例是针对32位嵌入式CPU--C*core的处理器架构及其指令集的特点提出的一种生成快速出栈的汇编代码的编译方法和编译器,主要是针对简单的压栈出栈操作,不涉及到复杂的堆栈指针操作。下面结合附图对本发明的具体实施做详细说明。 

本发明一种生成快速出栈的汇编代码的编译方法,如图1所示包含: 

在对源程序进行预处理生成中间代码后,针对中间代码的堆栈操作,判断当前程序是否有出栈操作,并进行分类标记,同时提取出栈地址并进行保存; 

本发明对上述步骤的一具体实施过程为,根据C*core处理器对其堆栈的要求和其指令集特点对中间代码中的堆栈操作进行属性标记处理。例如某个函数中没有压栈出栈操作,则将这段代码标记为NULL属性;如果该函数中只有简单的压栈出栈操作(没有堆栈指针),那么将其标记为PP_Simple 属性;再如果,该函数拥有堆栈指针的利用则将其标记为PP_Pointer属性等;提取其堆栈地址信息并依照一定的算法将堆栈出栈地址保存下来。 

若无出栈操作,输出汇编指令; 

若有出栈操作,根据标记对其出栈地址进行分析,判断当前出栈地址是否符合C*core所规定的堆栈地址要求; 

本发明对上述步骤的一具体实施过程为,根据上述数据处理后的属性标记,对含有地址信息的堆栈操作进行进一步的分类,其分类方法主要是根据C*core处理器的架构和其对堆栈地址的要求,依据特定的算法来判断上步传递过来的堆栈地址是否符合C*core对堆栈的地址要求;同时记录这些含有地址信息的堆栈操作的出栈地址; 

若符合,则以此出栈地址作为最终的出栈地址,输出汇编指令;否则将出栈地址改写成为符合C*core对堆栈地址要求的出栈地址,输出汇编指令; 

本发明对上述步骤的一具体实施过程为,针对上述得到堆栈操作的出栈地址,判断其是否符合C*core对堆栈地址的要求(即每次出栈的地址的基地址必须为8的公倍数);如果满足,则将此出栈地址作为最终出栈用的地址;如不满足,则在保证正确的前提下,通过简单计算将原来的堆栈地址改写成为符合C*core对堆栈地址要求的堆栈地址,并以此为依据最终生成可快速出栈的汇编代码;所述简单计算可实现针对堆栈地址的属性:字、半字或者字节来计算出其真正所需要的堆栈地址的基地址,并将其值赋给原来的地址寄存器,作为最终出栈用的地址;例如具体汇编代码如下,式中虚线上边的部分为堆栈地址符合C*core对堆栈地址要求时的处理过程;虚线下边的部分为不符合时的处理过程: 

从上述代码可以看出,利用上述过程所产生的新的汇编代码在前端传递下来的堆栈地址符合C*core的堆栈地址的要求时,其出栈指令的额外计算部分被完全消除,这样可以节省3条汇编指令;即使在不满足C*core堆栈地址要求的条件下,其计算堆栈地址的有效地址的指令比原来节省了2条。 

一种生成快速出栈的汇编代码的编译器,包括用于对源程序进行预处理并生成中间代码的前端处理模块和最终生成汇编代码的后端处理模块;所述后端处理模块还包括: 

出栈检测模块,用来在前端处理模块生成中间代码后,判断当前程序是否有出栈操作;出栈检测模块的处理流程如图2所示,根据C*core处理器对其堆栈的要求和其指令集特点对中间代码中的堆栈操作进行标记处理;如某个函数中没有压栈出栈操作,则将这段代码标记为NULL属性;如果该函数中只有简单的压栈出栈操作(没有堆栈指针),那么将其标记为PP_Simple属性;再如果,该函数拥有堆栈指针的利用则将其标记为PP_Pointer属性 等; 

出栈地址处理单元,用来判断出栈检测模块提取的出栈地址是否符合C*core所规定的出栈地址要求;若符合,则以此地址作为最终的出栈地址直接输出,否则将堆栈地址通过地址计算单元改写成为符合C*core对堆栈地址要求的堆栈地址;出栈地址处理单元的处理流程如图3所示;地址计算单元可实现针对堆栈地址的属性:字、半字或者字节来计算出其真正所需要的堆栈地址的基地址,并将其值赋给原来的地址寄存器。 

经过本发明编译器编译出来的出栈指令要比以前编译器编译出来的汇编指令中出栈指令要少,而在程序的运行过程中,压栈出栈是经常使用的指令。这样一来,处理器所要执行的有效指令的条数要比以前少很多,从而提高了处理器的处理速度和性能。 

以上对本发明的实施例进行了详细说明,但所述内容仅为本发明的较佳实施例,不能被认为用于限定本发明的实施范围。凡依本发明申请范围所作的均等变化与改进等,均应仍归属于本发明的专利涵盖范围之内。 

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号