




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4章 TMS320C54x的软件开发与设计4.1 TMS320C54x软件开发过程 4.2 汇编语言程序的编辑、汇编和链接过程 4.3 COFF的一般概念 编辑ppt4.1 TMS320C54x软件开发过程 C54x的应用软件开发主要完成以下工作:(1) 选择编程语言编写源程序 C54x提供2种编程语言,即汇编语言和C/C+语言。 对于完成一般功能的代码,这两种语言都可使用,但对于一些运算量很大的关键代码,最好采用汇编语言来完成,以提高程序的运算效率。(2) 选择开发工具和环境 C54x提供了两种开发环境。即非集成开发环境和集成开发环境CCS。 编辑pptTMS320的开发工具是一个软件包,
2、其中包括:C优化编译器汇编器连接器归档器交叉引用列表器十六进制转换公用程序编辑pptC优化编译器(C Compile) TI 为其TMS320系列 DSP提供了一系列的 C 编译器。将标准 C 源文件编译成为相应片种的汇编语言源代码文件。完全符合ANSI C标准带有一个完整的运行支持库使用多种先进技术来优化 C 源代码,以产生高效汇编代码。编辑ppt汇编器(Assembler) 将汇编语言的源程序文件汇编成为机器语言的目标程序文件,其格式为COFF(公用目标文件格式)。汇编语言源程序可以包括汇编语言指令(instruction)、汇编伪指令(assembler directives)和宏指令(
3、macro directives)编辑ppt连接器(Linker) 连接器的基本任务是将目标文件连接在一起,产生可执行模块。连接器可以接受的输入文件包括汇编器产生的COFF目标文件、命令文件、库文件、以及已部分连接好了的文件。它所产生的可执行COFF目标模块可以装入各种开发工具,或由TMS320器件来执行编辑ppt归档器(Archiver) 归档器允许用户将一组文件归入一个档案文件(库)。例如,将若干个宏归入一个宏库,汇编器将搜索这个库,并调用源文件中使用的宏。也可以用归档器将一组目标文件收入一个目标文件库,连接器将连接库内的成员,并解决外部引用编辑ppt交叉引用列表器(Cross-Refer
4、ence Lister) 交叉引用列表器是一个查错的工具。它接受已经连接好的目标文件作为输入,产生一个交叉引用列表作为输出。它列出符号、符号的定义、以及它们在已经连接的源文件中的引用编辑ppt十六进制转换公用程序(Hex Conversion Utility)将COFF目标文件转换成为若干种标准的文件格式:ASCII-十六进制Extended TektronixIntel MCS-86Motorola Exorciser编辑ppt编辑ppt全汇编编程:代码效率高,可直接对硬件设置;代码量较大,可读性差。全C编程:提高软件开发速度和可读性,方便软件移植;代码效率较低,硬件控制不方便。混合编程 混
5、合编程几种方法:(1)独立编写C/C+程序和汇编程序,分开编译或汇编形成各自的目标模块,再用链接器将C/C+模块和汇编模块链接起来。(2)在C/C+程序中直接内嵌汇编语句。(3)将C程序编译生成相应的汇编程序,手工修改和优化C编译器生成的汇编代码。编辑ppt混合编程说明: 变量和函数命名规则 无论是变量还是函数,在C语言和汇编中均需要说明为全局的。在C语言中需要有准确的函数原型说明。 在C语言中保持“自然”的命名,而在汇编语言中该名字需加一个下划线作为前缀。 例:C语言部分:extern int product(int *x, int *y);extern int i;汇编部分:.global
6、 _i.global _product编辑ppt混合编程说明: 变量访问规则 C程序访问由.bss定义的汇编变量: (1)汇编程序中,该变量名前要加下划线“_”;(2)汇编程序中,用.global命令将其定义为全局变量;(3)在C程序中,将变量说明为外部变量C语言部分:extern int var;var=1;汇编部分:.bss _var, 1.global _var编辑ppt混合编程说明: 变量访问规则 C程序访问不在.bss中定义的汇编常量表: (1)汇编程序中,在该常量表前加一标号(标号前要加“_”);(2)汇编程序中,将该标号定义为全局标号;(3)在C程序中,以extern的形式对该标
7、号声明,并利用指针访 问该常量表。C语言部分:extern int var;int *p=var;f=p1汇编部分:.global _var_var: .word 10 .word 20编辑ppt混合编程说明: 变量访问规则 C程序访问用.set定义的汇编时间常数: (1)汇编程序中,在该常数名前 “_”;(2)汇编程序中,将该常数名定义为全局符号;(3)在C程序中,以extern的形式对该符号声明,并用取地址运 算符“&”取该常量参与运算C语言部分:extern int shift;#define ad (int)(&shift);x=ad;汇编部分:_shift .set 3.global
8、 _shift编辑ppt混合编程说明: 变量访问规则 汇编程序访问用C程序中的变量或数组: (1)在汇编程序和C程序中,都将该变量或数组定义成外部属性。(2)在汇编中定义该变量或数组时需在前加“_”;C语言部分:int speech_in160, speech_out160;main()汇编部分:.global _speech_in.global _speech_outld #_speech_in, b stlm b, ar2ld #_speech_out, astlm a, ar3ld #159, astlm a, brcnopnoprptb nextmvdd *ar2+, *ar3+nex
9、t: 编辑ppt混合编程说明: 程序调用规则 寄存器使用说明: (1)辅助寄存器AR1、AR6、AR7由被调用函数保护,即可以在函数执行过程中修改,但在函数返回时必须恢复。AR0、AR2、AR3、AR4、AR5可以自由使用,即在函数执行过程中可以修改,而且不必恢复。(2)堆栈指针SP在函数调用时必须予以保护,但其是自动保护的,即在返回时,压入椎栈的内容都将被全部弹出。(3)ARP在函数进入和返回时,必须为0,即当前辅助寄存器为AR0。函数执行时可以是其它值。(4)在缺省的情况下,编译器总是认为OVM为0。因此,若在汇编程序中将OVM置为1,则在返回C环境时,必须将其恢复为0。(5)其它状态位和
10、寄存器在子程序中可以任意使用,不必恢复。编辑ppt混合编程说明: 程序调用规则 参数传递说明: (1)函数调用前,将参数以逆序压入运行堆栈,即最右边的参数最先入栈,然后自右向左将参数依次入栈,最后是返回地址入栈。第一个参数(最左边)放入累加器A中进行传递。(2)函数调用结束后,将返回值置于累加器A中。编程实例以32位乘法运算为例。虽然用C/C+语言表达乘法运算较为方便和明了,但由于C/C+语言无法很好利用DSP汇编语言为实现各种乘法运算而提供的指令,使得C/C+程序效率低下。所以这里用汇编语言完成乘法运算,再用C/C+程序调用它。编辑ppt编程实例(续)C语言主程序#include #incl
11、ude int main() extern int *MPY32 (long X, long Y); /定义函数原型,返回指针值 int W4; /定义存放相乘结果的数组 int *P; int i; P=MPY32(0 x11112222, 0 x33334444); /函数调用/该指针指向数据存储器中,存放相乘结果单元的首地址for(i=0; i16,低16位相乘的进位MACSU *AR2-, *AR3+,A /A+=y1*x0MACSU *AR3-, *AR2, A /A+=x1*y0w0w1w2w3y0y1x0 x1AR2AR3AR4编辑ppt编程实例(续)汇编程序STL A, *AR
12、4- /w1=ALD A, -16,A /A=A16MAC *AR2, *AR3,A /A+=x1*y1STL A, *AR4- /w2赋值STH A, *AR4 /w3赋值LD #w3,A /w3单元地址作为返回值,传递到ARET编辑ppt混合编程说明: 汇编语句嵌入规则 在C程序中直接内嵌汇编语句。此种方法可以在C程序中实现C语言无法实现的一些硬件控制功能, 如修改寄存器值,或在编译结果中添加注释等。嵌入汇编语句的方法比较简单,只需在汇编语句的两边加上括号和双引号,并且在括号前加上asm标识符即可,即asm(“ 汇编语句”)。但需注意以下几点:(1)括号中的汇编语句必须以标号、空格、tab
13、 、分号开头,这和通常的汇编编程的语法一样。(2)不要在嵌入的汇编语句中使用修饰性汇编代码.text、.data等。(3)插入跳转语句和标号会产生不可预测的结果。(4)汇编语句不要改变C程序中变量的值。asm(“ssbx xf”)asm(“*this is an assembly language comment”)练习:用C实现循环延时,用嵌入式汇编语句对XF引脚置高低电平,实现方波发生器。编辑ppt4.2 汇编语言程序的编辑、汇编和链接过程 示意图汇编器调试程序链接器文本编辑器.asm源文件.obj目标文件.out输出文件. cmd链接命令文件. lst列表文件. map存储器映像文件十六
14、进制转换程序HEX500- o- m- l编辑ppt4.2 汇编语言程序的编辑、汇编和链接过程 1. 编辑 利用各种文本编辑器,如笔记本、WORD、EDIT和TC等,可编写汇编语言源程序。 2. 汇编 当汇编语言源程序编写好以后,可利用C54x的汇编器ASM500,对一个或多个源程序分别进行汇编,并生成列表文件(.lst)和目标文件(.obj)。 编辑ppt4.2 汇编语言程序的编辑、汇编和链接过程 2. 汇编 常用的汇编命令: asm500 %1 s l x 调用汇编器命令 源文件名 将程序所有定义的符号放在目标文件的符号表中 生成一个列表文件.lst 生成一个交叉汇编表 编辑ppt4.2
15、汇编语言程序的编辑、汇编和链接过程 3. 链接 所谓链接,就是利用C54x的链接器LNK500,根据链接器命令文件(.cmd)对已汇编过的一个或多个目标文件(.obj)进行链接,生成输出文件(.out)和存储器映像文件(.map) 。 常用的汇编器命令: lnk500 %1.cmd lnk500: 调用链接器命令 %1.cmd: 链接命令文件名,该文件须指明目标文件、输入文件、输出文件、链接选项和存储器配置要求等。 编辑ppt4.3 COFF的一般概念 汇编器和链接器生成的目标文件,是一个可以由C54x器件执行的文件。这些目标文件的格式称之为公共目标文件格式(COFF)。 在编写汇编语言程序时
16、,COFF采用代码段和数据段的形式,以便于模块化的编程,使编程和管理变得更加方便。 这些代码段和数据段简称为段。汇编器和链接器提供一些伪指令来建立和管理各种各样的段。 编辑ppt4.3.1 COFF文件的基本单元 1. 段(sections) 是COFF文件中最重要的概念。每个目标文件都分成若干段。 段是存储器中占据相邻空间的代码或数据块。一个目标文件中的每个段都是分开的和各不相同的。 COFF目标文件都包含以下3种形式的段: .text 段(文本段),通常包含可执行代码; .data 段(数据段),通常包含初始化数据; .bss 段(保留空间段),通常为未初始化变量保留存储空间。编辑ppt4
17、.3.1 COFF文件的基本单元 2. 段的基本类型 COFF目标文件中的段有两种基本类型。 初始化段 未初始化段(1) 初始化段 初始化段中包含有数据或程序代码。主要有: .text段已初始化段; .data段已初始化段; .sect段已初始化段,由汇编器伪指令建立 的自定义段。 编辑ppt2. 段的基本类型 COFF目标文件中的段有两种基本类型。(2) 未初始化段 在存储空间中,为未初始化数据保留存储空间。它包括: .bss段未初始化段; .usect段未初始化段,由汇编命令建立的命 名段(自定义段)。编辑ppt4.3.1 COFF文件的基本单元 3. 段与目标存储器的对应关系 汇编器的任
18、务:在汇编过程中,根据汇编命令用适当的段将各部分程序代码和数据连在一起,构成目标文件。 链接器的任务:就是分配存储单元,将目标文件中的段重新定位到目标系统的存储器中,这一过程称为定位或分配。 编辑ppt3. 段与目标存储器的对应关系目标文件中的段与目标存储器之间的关系 目标文件目标存储器.bss.data.textRAME2PROMROM编辑ppt4.3.2 汇编器对段的处理 汇编器对段的处理是通过段伪指令来区别各个段的,并将段名相同的语句汇编在一起。 汇编器有5条伪指令可识别汇编语言程序的各个部分: .bss .usect .text .data .sect定义未初始化段定义未初始化段定义已
19、初始化段定义已初始化段定义已初始化段编辑ppt4.3.2 汇编器对段的处理 未初始化段就是在C54x存储器中保留空间,通常它们被定位在RAM区。在目标文件中,这些段中没有确切的内容。 由这些段定义的空间仅作为临时存储空间,在程序运行时,可以利用这些存储空间存放变量。 未初始化段分为默认的和命名的两种,分别由汇编器伪指令.bss和.usect产生。 1. 未初始化段 编辑ppt(1) .bss伪指令1. 未初始化段 用于在bss段中保留若干个空间。 格式: .bss 符号, 字数符号对应于保留的存储空间第一个字的变量名称。 可以让其他段引用,也可以用.global命令定义为全 局符号。 字数表示
20、在bss段或标有名字的段中保留若干个存储单元。 每调用一次.bss伪指令,汇编器在相应的段保留更多的空间。 编辑ppt1. 未初始化段 (2) .usect伪指令 用于为指定的命名段保留若干个空间。 格式: 符号 .usect “段名”, 字数段名程序员为未初始化的命名段定义的名字。 每调用一次.usect伪指令,汇编器在指定的命名段保留更多的空间。 编辑ppt4.3.2 汇编器对段的处理 已初始化段中包含有可执行代码或初始化数据。 这些段中的内容都在目标文件中,当加载程序时再放到C54x的存储器中。每个已初始化段都是可以重新定位的,并且可以引用其他段中所定义的符号。链接器在链接时会自动地处理
21、段间的相互引用。 已初始化段由.text、.data和.sect三个伪指令建立。2. 已初始化段 编辑ppt 已初始化命令的句法: 2. 已初始化段 .text 段起点 .data 段起点 .sect “段名”,段起点段起点是任选项。 若选用,它为段程序计数器SPC定义一个起始值。 若默认,则SPC从0开始。 编辑ppt4.3.2 汇编器对段的处理 当汇编器遇到.text或.data或.sect命令时,将停止对当前段的汇编(相当于一条结束当前段汇编的命令),然后将紧接着的程序代码或数据汇编到指定的段中,直到再遇到另一条.text、.data或.sect命令为止。 当汇编器遇到.bss或.use
22、ct命令时,并不结束当前段的汇编,只是暂时从当前段脱离出来,并开始对新的段进行汇编。 .bss和.usect命令可以出现在一个已初始化段的任何位置,而不会对它的内容发生影响。 编辑ppt4.3.2 汇编器对段的处理 命名段由用户指定,与默认的.text,.data和.bss段的使用相同,但它们被分开汇编。 假如一部分可执行代码(例如初始化程序)不希望和.text段分配在一起,可将它们汇编进一个命名段,这样就可定位在与.text不同的地方。也可将初始化的数据汇编到与.data段不同的地方,或者将未初始化的变量保留在与.bss段不同的位置。 可用.usect和.sect两个伪指令产生命名段。3.
23、命名段(自定义段) 编辑ppt .usect伪指令产生类似.bss的段,为变量在RAM中保留存储空间。 .sect伪指令产生类似.text和.data的段,可以包含代码或数据。3. 命名段 产生命名段伪指令格式: 符号 .usect “段名”,字数 .sect “段名” 可以产生多达32767个不同的命名段。段名可长达200个字符。 编辑ppt 每次用一个新名字调用这些伪指令时,就产生一个新的命名段。 若用已有的段名调用这些伪指令,则汇编器就将代码或数据(或保留空间)汇编进相应名称的段中。 不同的伪指令不能使用相同的段名。即不能用.usect创建了命名段,然后又用.sect创建一个相同名字的段
24、。 3. 命名段 编辑ppt4.3.2 汇编器对段的处理 子段是较大段中的小段。对于子段,汇编器可以单独为其分配存储单元,或者在相同的基段名下与其他段组合在一起。 子段结构可用来对存储器空间进行更紧凑的控制,可以使存储器空间分配更加紧密。 4. 子段 子段命名格式: 基段名: 子段名 子段名前为基段名,随后为冒号,最后为子段名。 编辑ppt4.3.2 汇编器对段的处理 汇编器为每个段都安排了一个单独的程序计数器称之为段程序计数器SPC。 SPC表示在程序段或数据段内当前的地址。开始时汇编器将每个SPC置0。当汇编器将程序代码或数据加到段内时,增加相应的SPC值。若再继续对某个段汇编,则相应的S
25、PC就在先前的数值上继续增加。 5. 段程序计数器SPC 编辑ppt【例4.3.1】段命令应用举例。 汇编语言源程序: .datacoeff .word 044h,055h,066h .bss buffer,8 prt .word 0456h .textadd: LD 0Dh,A aloop:SUB #1,A BC aloop,AGEQ .dataivals .word 0CCh,0DDh,0EEh ;初始化数据段 ;3组数据放入.data段 ;在.bss段保留8个单元 ;0456h放入.data段 ;初始化文本段 共计5个字 ;初始化数据段 ;3组数据放入.data段编辑ppt汇编语言源程序
26、:var2 .usect “newvars”,2 inbuf .usect “newvars”,8 .text mpy: LD 0Ah,B mloop: MPY #0Ah,B BC mloop,BNOV .sect “vectors” .word 044h,088h ;建立newvars命名段,保留2个单元 ;在newvars段保留8个单元 ;初始化文本段 共计5个字 ;建立vectors命名段 ;2组数据放入vectors命名段编辑ppt经汇编后,得列表文件(部分): 2 *3 * 汇编一个初始化表到.data段 *4 *5 0000 .data6 0000 0044 coeff .word
27、 044h,055h,066h 0001 0055 0002 00667 *8 * 在.bss段中为变量保留空间 *9 *10 0000 .bss buffer,811 *12 * 仍然在.data 段中 *13 *14 0003 0456 prt .word 0456h源程序的行号 段程序计数器目标代码汇编语言源程序编辑ppt源程序的行号 段程序计数器目标代码汇编语言源程序15 *16 * 汇编代码到.text段 *17 *18 0000 .text19 0000 100d add: LD 0Dh,A20 0001 f010 aloop: SUB #1, A 0002 0001 21 000
28、3 f842 BC aloop,AGEQ 0004 0001 22 *23 * 汇编另一个初始化表到.data 段 * 24 *25 0004 .data 26 0004 00cc ivals .word 0CCh,0DDh,0EEh 0005 00dd 0006 00ee27 *28 * 为更多的变量定义另一个段 *29 *30 0000 var2 .usect “newvars”,2 31 0001 inbuf .usect “newvars”,8 编辑ppt32 *33 * 汇编更多代码到.text段 *34 *35 0005 .text 36 0005 110a mpy: LD 0Ah
29、,B 37 0006 f166 mloop MPY #0Ah,B 0007 000a 38 0008 f868 BC mloop,BNOV 0009 0006 39 *40 * 为中断向量.vectors定义一个自定义段 * 41 *42 0000 .sect “vectors” 43 0000 0044 .word 044h,088h 0001 0088 源程序的行号 段程序计数器目标代码汇编语言源程序编辑ppt 汇编语言源程序经过汇编后,共建立了5个段: .text段文本段,段内有6条共10个字可执 行的程序代码。 .data段已初始化的数据段,段内有7 个字的数据。 vectors段用.
30、sect命令生成的命名段, 段内有2个字的初始化数据。 .bss段未初始化的数据段,在存储器中 为变量保留8个存储单元。 newvars段用.usect命令建立的命名段, 为变量保留10个存储单元。 编辑ppt【例】比较.byte,.int,.long,.word和.string伪指令。 源程序: .byte 0AAh,0BBh .word 0CCCh .long 0EEEEFFFFh .int 0DDDDh .string “help” .byte:将一个或多个8位值放入当前段的连续字中。 15 0 15 00,1 0 0 A A 0 0 B B .word:将一个或多个16位值放入当前段的
31、连续字中。2 0 C C C .long:将32位值放入当前段的2个连续的字中,先存最高有效位。3,4 E E E E F F F F .int:将一个或多个16位值放入当前段的连续的字中。5 D D D D .string:将一个或多个字符串中的8位字符放入当前段中。he6,7 0 0 6 8 0 0 6 5lp8,9 0 0 6 C 0 0 7 01初始化常数的伪指令4.3.3 汇编器常用伪指令 编辑ppt列表文件:1 000000 00aa .byte 0AAh,0BBh 000001 00bb2 000002 0ccc .word 0CCCh3 000003 eeee .long 0E
32、EEEFFFFh 000004 ffff4 000005 dddd .int 0DDDDh5 000006 0068 .string “help” 000007 0065 000008 006c 000009 00704.3.3 汇编器常用伪指令 编辑ppt1初始化常数的伪指令.field伪指令: 功能:将单个数值放进当前字的指定位域中。 采用.field伪指令,可以将多个字段或域打包成单个字,直到字被填满为止,汇编器不增加SPC。 指令格式: . field value ,size in bits 单个数值当前字的指定位域4.3.3 汇编器常用伪指令 编辑ppt1初始化常数的伪指令 .fie
33、ld伪指令的使用。 源程序: .field 5,3 .field 9,6 .field 16,5 .field 01234h,20 .field 01234h,32 .field 5,3 .field 9,6 .field 16,5 .field 01234h,20 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 01 0 11 0 10 0 1 0 0 10 0 1 0 0 11 0 0 0 01 0 0 0 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 00 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0 1
34、5 14 13 12 11 10 9 8 7 6 5 4 3 2 1 00123h0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 10 0 0 0 0 0 0 1 0 0 1 0 0 0 1 14h0 1 0 00 1 0 0 .field 01234h,320 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 00 0 0 1 0 0 1 0 0 0 1 1 0 1 0 00 0 0 1 0 0 1 0 0
35、0 1 1 0 1 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0A000hA480hA4C0h0123h4000h0000h1234h4.3.3 汇编器常用伪指令 编辑ppt【例】 .field伪指令的使用。 汇编后的列表文件: 4 000000 A000 .field 5,3 5 000000 A480 .field 9,6 6 000000 A4C0 .field 16,5 7 000001 0123 .field 01234h,20 000002 4000 8 000003 0000 .field 01
36、234h,32 000004 1234组成一个字,不改变SPC。占用两个字, SPC+2。占用两个字, SPC+2。编辑ppt COFF文件中有一个符号表,主要用来存储程序中有关符号的信息。链接器在执行程序定位时,要使用符号表提供的信息,而调试工具也要使用该表来提供符号调试。 外部符号:是指在一个模块中定义、而在另一个模块中引用的符号。它可以用伪指令.def、.ref或.global来定义。 .def在当前模块中定义,并可在别的模块中使用的符号; .ref 在当前模块中使用,但在别的模块中定义的符号; .global可以是上面的任何一种情况。 2定义和引用外部符号的伪指令4.3.3 汇编器常用
37、伪指令 编辑ppt【例】说明代码段中外部符号的定义。 .def x .ref y x: ADD #56h,A B y ;定义x ;引用y 4.3.3 汇编器常用伪指令 编辑ppt4.3.4 链接器对段的处理 链接器是开发C54x器件必不可少的开发工具之一,它对段处理时有2个主要任务: 将一个或多个COFF目标文件中的各种段作为链接器的输入,经链接后在一个执行的COFF输出模块中建立各个输出段; 在程序装入时对其重新定位,为各个输出段选定存储器地址。 编辑ppt 链接器由链接命令文件提供的链接信息。 在链接命令文件中,可使用MEMORY和SECTIONS伪指令,为实际应用指定存储器结构和地址的映
38、射。 MEMORY用来指定目标存储器结构。 SECTIONS用来控制段的构成与地址分配。 4.3.4 链接器对段的处理 编辑ppt4.3.5 MEMORY指令 MEMORY指令用来规定目标存储器的结构。 在实际的应用中,目标系统所配置的存储器是各不相同的,通过MEMORY指令,可以进行各种各样的存储器配置。 MEMORY指令的句法: MEMORY PAGE0:name 1(attr):origin=constant, length=constant; PAGEn:name n(attr):origin=constant, length=constant; 指令字存储区间说明语句书写方式: 用大
39、写MEMORY指令字开始; 由大括号括起来的存储器区间说明。存储区间:存储页面区间名称区间属性起始地址区间长度编辑ppt4.3.5 MEMORY指令 存储区间说明语句: PAGE: 指定存储器空间页面,最多为255页, 取决于目标存储器的配置。 每一个PAGE代表一个完全独立的地址空间。 通常,PAGE 0用于程序存储器; PAGE 1用于数据存储器。 若没有规定PAGE,则链接器默认为PAGE 0。 编辑ppt4.3.5 MEMORY指令 存储区间说明语句: name: 存储器区间名称。可由用字母、$、.、_ 等组成。 存储器区间为内部记号,因此不需要保留在输出文件或者符号表中。 不同PAG
40、E上的存储器区间可以取相同的名字,但在同一PAGE内的名字不能相同,且不许重叠配置。 编辑ppt4.3.5 MEMORY指令 存储区间说明语句: attr: 为任选项,用来为命名的存储器区间规 定14个属性。 当对输出段定位时,可利用属性限制输出段分配到一定的存储区间。 属性选项共有4项: R 规定可以对存储器执行读操作。 W 规定可以对存储器执行写操作。 X 规定存储器可以装入可执行的程序代码。 I 规定可以对存储器进行初始化。 任何一个没有规定属性的存储器(包括所有默认方式的存储器)都有全部4项属性。 编辑ppt4.3.5 MEMORY指令 存储区间说明语句: origin: 用来指定存储
41、区间的起始地址,可简 写为org或o。其值以字为单位,可以 用十进制、八进制或十六进制数表示。 Length: 用来指定存储器空间的长度,可简写 为len或l,其值以字为单位,可以用 十进制、八进制或十六进制数表示。 编辑ppt【例】用MEMORY伪指令编写连接命令文件。要求: 程序存储器:4K字ROM,起始地址为C00h,取名为ROM。 数据存储器:32字RAM,起始地址为60h,取名为SCR。 512字RAM,起始地址为80h,取名为CHIP。 file1.obj fiel2.obj -o Prog.out MEMORY PAGE 0: ROM: origin=C00h, length=1
42、000h PAGE 1: SCR: origin=60h, length=20h CHIP: origin=80h, length=200h 两个输入文件一个输出文件 Prog.out指令字页面名称区间名称起始地址区间长度编辑ppt【例4.5.2】用MEMORY伪指令编写连接命令文件。file1.obj fiel2.obj -o Prog.out MEMORYPAGE 0: ROM: org=C00h, len=1000hPAGE 1: SCR: org=60h, len=20h CHIP:org=80h, len=200h PAGE 0: ROM: org=C00h, len=1000h程序
43、存储器00000h0FFFFh00C00h1000h01C00hROMPAGE 1: SCR: org=60h, len=20h数据存储器00000h0FFFFh00060h0007Fh20hSCR CHIP:org=80h, len=200h00080h200h0027FhCHIP编辑ppt4.3.6 SECTIONS指令 用来控制段的构成与地址分配。指令功能: 说明如何将输入段组合成输出段; 在可执行程序中定义输出段; 规定输出段在存储器中的存放位置; 允许重新命名输出段。1. SECTIONS指令语法 编辑pptSECTIONS指令的句法: SECTIONS name:property,
44、 property, property, name:property, property, property, name:property, property, property, 指令字输出段说明语句 段名:定义输出段的名称。 属性:定义该段的内容和存储器的分配。段名1. SECTIONS指令语法属性属性属性编辑ppt1. SECTIONS指令语法 段属性用来定义输出段的内容和存储地址的分配。包括的内容如下: 装入存储器分配 运行存储器分配 输入段 编辑ppt1. SECTIONS指令语法 装入存储器分配 用于定义段装入时的存储器地址。语法格式: load=allocation 或 allo
45、cation 或 allocation allocation: 关于段地址的说明,即给段分配存储 单元。 编辑ppt1. SECTIONS指令语法 装入存储器分配例如: .text: load=0 x1000 .text: loadROM .bss: load(RW) .text: PAGE 0 将.text段定位到一个特定的地址。 将.text段定位到命名为ROM的存储区。 将.bss段定位到属性为R、W的存储区。将.text段定位到PAGE 0。编辑ppt1. SECTIONS指令语法 装入存储器分配 若用到一个以上参数,可以将它们排成一行。 例如: .text: ROM (PAGE 0
46、) 。 编辑ppt1. SECTIONS指令语法 运行存储器分配 用于定义段运行时的存储器地址。语法格式: run=allocation 或 run allocation 编辑ppt1. SECTIONS指令语法 链接器为段在目标存储器中分配两个地址: 加载的地址由装入存储器分配完成 执行程序的地址由运行存储器分配完成 通常,这两个地址是相同的。 若要想把程序的加载和运行分开,先将程序加载到ROM,然后在RAM中运行,则用SECTIONS命令让链接器对这个段定位两次即可。 例如: .fir: load=ROM,run=RAM 编辑ppt1. SECTIONS指令语法 输入段 用于定义组成输出段
47、的输入段。语法格式:out_section:input_sections 在SECTIONS命令中如果不列出输入文件的输入段的段名,则默认把同名段链接成一个输出段。 例如: SECTIONS .text: .data: .bss 链接时:在输入文件中的所有.text段链接成.text输出段所有.data段链接成.data输出段所有.bss段链接成.bss输出段编辑ppt1. SECTIONS指令语法 用文件名和段名来规定输入段。 SECTIONS .text: /*创建 .text 输出段*/ f1.obj(.text) /*链接来自f1.obj文件中的.text 段*/ f2.obj(sec
48、1) /*链接来自f2.obj文件中的sec1 段*/ f3.obj /*链接来自f3.obj文件中的所有段*/ f4.obj(.text,sec2) /*链接f4.obj文件中的.text 段和sec2段*/ 编辑ppt4.3.6 SECTIONS指令 2. SECTIONS指令的使用 【例4.5.3】SECTIONS指令的使用。 file1.obj file2.obj -o Prog.out SECTIONS .text: load=ROM,run=800h .con: load=ROM .bss: load=RAM .vec: load=FF80h t1.obj(.int1) t2.ob
49、j(.int2) .data: load=700h 两个输入文件链接命令选项指令字输出段说明语句编辑ppt2. SECTIONS指令的使用 【例4.5.3】SECTIONS指令的使用。 file1.obj file2.obj -o Prog.out SECTIONS .text: load=ROM,run=800h .con: load=ROM .bss: load=RAM .vec: load=FF80h file1.obj(.int1) file2.obj(.int2) .data: load=700h 输出段加载地址运行地址.textROMRAM 800h.conROM.bssRAM.v
50、ecROM FF80.dataRAM 700h.vec段由输入文件中的.int1和.int2两个输入段构成编辑ppt2. SECTIONS指令的使用 【例4.5.3】SECTIONS指令的使用。 file1.obj file2.obj -o Prog.out SECTIONS .text: load=ROM,run=800h .con: load=ROM .bss: load=RAM .vec: load=FF80h t1.obj(.int1) t2.obj(.int2) .data: load=700h 输出段加载地址运行地址.textROMRAM 800h.conROM.bssRAM.ve
51、cROM FF80.dataRAM 700h ROM RAM00h.text.con.bss.vec.dataFF80h运行时800h.text.text.text700h编辑ppt4.3.7 MEMORY和SECTIONS命令的默认使用 如果没有利用MEMORY和SECTIONS命令,链接器就按默认算法来定位输出段。 将所有的.text输入段链接成一个.text输出段,并配置到PAGE 0上的存储器; 将所有的.data输入段组合成.data输出段,定位到PAGE 0上的存储器; 编辑ppt 所有的.bss输入段则组合成一个.bss输出段,并由链接器定位到配置为PAGE 1上的存储器。 如果
52、输入文件中包含有已初始化的命名段,则链接器将它们定位到程序存储器,紧随.data段之后。 如果输入文件中包括有未初始化的命名段,则链接器将它们定位到数据存储器,并紧随.bss段之后。 4.3.7 MEMORY和SECTIONS命令的默认使用 编辑ppt MEMORY PAGE 0:PROG: origin=0 x0080, length=0 xFF00 PAGE 1:DATA: origin=0 x0080, length=0 xFF80 SECTIONS .text: PAGE=0 .data: PAGE=0 .cinit: PAGE=0 .bss: PAGE=1 4.3.7 MEMORY和
53、SECTIONS命令的默认使用 编辑ppt4.3.8 多个文件的链接实例 下面以example.asm源程序为例,将复位向量列为一个单独的文件,对两个目标文件进行链接。(1) 编写复位向量文件 vectors.asm文件清单: .title vectors.asm .ref start .sect .vectors B start .end 编辑ppt(2) 编写源程序 文件清单: .title example.asm .mmregsSTACK .usect STACK,10h ;为堆栈指定空间 .bss a,4;为变量分配9个字的空间 .bss x,4 .bss y,1 .def start
54、 .datatable: .word 1,2,3,4;变量初始化 .word 8,6,4,2 .text编辑ppt(2) 编写源程序 start: STM #0,SWWSR ;插入0个等待状态 STM #STACK+10h,SP ;设置堆栈指针 STM #a,AR1 ;AR1指向a RPT #7 ;移动8个数据 MVPD table,*AR1+ ;从程序存储器到数据存储器 CALL SUM ;调用SUM子程序end: B endSUM: STM #a,AR3 ;子程序执行 STM #x,AR4 RPTZ A,# 3 MAC *AR3+,*AR4+,A STL A,y RET .end 编辑ppt(3) 对源文件汇编(4) 编写链接命令文件 编写的命令文件用来链接两个目标文件(输
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 证券质押典当业务合同书
- 工业厂房租赁安全合同范本
- 销售合同专业模板
- 机电安装工程合同标准格式
- 房地产开发合同纠纷案例分析
- 兼职临时工雇佣合同
- 农村合作社租赁合同纠纷解决策略
- 煤炭购销长期合同范本参考
- 年度合作协议范文:标识标牌制作合同
- 绿化养护合同模板
- 2025年湖南工业职业技术学院单招职业倾向性测试题库含答案
- 社会企业参与养老服务的模式与效果
- 2025年执业医师定期考核题库及参考答案
- 高一上学期统编版(2019)必修中外历史纲要上翻书大赛课件
- 2025年北京交通职业技术学院高职单招职业技能测试近5年常考版参考题库含答案解析
- 心理健康七个一主题活动方案
- 多元化票务系统设计-深度研究
- 绝缘垫技术规范说明
- 2024年菏泽职业学院高职单招语文历年参考题库含答案解析
- GB/T 22180-2024速冻裹衣鱼
- 《公路施工组织设计》课件
评论
0/150
提交评论