ITEEDU

嵌入式程序的定位

EXE文件格式和DOS重定位

DOS下的EXE文件是一种可重定位文件 (Re-locatableFile),它由重定位标头和装入模块组成.后者含 一段或几段程序代码,段数与类型取决于程序规模和编译时所用的内存模式,然后是 初始化与未初始化的数据及堆栈,还可能有程序排错信息.代码、数据和堆栈段地址 均是参考到程序开头的相对地址.标头放在装入模块之前,含若干定位控制信息和一 张定位表.控制信息包括EXE文件大小、标头长度、需要重定位的项数和位置、装 入模块的开头和堆栈的相对地址等.定位表是一组形式为段址:偏址的远指针,指示 装入模块中要重定位的那些段址相对于模块开头处的位置.装进RAM后,加载程序 建立起程序段前缀PSP,并根据系统当前可用RAM地址修改这些段址,对装入模 块重定位,使程序中所有参考绝对地址的量正确指向模块装入后的起始地址,然后执行).因此它可在RAM中的任何位置上执行.图 DOS对EXE文件的定位过程 。

嵌入式程序的定位

  嵌入式系统有ROM和RAM两类内存,程序被固化进ROM,而程序 变量和堆栈应设在RAM中.因此,对EXE文件的重定位过程与DOS下不一样.定位程序必须根据系统的ROM和RAM地址,对定位表中各远指针指向的字进行修改.定位程序最后以一种可加载进测试系统或可烧入EPROM的形式输出程序,即ROM图,它可以是二进制或Intel的HEX格式,根据EPROM编程器、仿真器或调试程序的要求而定. 可用两种方法把EXE文件转换为ROM图:

一是使用EXE2BIN命令.若EXE文件定位表中不含有定位远指针,EXE2BIN便将它转换成COM文件,它是可固化进EPROM的二进制文件,否则便放弃转换.这仅适用于较小的单段程序.较新版本的EXE2BIN在发现EXE文件中含重定位项时,会提示用户提供一个基地址,进行重定位.若选用适当的内存模式,并限制使用远指针,它也可能用一个基地址进行定位.但对于规模较大的程序,EXE2BIN无能为。

二是根据标头和MAP文件所提供的信息进行定位,适用于所有的EXE文件(图2).若在连接时进行限定,可生成只含内存分配段表的简单MAP文件.段表的每行描述一个段,按代码段、数据段和堆栈段的次序排列.MicrosoftC和BorlandC的MAP文件每行长度略有区别,但行上各参数(段始址、段末址、段长、段名、段类)的位置是固定的. 定位程序根据第一个RAM段的段名,从MAP文件中抽取出它的起始地址,它就是数据区的相对始址.再从标头内容计算出装入模块大小,即要占用的ROM容量.将系统ROM始址加上代码段在装入模块中的相对地址,便得到程序开始执行的地址.然后,对定位指针进行自小到大排序。

根据各段的始末地址逐段析出段址,并从装入模块中读入该段代码或数据.接着按定位指针顺序考察待定位的段址,若它落在该段范围内,便进行定位操作,即把此段址修改成实际的ROM或RAM地址.直到将属于这个段的定位指针全部处理好后,便把这段内容写到输出文件.对所有段都进行定位后,便获得ROM图. 图2 80x86系统上嵌入式程序的定位过程: