一种risc处理器应用程序编译中立即数的锚地址装载方法

文档序号:6425126阅读:159来源:国知局
专利名称:一种risc处理器应用程序编译中立即数的锚地址装载方法
技术领域
本发明涉及RISC处理器应用程序的编译和链接技术领域,尤其是一种应用程序编译中立即数的锚地址装载方法。
背景技术
在基于RISC处理器的嵌入式系统开发中,处理器编译和链接是必不可少的工具, 编译模块将用户高级语言(一般为C/C++语言)编写而成的代码转换为处理器可识别的二进制代码,链接模块则将多个这样的二进制代码模块一起链接成为可以在处理器上运行的二进制可以执行程序。由于32位RISC架构处理器无法直接在指令中编码32位地址立即数,所以当前业内RISC架构处理器都是通过访问内存指令如LOAD指令来完成装载地址立即数,存在效率低和代码密度低的问题。目前RISC处理器应用程序的编译链接中,地址立即数装载主要采用处理器的访问内存指令,如LOAD指令完成。嵌入式RISC处理器的访问内存指令一般需要占用外部数据地址总线,需要多个周期完成,从而导致该指令比一般的运算类,如加法指令运行效率更低。所以通过访问内存指令来装载地址立即数虽然实现简单,但是效率低,除了访问内存指令外,还需要额外的空间来存放32位的地址立即数。

发明内容
为了克服已有RISC处理器应用程序编译中立即数装载方法的工作效率低、占用额外的存储空间、实时性差的不足,本发明提供一种提升工作效率、不需要消耗额外内存空间、实时性良好的RISC处理器应用程序编译中立即数的锚地址装载方法。本发明解决其技术问题所采用的技术方案是一种RISC处理器应用程序编译中立即数的锚地址装载方法,所述应用程序包括代码段和数据段;为应用程序的代码段分配一个通用寄存器存放代码段锚地址Rx,并将其初始化为代码段的基地址,当应用程序需要装载一个代码段符号地址立即数IAx时,采用公式 (Rx)+ {IAx-(Rx)}对应的处理器加法指令实现锚地址装载;同时,为应用程序的数据段分配一个通用寄存器作为数据段锚地址Ry,并将其初始化为数据段基地址,当应用程序需要装载一个数据段符号地址立即数IAy时,采用公式 (Ry) + {IAy- (Ry)}对应的处理器加法指令实现锚地址装载。进一步,所述锚地址装载方法包括以下步骤(1)为应用程序分配两个寄存器Rx,Ry,分别用于存放代码段锚地址和数据段锚地址;(2)定义代码段地址立即数锚地址装载的重定位信息数组ARx,并做初始化;如果应用程序的代码段的地址Lx处需要装载属于代码段的地址立即数IAx到寄存器Rm,则生成一个代码段重定位信息RELx存放在数组ARx中,该信息包含需要重定位的代码段地址Lx, 代码段符号地址立即数IAx和寄存器Rm ;(3)定义代码段地址立即数锚地址装载的重定位信息数组ARy,并做初始化;如果处理器应用程序的代码段的地址Ly处需要装载属于数据段的地址立即数IAy到寄存器1 , 则生成一个数据段重定位信息RELy存放在数组ARy中,该信息包含需要重定位的代码段地址Ly,数据段符号地址立即数IAy和寄存器to ;(4)对各输入文件的代码段和数据段进行链接,将链接结果重新输出到目标应用程序的代码段和数据段,并暂存输出目标应用程序的代码段锚地址为At和数据段锚地址为Ad;(5)对各输入的代码段和数据段进行链接时,扫描步骤( 输出的重定位信息数组ARx,对数组中每个代码段重定位信息RELx做如下操作(5. 1)根据步骤(2)中生成的RELx所包含的IAx和步骤(4)中暂存的At,计算 IAx-At,暂存为代码段立即数偏移量OFFSETx ;(5. 2)在RELx包含的Lx处,生成Rm < -(Rx) +OFFSETx对应的处理器加法指令;(6)对各输入的代码段和数据段进行链接时,扫描步骤C3)输出的重定位信息数组ARy,对数组中每个数据段重定位信息RELy做如下操作(6. 1)根据步骤(3)中生成的RELy所包含的IAy和步骤(4)中暂存的Ad,计算 IAy-Ad,暂存为数据段立即数偏移量OFFSETy ;(6. 2)在RELy包含数的Ly处,生成1 < - (Ry) +OFFSETy对应的处理器加法指令;(7)将步骤⑴的Rx初始化为步骤⑷暂存的代码段锚地址At,步骤⑴的Ry 初始化为步骤(4)暂存的数据段锚地址Ad。 本发明的有益效果主要表现在1)对地址立即数的装载不涉及访问内存,应用程序的运行效率高;2)不需要消耗额外的内存空间,提高了应用程序的代码密度;3)可以有效降低CPU对外部总线的占用率,提高系统实时性;4)该方法可以在多种RISC处理器的编译链接模块中实现,有很强的移植性;5)该方法对RISC处理器的编译链接模块的改动很小,改动代价低。


图1是支持地址立即数锚地址装载的应用程序编译链接示意图;图2是编译模块中地址立即数的锚地址装载执行遍流程图;图3是链接模块对地址立即数的锚地址装载流程图。
具体实施例方式下面结合附图对本发明作进一步描述。参照图1 图3,一种RISC处理器应用程序编译中立即数的锚地址装载方法,所述应用程序包括代码段和数据段;为应用程序的代码段分配一个通用寄存器存放代码段锚地址Rx,并将其初始化为代码段的基地址,当应用程序需要装载一个代码段符号地址立即数IAx时,采用公式(Rx)+ {IAx-(Rx)}对应的处理器加法指令实现锚地址装载;同时,为应用程序的数据段分配一个通用寄存器作为数据段锚地址Ry,并将其初始化为数据段基地址,当应用程序需要装载一个数据段符号地址立即数IAy时,采用公式 (Ry) + {IAy- (Ry)}对应的处理器加法指令实现锚地址装载。参照图1,具体实施包括如下步骤(1)编译模块中,为处理器应用程序分配两个寄存器Rx,Ry,分别用于存放代码段锚地址和数据段锚地址,并参照图2的200以插件的方式增加立即数锚地址装载执行遍;(2)参照图2的201,定义代码段地址立即数锚地址装载的重定位信息数组ARx,并做初始化,数组中每个成员变量包含需要重定位的代码段地址Lx,被装载的立即数和装载的目标寄存器;(3)参照图2的202,定义代码段地址立即数锚地址装载的重定位信息数组ARy,并做初始化,数组中每个成员变量包含需要重定位的代码段地址,被装载的立即数和装载的目标寄存器;(4)参照图2的203 206,如果处理器应用程序的代码段中需要装载属于代码段的地址立即数A_Fimc到寄存器Rm,则生成一个重定位信息RELx存放在步骤( 所初始化的数组ARx中,该信息包含需要重定位的代码段地址Lx,代码段的地址立即数A_Fimc和寄存器Rm;(5)参照图2的207 210,如果处理器应用程序的代码段中需要装载属于数据段的地址立即数々_0站3到1 ,则生成一个重定位信息RELy存放在步骤C3)所初始化的数组ARy中,该信息包含需要重定位的代码段地址Ly,数据段的地址立即数A_Data和寄存器 Rn ;(6)在链接模块中,对各输入文件的代码段和数据段进行链接,将链接结果重新输出到目标应用程序的代码段和数据段,并暂存输出目标应用程序的代码段锚地址为At和数据段锚地址为Ad,同时参照图3的300,以插件方式增加立即数锚地址重定位过程;(7)参照图3的300,对各输入的代码段和数据段进行链接时,扫描步骤(4)输出的重定位信息数组ARx,对数组中每个重定位信息RELx做如下操作(7. 1)根据(4)中生成的RELx所包含的A_Func和步骤(6)中暂存的At,参照图3 的301,计算A_Func-At,暂存为代码段立即数偏移量0FFSET_A_Func,即0FFSET_A_Func = A_Func-At ;(7. 2)参照图 3 的 302 和 303,在 RELx 包含的 Lx 处,生成 Rm < - (Rx) +0FFSET_A_ Func对应的处理器加法指令;(8)参照图3的300,对各输入的代码段和数据段进行链接时,扫描步骤( 输出的重定位信息数组ARy,对数组中每个重定位信息RELy做如下操作(8. 1)根据(5)中生成的RELy所包含的A_Data和步骤(6)中暂存的Ad,参照图 3的304,计算A_Data-Ad,暂存为数据段立即数偏移量0FFSET_A_Data,BP 0FFSET_A_Data = A_Data_Ad ;(8. 2)参照图 3 的 305 和 306,在 RELy 包含数的 Ly 处,生成 Rn < - (Ry) +0FFSET_ A_Data对应的处理器加法指令;(9)在应用程序启动时,将步骤(1)的Rx初始化为步骤(6)暂存的代码段锚地址At,步骤(1)的Ry初始化为步骤(6)暂存的数据段锚地址Ad。实例在RISC处理器编译模块和链接模块中使用本方法实现将myFimction装载到myCallhck函数指针变量,将myData的地址装载到myDataPTR整数指针变量。实现本实施例具体所包含的步骤如下(1)在编译模块中,为处理器应用程序分配两个寄存器R30,R31,分别用于存放代码段锚地址和数据段锚地址,并参照图2的200以插件的方式增加立即数锚地址装载执行遍;(2)参照图2的201,定义代码段地址立即数锚地址装载的重定位信息数组ARRAY_ Relocatior^Text,并做初始化,数组中每个成员变量包含需要重定位的代码段地址,被装载的立即数和装载的目标寄存器;(3)参照图2的202,定义代码段地址立即数锚地址装载的重定位信息数组ARRAY_ Relocatior^Data,并做初始化,数组中每个成员变量包含需要重定位的代码段地址,被装载的立即数和装载的目标寄存器;(4)参照图2的203 206,为myCallhck函数指针变量分配寄存器Rl,并且发现处理器应用程序的代码段中需要装载属于代码段的地址立即数myFimction到myCallhck 函数指针变量即寄存器R1,则生成一个重定位信息RELjiiyFimction存放在数组ARRAY_ Relocation_Text中,该信息包含需要重定位的代码段地址Location_myCallback, myFunction函数地址和Rl ;(5)参照图2的207 210,如果处理器应用程序的代码段中需要装载属于数据段的myData变量的地址立即数到R2,则生成一个重定位信息RELjnyData存放在数组ARRAY_ Relocation_Data中,该信息包含需要重定位的代码段地址Location_myDataPTR,myData 变量地址和R2 ;(6)在链接模块中,对各输入文件的代码段和数据段进行链接,将链接结果重新输出到目标应用程序的代码段和数据段,并暂存输出目标应用程序的代码段锚地址为 Address_Text_Mart和数据段锚地址为Address_Data_Mart,同时参照图3的300,以插件方式增加立即数锚地址重定位过程;(7)参照图3的300,对各输入的代码段和数据段进行链接时,扫描步骤(4)输出的重定位信息数组ARRAY_Relocation_Text,对数组中每个重定位信息REL_myFunction做如下操作(7. 1)根据步骤J4)中生成的REL_myFunction所包含的myFunction和步骤(6) 中暂存的 Address_Text_Start,计算(myFunction_Address_Text_Start),暂存为 0FFSET_ myFunction ;(7. 2)在 REL_myFunction 包含的 Location_myCalIback 处,生成 Rl < -(R30) +0FFSET_myFunction处理器对应的加法指令;(8)参照图3的300,对各输入的代码段和数据段进行链接时,扫描步骤( 输出的重定位信息数组ARRAY_Relocation_Data,对数组中每个重定位信息RELjnyData做如下操作(8. 1)根据步骤(5)中生成的RELjnyData所包含的myData和步骤(6)中暂存的 Address_Data_Start,计算(myData_Address_Data_Start),暂存为 0FFSET_myData ;
(8. 2)在 REL_myData 包含数的 Location_myDataPTR 处,生成 R2 < -(R31)+OFFSETjnyData对应的处理器加法指令;(9)在应用程序启动时,将步骤⑴的R30初始化为步骤(6)暂存的代码段锚地址Address_Text_Mart,步骤(1)的R30初始化为步骤(6)暂存的数据段锚地址Address_ Data Start。
权利要求
1.一种RISC处理器应用程序编译中立即数的锚地址装载方法,其特征在于所述应用程序包括代码段和数据段;为应用程序的代码段分配一个通用寄存器存放代码段锚地址Rx,并将其初始化为代码段的基地址,当应用程序需要装载一个代码段符号地址立即数IAx时,采用公式 (Rx)+ {IAx-(Rx)}对应的处理器加法指令实现锚地址装载;同时,为应用程序的数据段分配一个通用寄存器作为数据段锚地址Ry,并将其初始化为数据段基地址,当应用程序需要装载一个数据段符号地址立即数IAy时,采用公式 (Ry) + {IAy- (Ry)}对应的处理器加法指令实现锚地址装载。
2.如权利要求1所述的RISC处理器应用程序编译中立即数的锚地址装载方法,其特征在于所述锚地址装载方法包括以下步骤(1)为应用程序分配两个寄存器Rx,Ry,分别用于存放代码段锚地址和数据段锚地址;(2)定义代码段地址立即数锚地址装载的重定位信息数组ARx,并做初始化;如果应用程序的代码段的地址Lx处需要装载属于代码段的地址立即数IAx到寄存器Rm,则生成一个代码段重定位信息RELx存放在数组ARx中,该信息包含需要重定位的代码段地址Lx,代码段符号地址立即数IAx和寄存器Rm ;(3)定义代码段地址立即数锚地址装载的重定位信息数组ARy,并做初始化;如果处理器应用程序的代码段的地址Ly处需要装载属于数据段的地址立即数IAy到寄存器to,则生成一个数据段重定位信息RELy存放在数组ARy中,该信息包含需要重定位的代码段地址 Ly,数据段符号地址立即数IAy和寄存器1 ;(4)对各输入文件的代码段和数据段进行链接,将链接结果重新输出到目标应用程序的代码段和数据段,并暂存输出目标应用程序的代码段锚地址为At和数据段锚地址为Ad ;(5)对各输入的代码段和数据段进行链接时,扫描步骤( 输出的重定位信息数组 ARx,对数组中每个代码段重定位信息RELx做如下操作(5. 1)根据步骤(2)中生成的RELx所包含的IAx和步骤(4)中暂存的At,计算IAx-At, 暂存为代码段立即数偏移量OFFSETx ;(5. 2)在RELx包含的Lx处,生成Rm < - (Rx)+OFFSETx对应的处理器加法指令;(6)对各输入的代码段和数据段进行链接时,扫描步骤C3)输出的重定位信息数组 ARy,对数组中每个数据段重定位信息RELy做如下操作(6. 1)根据步骤(3)中生成的RELy所包含的IAy和步骤(4)中暂存的Ad,计算IAy-Ad, 暂存为数据段立即数偏移量OFFSETy ;(6. 2)在RELy包含数的Ly处,生成1 < - (Ry)+OFFSETy对应的处理器加法指令;(7)将步骤⑴的Rx初始化为步骤⑷暂存的代码段锚地址At,步骤⑴的Ry初始化为步骤(4)暂存的数据段锚地址Ad。
全文摘要
一种RISC处理器应用程序编译中立即数的锚地址装载方法,为应用程序的代码段分配一个通用寄存器存放代码段锚地址Rx,并将其初始化为代码段的基地址,当应用程序需要装载一个代码段符号地址立即数IAx时,采用公式(Rx)+{IAx-(Rx)}对应的加法指令实现锚地址装载;同时,为应用程序的数据段分配一个通用寄存器作为数据段锚地址Ry,并将其初始化为数据段基地址,当应用程序需要装载一个数据段符号地址立即数IAy时,采用公式(Ry)+{IAy-(Ry)}对应的加法指令实现锚地址装载。本发明能提升应用程序工作效率、不需要消耗额外的内存空间、实时性良好。
文档编号G06F9/45GK102207882SQ20111014112
公开日2011年10月5日 申请日期2011年5月27日 优先权日2011年5月27日
发明者严晓浪, 李春强, 葛海通 申请人:杭州中天微系统有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1