《TMS320C54x软件开发.ppt》由会员分享,可在线阅读,更多相关《TMS320C54x软件开发.ppt(77页珍藏版)》请在金锄头文库上搜索。
1、第第5章章 TMS320C54x软件开发软件开发5.1 软件开发过程及开发工具软件开发过程及开发工具5.2 公共目标文件格式公共目标文件格式5.3 常用汇编伪指令常用汇编伪指令5.4 链接器命令文件的编写与使用链接器命令文件的编写与使用5.5 汇编语言程序编写方法汇编语言程序编写方法5.6 TMS320C54x C语言编程语言编程5.7 用用C语言和汇编语言混合编程语言和汇编语言混合编程5.1 软件开发过程及开发工具软件开发过程及开发工具1 1建立源程序建立源程序: :用用C C语言或汇编语言写源程序。语言或汇编语言写源程序。2 2用用C C编编译译器器(CompilerCompiler)将将
2、C C语语言言程程序序编编译译为为汇汇编编语语言程序。言程序。3 3用用汇汇编编器器(AssemblerAssembler)将将汇汇编编语语言言程程序序汇汇编编成成机机器语言的目标程序。器语言的目标程序。4 4用用连连接接器器(LinkerLinker)将将目目标标文文件件连连接接在在一一起起,产产生生可执行模块。可执行模块。5 5用用调调试试工工具具对对程程序序进进行行反反复复运运行行、测测试试和和修修改改,以以达到要求。达到要求。6 6用十六进制转换公用程序(用十六进制转换公用程序(Hex Conversion Hex Conversion UtilityUtility)将可执行目标程序转
3、换成可烧写到将可执行目标程序转换成可烧写到EPROMEPROM的文件格式。的文件格式。 返回首页图5-1 TMS320C54x DSP软件开发流程归档器将汇编宏文归档器将汇编宏文件收入汇编宏库件收入汇编宏库归档器将目标文件归档器将目标文件收入目标文件库收入目标文件库C编译器将编译器将C程序编译程序编译为汇编语言程序为汇编语言程序汇编汇编器将汇编语言程器将汇编语言程序汇编为序汇编为COFF格式格式目标程序目标程序建库程序构建建库程序构建运行时支持库运行时支持库汇编语言转换汇编语言转换程序将代数形程序将代数形式程序转换成式程序转换成汇编语言程序汇编语言程序连接器将连接器将COFF目目标文件、目标文
4、件标文件、目标文件库、运行时支持库库、运行时支持库连接成可执行连接成可执行COFF文件文件HEX转换器将可执转换器将可执行行COFF文件转换文件转换成便于烧写成便于烧写EPROM的的HEX或或BIN格式文件格式文件EPROM烧写器将程烧写器将程序写入序写入EPROM,上,上电时自动导入电时自动导入C54X运行运行调试工具将调试工具将C可可执行执行COFF文件文件通过硬件仿真通过硬件仿真器下载到器下载到C54X中运行,或者中运行,或者下载到软件仿下载到软件仿真器中运行。真器中运行。绝对列表器将可执行绝对列表器将可执行COFF文件转换成列文件转换成列表文件,给出机器码、表文件,给出机器码、助记符、
5、绝对地址等助记符、绝对地址等信息。信息。交叉引用列表器列交叉引用列表器列出符号、符号的定出符号、符号的定义,以及引用情况,义,以及引用情况,供排错使用。供排错使用。表5-1 TMS320C54xV3.50版代码生成工具程序返回本节5.2 公共目标文件格式公共目标文件格式5.2.1 COFF文件的基本单元文件的基本单元段段5.2.2 汇编器对段的处理汇编器对段的处理5.2.3 链接器对段的处理链接器对段的处理5.2.4 重新定位重新定位5.2.5 程序装入程序装入5.2.6 COFF文件中的符号文件中的符号 返回首页5.2.1 COFF文件的基本单元文件的基本单元段段汇汇编编器器和和连连接接器器
6、建建立立的的目目标标文文件件称称为为公公共共目目标标格格式式文文件件,即即COFF(Common Object File Format)。COFF使使模模块块化化编编程程和和管管理理变变得得方方便便和和容容易易,因因为为用用汇汇编编语语言言编编写写程程序序时时,是是按按段段来来考考虑虑的的,所所以以不不同同模模块块中中的的相相同同的的段很容易汇编在一起。段很容易汇编在一起。段段(sections)是是COFF文文件件中中最最重重要要的的概概念念。一一个个段段就就是是最最终终在在存存储储器器映映象象中中占占据据连连续续空空间间的的一一个个数数据据或或代代码码块块。目目标标文文件件中中的的每每一一
7、个个段段都都是是相相互互独独立立的的。一一般般地地,COFF目目标标文文件件包包含含3个个缺缺省省的的段段:text段段、data段段、bss段段。图5-2 目标文件中的段与目标存储器的关系返回本节如图如图5-2所示为所示为目标文件中的段与目标系统中存储器的关系目标文件中的段与目标系统中存储器的关系。5.2.2 汇编器对段的处理汇编器对段的处理1未初始化段未初始化段未未初初始始化化段段主主要要用用来来在在存存储储器器中中保保留留空空间间,通通常常将将它它们们定定位位到到RAM中中。这这些些段段在在目目标标文文件件中中没没有有实实际际内内容容,只只是是保保留留空空间间而而已已。程程序序可可以以在
8、在运运行行时时利利用用这些空间建立和存储变量。这些空间建立和存储变量。段可以分为两大类:段可以分为两大类:已初始化段和未初始化已初始化段和未初始化段。段。未初始化段是通过使用未初始化段是通过使用.bss和和.usect汇编伪指令建汇编伪指令建立的,两条伪指令的句法分别为:立的,两条伪指令的句法分别为: .bss 符号,字数符号,字数 符号符号.usect “段名段名”,字数,字数.bssx,5xy . usect “myvar”,6y符号指向保留的存储单元的第一个字符号指向保留的存储单元的第一个字2已初始化段已初始化段已已初初始始化化段段包包含含可可执执行行代代码码或或已已初初始始化化数数据据
9、。这这些些段段的的内内 容容 存存 储储 在在 目目 标标 文文 件件 中中 , 加加 载载 程程 序序 时时 再再 放放 到到TMS320C54X存存储储器器中中。三三个个用用于于建建立立初初始始化化段段的的伪伪指令句法分别为:指令句法分别为: .text段起点段起点 .data段起点段起点 .sect“段名段名”,段起点,段起点汇汇编器在对程序进行汇编时,为程序中的每一个段安排了编器在对程序进行汇编时,为程序中的每一个段安排了一个段程序计数器一个段程序计数器SPC。如:。如:text段、段、data段、段、sect段、段、bss段、段、usect段分别有自己的段程序计数器。段分别有自己的段
10、程序计数器。段起点用来为段计数器段起点用来为段计数器定义一个起始值。如:定义一个起始值。如:.text 10;SPC=103命名段命名段命名段就是程序员自己定义的段,它与缺省的命名段就是程序员自己定义的段,它与缺省的.text、.data和和.bss段一样使用,但与缺省段分开汇编。段一样使用,但与缺省段分开汇编。 例如:重复使用例如:重复使用.text命令在目标文件中只建立一个命令在目标文件中只建立一个.text段,链接后这个段,链接后这个.text段作为一个单位分配到存储器中。段作为一个单位分配到存储器中。如果想将一部分程序放到与如果想将一部分程序放到与.text段不同的存储器中,可段不同的
11、存储器中,可以使用命名段,将命名段放到与以使用命名段,将命名段放到与.text段不同的存储器中。段不同的存储器中。使用命名段可以将已初始化数据放到与使用命名段可以将已初始化数据放到与.data段不同的段不同的存储器中,将未初始化的变量汇编到与存储器中,将未初始化的变量汇编到与bss段不同的段不同的存储器中。存储器中。产生命名段的伪指令为:产生命名段的伪指令为: 符号符号.usect“段名段名”,字数,字数 .sect “段名段名”,段起点,段起点4子段子段子子段段(Subsections)是是大大段段中中的的小小段段。链链接接器器可可以以像像处处理理段段一一样样处处理理子子段段。采采用用子子段
12、段可可以以使使存存储储器器图图更更加加紧紧密。子段的命名句法为:密。子段的命名句法为: 基段名:子段名基段名:子段名例:例:.sect “.text: _func” ;在;在text段内建立一个称之为段内建立一个称之为 ; _func的子段。的子段。子子段段也也有有两两种种,用用.sect命命令令建建立立的的是是已已初初始始化化段段,用用.usect命令建立的是未初始化段。命令建立的是未初始化段。5段程序计数器(段程序计数器(SPC)汇编器为每个段安排一个独立的程序计数器,即段程序汇编器为每个段安排一个独立的程序计数器,即段程序计数器(计数器(SPC)。)。SPC表示一个程序代码段或数据段内表
13、示一个程序代码段或数据段内的当前地址的当前地址。开始时,汇编器将每个开始时,汇编器将每个SPC置置0,当汇编器将程序代码,当汇编器将程序代码或数据加到一个段内时,相应的或数据加到一个段内时,相应的SPC增加。增加。如果汇编器再次遇到相同段名的段,继续汇编至相应的如果汇编器再次遇到相同段名的段,继续汇编至相应的段,且相应的段,且相应的SPC在先前的基础上继续增加。在先前的基础上继续增加。例例5-1 段命令应用举例:段命令应用举例:2 * * * * * * * * * * * * * * * * * * * * * * * * * * 3 * Assemble an initialized ta
14、ble into .data *4 * * * * * * * * * * * * * * * * * * * * * * * * * *5 0000 .data6 0000 0011 coeff .word 011h,022h,033h 0001 0022 0002 00337 * * * * * * * * * * * * * * * * * * * * * * * * * *8 * * Reserve space in .bss for a variable * *9 * * * * * * * * * * * * * * * * * * * * * * * * * * 10 0000
15、.bss buffer,1011 * * * * * * * * * * * * * * * * * * * * * * * * * *12 * * still in .data * *13 * * * * * * * * * * * * * * * * * * * * * * * * * *14 0003 0123 ptr .word 0123h行号段计数器机器码汇编指令15 * * * * * * * * * * * * * * * * * * * * * * * * * *16 * * Assemble code into the .text section * *17 * * * *
16、* * * * * * * * * * * * * * * * * * * * * *18 0000 .text19 0000 100f add: LD 0Fh,A20 0001 f010 aloop: SUB #1,A 0002 0001 21 0003 f842 BC aloop,AGEQ 0004 000122 * * * * * * * * * * * * * * * * * * * * * * * * * *23 * * Another initialized table into .data * *24 * * * * * * * * * * * * * * * * * * * *
17、 * * * * * *25 0004 .data26 0004 00aa ivals .word 0Aah,0BBh,0CCh 0005 00bb 0006 00cc27 * * * * * * * * * * * * * * * * * * * * * * * * * *28 * * Define another section for more variables * *29 * * * * * * * * * * * * * * * * * * * * * * * * * *30 0000 var2 .usect “newvars”,131 0001 inbuf .usect “new
18、vars”,732 * * * * * * * * * * * * * * * * * * * * * * * * * *33 * * Assemble more code into .text * *34 * * * * * * * * * * * * * * * * * * * * * * * * * *35 0005 .text36 0005 110a mpy: LD 0Ah,B37 0006 f166 mloop: MPY #0Ah,B 0007 000a38 0008 f868 BC mloop,BNOV39 0009 000639 * * * * * * * * * * * * *
19、 * * * * * * * * * * * * *40 * * Define a named section for int. vectors * *41 * * * * * * * * * * * * * * * * * * * * * * * * * *42 0000 .sect “vectors”43 0000 0011 .word 011h,033h44 0001 0033图5-3 例5-1产生的目标代码返回本节在此例中,一共建立了在此例中,一共建立了5 5个段:个段:.text .text 段内有段内有1010个字的程序个字的程序 代码。代码。.data .data 段内有段内有7
20、 7个字的数据。个字的数据。vectorsvectors是是一一个个用用.sect.sect建建立立的的自自定定义义段段,段段内内有有2 2个个字字的的已已初初始始化数据。化数据。. .bssbss 在存储器中为变量保在存储器中为变量保 留留1010个存储单元。个存储单元。newvars是一个用是一个用.usect命令命令 建立的自定义段,它建立的自定义段,它 在存储器中为变量保在存储器中为变量保 留留8个存储单元。个存储单元。5.2.3 链接器对段的处理链接器对段的处理链接器对段的处理有两个功能。链接器对段的处理有两个功能。首首先先,它它将将汇汇编编器器产产生生的的COFF目目标标文文件件(
21、.obj文文件件)中中的的各各种种段段作作为为输输入入段段,当当有有多多个个文文件件进进行行链链接接时时,它它将将输输入入段段组组合合起起来来,在在可可执执行行的的COFF输输出出模模块块中中建建立立各个输出段。各个输出段。其次,链接器为输出段选择存储器地址。其次,链接器为输出段选择存储器地址。链接器有两个命令完成上述功能链接器有两个命令完成上述功能,即:,即:MEMORY 命命令令定定义义目目标标系系统统的的存存储储器器配配置置图图,包包括括对对存存储储器器各各部部分分的的命命名名,以以及及规规定定它它们们的的起起始始地地址址和和长度。长度。SECTIONS命令命令告诉链接器如何将输入段组合
22、成输告诉链接器如何将输入段组合成输出段,以及在存储器何处存放输出段。子段可以用来更出段,以及在存储器何处存放输出段。子段可以用来更精确地编排段,可用链接器精确地编排段,可用链接器SECTIONS命令指定子段。命令指定子段。 图5-4 链接器默认的存储器分配返回本节5.2.4 重新定位重新定位1链接时链接时重新定位重新定位 汇汇编编器器将将每每个个段段的的起起始始地地址址处处理理为为0,而而所所有有需需要要重重新新定定位位的的符符号号(标标号号)在在段段内内都都是是相相对对于于0地地址址的的,但但在在存存储储器器中中不不可可能能所所有有的的段段都都从从0地地址址开开始始,所所以以需需要要通通过以
23、下方法将段重新定位:过以下方法将段重新定位:将各个段定位到存储器中,每个段都从合适的地址开始。将各个段定位到存储器中,每个段都从合适的地址开始。将符号值调整到相对于新的段地址的数值。将符号值调整到相对于新的段地址的数值。调整对重新定位后符号的引用。调整对重新定位后符号的引用。例例5-2 产生重定位入口的一段程序(列表文件)代码。产生重定位入口的一段程序(列表文件)代码。1 .ref X ;在别的文件中定义,在此引用;在别的文件中定义,在此引用2 .ref Z ; 在别的文件中定义,在此引用在别的文件中定义,在此引用3 0000 .text4 0000 F073 B Y ;生成一个重定位入口生成
24、一个重定位入口 0001 00065 0002 F073 B Z ; 生成一个重定位入口生成一个重定位入口 0003 0000!6 0004 F020 LD #X,A ;生成一个重定位入口生成一个重定位入口 0005 0000!7 0006 F7E0 Y: RESET! 未定义的外部引用未定义的外部引用 .text段重定位段重定位” .data段重定位段重定位+ .sect段重定位段重定位- .bss段和段和.usect段重定位段重定位假假设设链链接接时时X重重新新定定位位在在地地址址7100h,.text段段重重新新定定位位到到从从地地址址7200h开开始始,那那么么Y的的重重定定位位值值为
25、为7206h。链链接接器器利利用两个重定位入口,对目标文件中的两次引用进行修正:用两个重定位入口,对目标文件中的两次引用进行修正: f073 B Y 变成变成 f073 0006 7206 f020 LD #X,A 变成变成 f020 0000! 7100在在COFF目目标标文文件件中中有有一一张张重重定定位位入入口口表表。链链接接器器对对符符号号重重定定位位时时,利利用用这这些些入入口口修修正正对对符符号号的的引引用用。链链接接器器在在处处理理完完之之后后就就将将重重定定位位入入口口消消去去,以以防防止止在在重重新新链链接接或或加加载时再次重新定位。载时再次重新定位。2运行时重新定位运行时重
26、新定位将将代代码码装装入入存存储储器器的的一一个个地地方方,而而运运行行在在另另一一个个地地方方。利利用用SECTIONS命命令令选选项项让让链链接接器器定定位位两两次次。一一些些关关键键的的执执行行代代码码必必须须装装入入在在系系统统的的ROM中中,但但希希望望在在较较快快的的RAM中运行。中运行。链链接接器器提提供供了了一一个个简简单单的的处处理理该该问问题题的的方方法法。利利用用SECTIONS命命令令选选项项让让链链接接器器定定位位两两次次。第第一一次次使使用用装装入关键字设置装入地址,再用运行关键字设置运行地址。入关键字设置装入地址,再用运行关键字设置运行地址。返回本节5.2.5 程
27、序装入程序装入为了运行程序,要将可执行程序装入目标存储器。方法:为了运行程序,要将可执行程序装入目标存储器。方法:(1)硬硬件件仿仿真真器器和和CCS集集成成开开发发环环境境,具具有有内内部部的的装装入入器,调用装入器的器,调用装入器的LOAD命令即可装入可执行程序。命令即可装入可执行程序。(2)将将代代码码固固化化在在片片外外存存储储器器中中,采采用用Hex转转换换工工具具(Hex conversion utility),例例如如Hex500将将可可执执行行的的COFF目目标标模模块块(.out文文件件)转转换换成成几几种种其其他他目目标标格格式式文文件件,然然后后将将转转换换后后的的文文件
28、件用用编编程程器器将将代代码码写写入入EPROM/Flash。 返回本节5.2.6 COFF文件中的符号文件中的符号COFF文文件件中中有有一一个个符符号号表表,用用于于存存储储程程序序中中的的符符号号信信息息。链链接接器器对对符符号号重重定定位位时时使使用用该该表表,调调试试工工具具也也使使用该表来提供符号调试用该表来提供符号调试。外外部部符符号号指指在在一一个个模模块块中中定定义义,在在另另一一个个模模块块中中使使用用的的符符号号。可可使使用用.def、.ref或或.global汇汇编编伪伪指指令令将将符符号号定定义义为为外外部部符符号号。.def在在当当前前模模块块中中定定义义,可可以以
29、在在别别的的模模块块中中使使用用的的符符号号;.ref在在当当前前模模块块中中引引用用,但但在在别别的的模模块块中中定定义义的的符符号号;.global可可用用于于以以上上任任何何一一种情况。种情况。x: ADD #56h,A ;定义定义x B y ;引用引用y .def x ;x在此模块中定义,在此模块中定义, ;可被别的模块引用可被别的模块引用 .ref y ;y在这里引用,在这里引用, ;它在别的模块中定义它在别的模块中定义返回本节5.3 常用汇编伪指令常用汇编伪指令返回首页1段定义伪指令段定义伪指令为为便便于于链链接接器器将将程程序序、数数据据分分段段定定位位于于指指定定的的(物物理理
30、存存在在的的)存存储储器器空空间间,并并将将不不同同的的obj文文件件链链接接起起来来,设设计计中中常常将将程程序序、数数据据、变变量量分分段段定定义义。段段的的使使用用非非常常灵灵活,但常用以下约定:活,但常用以下约定:.text 此段存放程序代码。此段存放程序代码。.data 此段存放初始化了的数据。此段存放初始化了的数据。.bss 此段存入未初始化的变量。此段存入未初始化的变量。.sect 名名称称 定定义义一一个个有有名名称称段段,放放初初始始化化了了的的数数据或程序代码。据或程序代码。符符号号 .usect 名名称称,字字数数 定定义义一一个个有有名名称称段段,放放未初始化的数据。未
31、初始化的数据。2条件汇编伪指令条件汇编伪指令.if、.elseif、.else、.endif伪伪指指令令告告诉诉汇汇编编器器按按照照表表达达式的计算结果对代码块进行条件汇编。式的计算结果对代码块进行条件汇编。.if expression 标标志志条条件件块块的的开开始始,仅仅当当条条件件为为真真(expression的值非的值非0即为真)时汇编代码。即为真)时汇编代码。.elseif expression 标标 志志 若若 .if条条 件件 为为 假假 , 而而.elseif条件为真时要汇编代码块。条件为真时要汇编代码块。.else 标志若标志若.if条件为假时要汇编代码块。条件为假时要汇编代
32、码块。.endif 标志条件块的结束,并终止该条件代码块。标志条件块的结束,并终止该条件代码块。3引用其他文件和初始化常数伪指令引用其他文件和初始化常数伪指令.include 文文件件名名 将将指指定定文文件件复复制制到到当当前前位位置置,其其内容可以是程序、数据、符号定义等。内容可以是程序、数据、符号定义等。.copy 文件名文件名 与与.include类似。类似。.def 符符号号名名 在在当当前前文文件件中中定定义义一一个个符符号号,可可以以被被其其他文件使用。他文件使用。.ref 符符号号名名 在在其其他他文文件件中中定定义义,可可以以在在本本文文件件中中使使用的符号。用的符号。.gl
33、obal 符号名符号名 其作用相当于其作用相当于.def、.ref效果之和。效果之和。.mmregs 定定义义存存储储器器映映射射寄寄存存器器的的符符号号名名,这这样样就就可可以用以用AR0、PMST等助记符替换实际的存储器地址。等助记符替换实际的存储器地址。.float 数数1,数数2 指指定定的的各各浮浮点点数数连连续续放放置置到到存存储储器器中(从当前段指针开始)。中(从当前段指针开始)。.word 数数1,数数2 指指定定的的各各数数(十十六六进进制制)连连续续放放置置到存储器中。到存储器中。.space n 以位为单位,空出以位为单位,空出n位存储空间。位存储空间。.end 程序块结
34、束。程序块结束。.set定义符号常量,如:定义符号常量,如:K .set 2564宏定义和宏调用宏定义和宏调用TMS320C54x汇汇编编支支持持宏宏语语言言。如如果果程程序序中中需需要要多多次次执执行行某某段段程程序序,可可以以把把这这段段程程序序定定义义(宏宏定定义义)为为一一个个宏宏,然后在需要重复执行这段程序的地方调用这条宏。然后在需要重复执行这段程序的地方调用这条宏。宏定义如下:宏定义如下:Macname .macroparameter 1,parameter n .mexit .endm 例例5-4 宏定义、宏调用和宏展开的一个例子。宏定义、宏调用和宏展开的一个例子。1 *23 *
35、 add34 *5 * ADDRP=P1+P2+P3 ;说明宏功能说明宏功能67 add3 .macro p1,p2,p3,ADDRP ;定义宏定义宏89 LD p1,A ;将参数将参数1赋给赋给A10 ADD p2,A ;将参数将参数2与与A相加相加11 ADD p3,A ;将参数将参数3与与A相加相加12 STL A,ADDRP ;将结果将结果A的低字存参数的低字存参数413 .endm ;结束宏结束宏141516 .global abc,def,ghi,adr ;定义全局符号定义全局符号1718 000000 add3 abc,def,ghi,adr ;调用宏调用宏11 000000 1
36、000! LD abc,A ;宏展开宏展开1 000001 0000! ADD def,A 1 000002 0000! ADD ghi,A1 000003 8000! STL A,adr返回本节5.4 链接器命令文件的编写与使用链接器命令文件的编写与使用5.4.1 MEMORY伪指令及其使用伪指令及其使用5.4.2 SECTIONS伪指令及其使用伪指令及其使用 返回首页(1 1)将将有有多多个个选项的的命命令令,写写成成一一个个链接接器命令文件器命令文件. .cmdcmd。(2 2)进行存行存储器分配器分配(3 3)运运行行链接接器器命命令令文文件件. .cmdcmd,生生成成一一个个映象文
37、件映象文件.map.map和一个可和一个可执行的行的输出文件出文件.out.out 主主要要功功能能 (1 1)输输入入文文件件名名,就就是是要要链链接接的的目目标标文文件件和和文文档档库库文文件件,或或者者是是其其它它的的命命令令文文件件。如如果果要要调调用用另另一一个个命命令令文文件件作作为为输输入入文文件件,此此句句一一定定要要放放在在本本命命令令文文件件的的最最后后,因因为为链链接接器不能从新调用的命令文件返回。器不能从新调用的命令文件返回。(2 2)链链接接器器选选项项。这这些些选选项项既既可可以以用用在在链链接接器器命命令令行行,也可以编在命令文件中。也可以编在命令文件中。(3 3
38、)MEMORYMEMORY和和SECTIONSSECTIONS都是都是链接器命令接器命令。如果链接命令如果链接命令文件中没有文件中没有MEMORYMEMORY和和SECTIONSSECTIONS命令(默认情况),则链接命令(默认情况),则链接器就从地址器就从地址0080h0080h一个段接着一个段进行配置。一个段接着一个段进行配置。(4 4)注注释的内容的内容应当用当用/*/*和和* */ /符号括起来符号括起来。 例例5-5 链接器命令文件举例。链接器命令文件举例。a.obj b.obj /* 输入文件名输入文件名 */-o prog.out /* 选项选项 */-m prog.map /*
39、 选项选项 */MEMORY /* MEMORY 命令命令 */ PAGE0: ROM: origin=1000h, length=0100h PAGE1: RAM: origin=0100h, length=0100hSECTIONS /* SECTIONS 命令命令 */.text: ROM.data: ROM.bss: RAM返回本节5.4.1 MEMORY伪指令及其使用伪指令及其使用MEMORYMEMORY命命令令用用来来定定义义目目标标系系统统中中所所包包含含的的各各种种存存储器器的的存存储储器器配配置置图图,包包括括对对存存储储器器各各部部分分命命名名,以以及规定它们的起始地址和长
40、度。及规定它们的起始地址和长度。定义系统定义系统MEMEORYMEMEORY PAGE0: name1 PAGE0: name1 (attrattr): origin=constant, length=constant: origin=constant, length=constantPAGEnPAGEn: : namennamen (attrattr): origin=constant, length=constant: origin=constant, length=constant 对一个存储空间加以标记,每一个对一个存储空间加以标记,每一个PAGE代表一个完全独代表一个完全独立的地址空
41、间。页号立的地址空间。页号n最多可规定为最多可规定为255,取决于目标存储,取决于目标存储器的配置。器的配置。通常通常PAGE 0定为程序存储器,定为程序存储器,PAGE 1定为数定为数据存储器。据存储器。如果没有规定如果没有规定PAGE,则链接器将目标存储器,则链接器将目标存储器配置在配置在PAGE 0。存储区间的名字可以包含存储区间的名字可以包含8个字符,个字符,AZ、az、$、.、_均可。名字并没有特殊的含义,用来标记存储器的均可。名字并没有特殊的含义,用来标记存储器的区间而已;名字都是内部记号,不需要保留在输出文区间而已;名字都是内部记号,不需要保留在输出文件或者符号表中。不同件或者符
42、号表中。不同PAGE上的存储器区间可以取相上的存储器区间可以取相同的名字,但在同一同的名字,但在同一PAGE内的名字不能相同,且不许内的名字不能相同,且不许重叠配置。重叠配置。R R 规定可以对存储器执行读操作。规定可以对存储器执行读操作。W W 规定可以对存储器执行写操作。规定可以对存储器执行写操作。X X 规定存储器可以装入可执行的程序代码。规定存储器可以装入可执行的程序代码。I I 规定可以对存储器进行初始化。规定可以对存储器进行初始化。以上属性可以在将输出段定位到存储器时加以限制。以上属性可以在将输出段定位到存储器时加以限制。如如果果一一项项属属性性都都没没有有选选,就就可可以以将将输
43、输出出段段不不受受限限制制地地定定位位到到任任何何一一个个存存储储器器位位置置。任任何何一一个个没没有有规规定定属属性性的的存存储储器器都默认有全部都默认有全部4 4项属性。项属性。规定一个存储区的起始地址。键入规定一个存储区的起始地址。键入origin、org或或o都可以。都可以。这个值是一个这个值是一个16位二进制常数,可以用十进制数、八进制位二进制常数,可以用十进制数、八进制数或十六进制数表示数或十六进制数表示规定一个存储区的长度,键入规定一个存储区的长度,键入length、len或或l都可以。都可以。 返回本节fill:任选项,指定存储区的填充指,为没有定位输出段的:任选项,指定存储区
44、的填充指,为没有定位输出段的存储器空单元填充一个数,键入存储器空单元填充一个数,键入fill或或f均可。这是均可。这是2个字节个字节的整型常数,可以是十进制数、八进制数或十六进制数表的整型常数,可以是十进制数、八进制数或十六进制数表示。如示。如fill=0FFFFh。5.4.2 SECTIONS伪指令及其使用伪指令及其使用SECTIONS伪指令功能如下:伪指令功能如下: 说明如何将输入段组合成输出段。说明如何将输入段组合成输出段。在可执行程序中定义输出段。在可执行程序中定义输出段。指定输出段在存储器中存放的位置。指定输出段在存储器中存放的位置。允许对输出段重新命名。允许对输出段重新命名。SEC
45、TIONS伪指令的一般语法为:伪指令的一般语法为: SECTIONS name:property,property,property . name:property,property,property . name:property,property,property . 例例5-6 SECTIONSSECTIONS命令的使用方法。命令的使用方法。file1.obj file2.obj /* Input files */file1.obj file2.obj /* Input files */-o -o prog.outprog.out /* Options /* Options * */ /
46、SECTIONS .text: load=ROM, run=800h .const: load=ROM .bss: load=RAM .vectors: load=FF80h t1.obj(.intvec1) t2.obj(.intvec2) .data: align=16 图5-5 例5-6中段的定位返回本节5.5 汇编语言程序编写方法汇编语言程序编写方法5.5.1 汇编语言源程序格式汇编语言源程序格式5.5.2 汇编语言中的常数和字符串汇编语言中的常数和字符串5.5.3 汇编源程序中的符号汇编源程序中的符号5.5.4 汇编源程序中的表达式汇编源程序中的表达式 返回首页5.5.1 汇编语言源
47、程序格式汇编语言源程序格式助助记记符符指指令令一一般般包包含含4个个部部分分,其其一一般般组组成成形形式式为:为:标号标号: 助记符助记符 操作数操作数 ;注释;注释1标号区标号区所所有有汇汇编编指指令令和和大大多多数数汇汇编编伪伪指指令令前前面面都都可可以以带带有有标标号号,标标号号可可以以长长达达32个个字字符符,由由AZ、az、09、_、和和$符符号号组组成成,且且第第一一个个字字符符不不能能是数字,区分大小写。是数字,区分大小写。 2助记符区助记符区助记符区不能从第一列开始,否则被认为是标号。助记符区不能从第一列开始,否则被认为是标号。3操作数区操作数区操操作作数数区区是是一一个个操操
48、作作数数列列表表,可可以以是是常常数数、符符号号或或常常数数与符号构成的表达式。操作数间需用与符号构成的表达式。操作数间需用“,”号隔开。号隔开。4注释区注释区注注释释区区可可以以从从任任何何一一列列开开始始,可可以以包包含含ASCII字字符符和和空空格。格。 返回本节5.5.2 汇编语言中的常数和字符串汇编语言中的常数和字符串表5-3 COFF常数与字符串返回本节5.5.3 汇编源程序中的符号汇编源程序中的符号1标号:与程序中的位置有关的符号地址。标号:与程序中的位置有关的符号地址。2局部标号:特殊的标号,其使用范围和影响是临时的。局部标号:特殊的标号,其使用范围和影响是临时的。3符号常数:
49、用一个有意义的符号名代表一个常数。符号常数:用一个有意义的符号名代表一个常数。4先先定定义义的的符符号号常常数数:汇汇编编器器预预先先定定义义的的符符号号。$,AR0-AR7。5替替代代符符号号:用用.asg将将一一个个字字符符串串赋赋给给替替代代符符号号,当当汇汇编器遇到替代符号时,就用它的字符串值替代它。编器遇到替代符号时,就用它的字符串值替代它。Label1:LD ADDRA,A SUB ADDRB,A BC $1,ALT LD ADDRB,A B $2$1: LD ADDRA,A$2: ADD ADDRC,A .newblock BC $1,ALT STL A,ADDRC$1: NOP
50、局部标号局部标号$代表段程序计数器的当前值代表段程序计数器的当前值K.set1024maxbuf.set2*Kvalue .set 0delta .set 1.asg“*+”,INC.asg“*-”,DEC.asg“10,20,30,40”,coefficients.byte coefficients符号常数符号常数替代符号替代符号返回本节5.5.4 汇编源程序中的表达式汇编源程序中的表达式表表达达式式可可以以是是常常数数、符符号号或或由由算算术术运运算算符符结结合合的的 常常 数数 和和 符符 号号 。 表表 达达 式式 值值 的的 有有 效效 范范 围围 为为 -3276832767。1运
51、算符(运算符(表表5-4 所示)所示)2合格的表达式合格的表达式(表表5-5所示所示 )表5-4 可以用在表达式中的运算符表5-5 带有绝对符号、可重定位符号的表达式.datalabel1 .word 0,1,2label2 .word 3X.set50goodsym1.set100h+X;goodsym2.set$;goodsym3.setlabel1;goodsym4.setlabel2-label1;因为因为X的值在引用之前已定义,的值在引用之前已定义,合格表达式合格表达式对前面定义的所有局部标号的所对前面定义的所有局部标号的所有引用,包括当前的有引用,包括当前的SPC( $ )都是合格
52、的都是合格的两个局部标号不是绝对符号,但两个局部标号不是绝对符号,但相同的段内,它们的差是绝对的相同的段内,它们的差是绝对的.globalextern_1;在外部模块定义;在外部模块定义intern_1:.word ”D;在当前模块定义,可重定位;在当前模块定义,可重定位LAB1:.set2;LAB1=2,绝对符号,绝对符号intern_2:.word AB;在当前模块定义,可重定位;在当前模块定义,可重定位LD#LAB1+(4+3)*7),A;2+(4+3)*7)=51-ALD#LAB1+4+(3*7),A;2+4+(3*7)=27-ALDextern_1-10,B; 合法合法LD10-ex
53、tern_1,B;非法,不能将可重定位符号变负;非法,不能将可重定位符号变负LD-(intern_1),B ;非法,不能将可重定位符号变负;非法,不能将可重定位符号变负LDextern_1/10,B ;非法,不能将可重定位符号进行乘除;非法,不能将可重定位符号进行乘除LDintern_1+extern_1,B;非法;非法LDintern_1-intern_2+extern_1,B; 合法合法LDintern_1+intern_2+extern_1,B;非法,;非法,intern_1+intern_2不不 是绝对值是绝对值LDintern_1+extern_1-intern_2,B ;非法,汇编
54、器先计算;非法,汇编器先计算 intern_1+extern_1返回本节5.6 TMS320C54x C语言编程5.6.1 存储器模式5.6.2 寄存器规则5.6.3 函数调用规则5.6.4 中断处理5.6.5 表达式分析 返回首页5.6.1 存储器模式1段C54x将存储器处理为程序存储器和数据存储器两个线性块。程序存储器包含可执行代码;数据存储器主要包含外部变量、静态变量和系统堆栈。编译器的任务是产生可重定位的代码,允许链接器将代码和数据定位进合适的存储空间。C编译器对C语言编译后除了生成3个基本段,即.text、.data、.bss外,还生成.cinit、.const、.stack、.sy
55、smem段。2C/C+系统堆栈.stack不同于DSP汇编指令定义的堆栈。DSP汇编程序中要将堆栈指针SP指向一块RAM,用于保存中断、调用时的返回地址,存放PUSH指令的压栈内容。.stack定义的系统堆栈实现的功能是保护函数的返回地址,分配局部变量,在调用函数时用于传递参数,保护临时结果。.stack定义的段大小(堆栈大小)可用链接器选项-stack size设定,链接器还产生一个全局符号_ _STACK_SIZE,并赋给它等于堆栈长度的值,以字为单位,缺省值为1K。3存储器分配(1)运行时间支持函数。 rts.lib(2)动态存储器分配。 malloc calloc(3)静态和全局变量的
56、存储器分配。(4)位域/结构的对准。 返回本节5.6.2 寄存器规则寄存器规则明确了编译器如何使用寄存器以及在函数调用过程中如何保护寄存器。(1)辅助寄存器 AR1,AR6,AR7;AR0,AR2,AR3,AR4,AR5(2)堆栈指针SP (3)ARP (4)在默认情况下,编译器总是假定ST1中的OVM在硬件复位时被清0。若在汇编代码中对OVM置位为1,返回到C环境时必须复位。(5)寄存器变量 返回本节5.6.3 函数调用规则(1)局部帧的产生 (2)参数传递 (3)函数的返回 返回本节5.6.4 中断处理(1)中断的使能和屏蔽必须由程序员自己来设置。 (2)中断程序没有参数传递,即使说明,也
57、会被忽略(3)中断处理程序不能被正常的C程序调用。(4)为了使中断程序与中断一致,在相应的中断矢量中必须放置一条转移指令,可以用.sect汇编伪指令建立一个简单的跳转指令表来完成此项功能。(5)在汇编语言中,注意在符号名前面加上一个下划线,例如c_int00记为_ c_int00。(6)中断程序使用的所有寄存器,包括状态寄存器和程序中调用函数使用的寄存器都必须予以保护。(7)TMS320C54x C编译器将C语言进行了扩展,中断可以利用interrupt关键字由C/C+函数直接处理。返回本节5.6.5 表达式分析当C程序中需要计算整型表达式时,必须注意以下几点:(1)算术上溢和下溢。 (2)整
58、除和取模。 (3)C代码对16位乘法结果高16位的访问。 返回本节5.7 用C语言和汇编语言混合编程5.7.1 独立的C模块和汇编模块接口5.7.2 从C程序中访问汇编程序变量5.7.3 在C程序中直接嵌入汇编语句 返回首页5.7.1 独立的C模块和汇编模块接口在编写独立的汇编程序时,必须注意以下几点:(1)不论是用C语言编写的函数还是用汇编语言编写的函数,都必须遵循寄存器使用规则。(2)必须保护函数要用到的几个特定寄存器。 (3)中断程序必须保护所有用到的寄存器。(4)从汇编程序调用C函数时,第一个参数(最左边)必须放入累加器A中,剩下的参数按自右向左的顺序压入堆栈。(5)调用C函数时,注意
59、C函数只保护了几个特定的寄存器,而其他是可以自由使用的。(6)长整型和浮点数在存储器中存放的顺序是低位字在高地址,高位字在低地址。(7)如果函数有返回值,返回值存放在累加器A中。 (8)汇编语言模块不能改变由C模块产生的.cinit段,如果改变其内容将会引起不可预测的后果。(9)编译器在所有标识符(函数名、变量名等)前加下划线“_”。 (10)任何在汇编程序中定义的对象或函数,如果需要在C程序中访问或调用,则必须用汇编指令.global定义。 (11)编辑模式CPL指示采用何种指针寻址,如果CPL=1,则采用堆栈指针SP寻址;如果CPL=0,则选择页指针DP进行寻址。 返回本节5.7.2 从C
60、程序中访问汇编程序变量从C程序中访问在汇编程序中定义的变量或常数,可以分为以下3种情况:(1)访问在.bss块中定义的变量 (2)对于访问不在.bss块中定义的变量 (3)对于在汇编程序中用.set和.global伪指令定义的全局常数,也可以使用特殊的操作从C程序中访问它们。 返回本节5.7.3 在C程序中直接嵌入汇编语句在C程序中嵌入汇编语句是一种直接的C模块和汇编模块接口方法。采用这种方法一方面可以在C程序中实现用C语言难以实现的一些硬件控制功能。另一方面,也可以用这种方法在C程序中的关键部分用汇编语句代替C语句以优化程序。采用这种方法的一个缺点是它比较容易破坏C环境,因为C编译器在编译嵌入了汇编语句的C程序时并不检查或分析所嵌入的汇编语句。返回本节1汇编器和链接器的作用是什么?2汇编程序中伪指令有什么作用?其中段定义伪指令有哪些?初始化段和未初始化段有何区别?3链接命令文件有什么作用?如何使用MEMORY命令和SECTIONS命令?链接命令文件内容和汇编程序中段定义伪指令有联系吗?4C语言程序设计时,C编译器会产生哪些段?