dsp第六章汇编程序_第1页
dsp第六章汇编程序_第2页
dsp第六章汇编程序_第3页
dsp第六章汇编程序_第4页
dsp第六章汇编程序_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第六章第六章 汇编语言程序设计汇编语言程序设计 汇编语言汇编语言DSPDSP的灵魂的灵魂 有一位长期从事单片机开发的工程师说:有一位长期从事单片机开发的工程师说: “每一条汇编指令都执行了一个硬件操作。每一条汇编指令都执行了一个硬件操作。” “单片机本质上是一条条汇编语言。把一条条单片机本质上是一条条汇编语言。把一条条汇编指令搞清楚了,也就把单片机彻底掌握汇编指令搞清楚了,也就把单片机彻底掌握了。了。”第六章第六章 汇编语言程序设计汇编语言程序设计 使用汇编语言编写程序的好处:使用汇编语言编写程序的好处: 汇编速度快、效率高、实时性好;汇编速度快、效率高、实时性好; 对汇编语言的理解和掌握能使

2、程序员写出更好对汇编语言的理解和掌握能使程序员写出更好的的C C语言代码;语言代码; 对汇编语言编程可精确控制对汇编语言编程可精确控制DSPDSP的时间特性;的时间特性; C C语言存在无法控制的盲区(寄存器)语言存在无法控制的盲区(寄存器)第六章第六章 汇编语言程序设计汇编语言程序设计汇编语言包括汇编指令、伪指令和宏指令。汇编语言包括汇编指令、伪指令和宏指令。 汇编指令汇编指令即为即为DSP指令系统,该类指令在汇编时将产生一一对应的指令系统,该类指令在汇编时将产生一一对应的目标代码目标代码; 伪指令伪指令仅在汇编和连接时提供控制信息和数据,并不产生目标代码仅在汇编和连接时提供控制信息和数据,

3、并不产生目标代码; 宏指令宏指令则是用户自己创建的则是用户自己创建的“指令指令”,在汇编时将其展开并汇编为,在汇编时将其展开并汇编为对应的目标代码对应的目标代码 汇编语言源程序经过汇编器汇编生成机器语言目标程序汇编语言源程序经过汇编器汇编生成机器语言目标程序;再由连接器将多个目标程序连接成一个单一的可执行程序再由连接器将多个目标程序连接成一个单一的可执行程序汇编语言程序的编辑、汇编、链接过程汇编语言程序的编辑、汇编、链接过程编辑Edit汇编dspa链接dsplnk仿真SimulatorEmulator.asm汇编源程序.obj目标文件.out输出文件.cmd连接命令文件.lst列表文件-l.m

4、ap内存映像文件-m6.1 汇编语言格式汇编语言格式 一、语言格式一、语言格式TMS320汇编语言源程序由源语句组成。汇编语言源程序由源语句组成。源语句包括汇编指令、伪指令、宏指令。源语句包括汇编指令、伪指令、宏指令。源语句的格式源语句的格式 标号: 助记符 操作数1,操作数2,;注释标号域 助记符域 操作数域 注释域 例: SYMl .set 2 ;符号SYM1等于2 BEGIN: LDP #SYMl ;将2装入DP .word 016h ;初始化一个字为16h标号域标号域标号域是任选域,若使用必须从源语句的标号域是任选域,若使用必须从源语句的第一列第一列开始书写。开始书写。标号包含标号包含

5、1-32个字母、数字、字符,可识别符号的大小写,且规定个字母、数字、字符,可识别符号的大小写,且规定第一个字符不能是数字;第一个字符不能是数字;标号后可加或不加冒号标号后可加或不加冒号(:) ;如果不使用标号,则第一个字必须是空格或分号或星号。如果不使用标号,则第一个字必须是空格或分号或星号。当选用标号时,其值为段程序计数器当选用标号时,其值为段程序计数器(SPC)的当前值,标号指向与的当前值,标号指向与它们相关联的语句。它们相关联的语句。 例:行号SPC 目标代码 源语句100040000A START: .word0Ah, 3, 700030007标号START的值为40h,它指向字0Ah

6、。2. 助记符域助记符域助记符是源语句中的关键部分,不能缺省,它表示本指令的助记符是源语句中的关键部分,不能缺省,它表示本指令的操作类型。操作类型。助记符不能从源语句的第一列开始,如果从第一列开始,将助记符不能从源语句的第一列开始,如果从第一列开始,将被解释为标号。被解释为标号。助记符包括下列操作码之一助记符包括下列操作码之一 汇编指令汇编指令 一般用大写一般用大写 (例如例如ABS,MPY SPH); 伪指令伪指令 用用“ . ”开始,且为小写开始,且为小写 (例如例如 .data, .list .set): 宏指令宏指令 同伪指令同伪指令 (例如例如 .macro .endm)。3. 操作

7、数域操作数域操作数域是跟在助记符域后面的操作数列表,可缺省。操作数域是跟在助记符域后面的操作数列表,可缺省。如果多于两个操作数,则用逗号隔开。如果多于两个操作数,则用逗号隔开。操作数可以是常数、符号和表达式。操作数可以是常数、符号和表达式。4. 注释域注释域注释域可以从源语句行的任一列开始并直至本行的末尾注释域可以从源语句行的任一列开始并直至本行的末尾;如果它从第一列开始则可以用分号如果它从第一列开始则可以用分号(;)或星号或星号(*)开始开始,在在行的其他地方开始的注释,必须以分号行的其他地方开始的注释,必须以分号(;)开始。开始。二、二、 常数、字符串和符号常数、字符串和符号1常数常数汇编

8、器支持汇编器支持6种类型的常数种类型的常数; 二进制整数二进制整数 八进制整数八进制整数 十进制整数十进制整数 十六进制整数十六进制整数 字符常数字符常数 汇编时间常数汇编时间常数以字母以字母B(或或b)结尾,结尾,由二进制数字由二进制数字(0,1)组成的数字串。组成的数字串。长度最大为长度最大为16位位例:例:00101000b10001111B二、二、 常数、字符串和符号常数、字符串和符号1常数常数汇编器支持汇编器支持6种类型的常数种类型的常数; 二进制整数二进制整数 八进制整数八进制整数 十进制整数十进制整数 十六进制整数十六进制整数 字符常数字符常数 汇编时间常数汇编时间常数以字母以字

9、母Q(或或q)结尾结尾 ;由八进制数宁由八进制数宁(0-7)组成的数字串。组成的数字串。长度最大为长度最大为6位位例:例:103010q300000Q二、二、 常数、字符串和符号常数、字符串和符号1常数常数汇编器支持汇编器支持6种类型的常数种类型的常数; 二进制整数二进制整数 八进制整数八进制整数 十进制整数十进制整数 十六进制整数十六进制整数 字符常数字符常数 汇编时间常数汇编时间常数以字母以字母H(或或h)结尾结尾;由十六进制数字。由十六进制数字。0-9和和A-F(或或a-f)组成的数字串。组成的数字串。长度最大为长度最大为4位位例:例:032Fh1A03H二、二、 常数、字符串和符号常数

10、、字符串和符号1常数常数汇编器支持汇编器支持6种类型的常数种类型的常数; 二进制整数二进制整数 八进制整数八进制整数 十进制整数十进制整数 十六进制整数十六进制整数 字符常数字符常数 汇编时间常数汇编时间常数包含在单引号中的一个或两个字包含在单引号中的一个或两个字 符的串。符的串。每个字符表示为每个字符表示为8位位ASCII码码例:例: a 定义字符定义字符 a其值为其值为61H二、二、 常数、字符串和符号常数、字符串和符号1常数常数汇编器支持汇编器支持6种类型的常数种类型的常数; 二进制整数二进制整数 八进制整数八进制整数 十进制整数十进制整数 十六进制整数十六进制整数 字符常数字符常数 汇

11、编时间常数汇编时间常数用用.set伪指令对符号进行赋值伪指令对符号进行赋值例:例:SHIFT .set 3即即 SHIFT = 32字符串字符串字符串是包含在双引号内的一串字符;字符串是包含在双引号内的一串字符;字符在内部被表示为字符在内部被表示为8位位ASCII码码字符中用于下列场合:字符中用于下列场合:.copy “filename ”中的文件名;中的文件名;.sect “section name”中的段名;中的段名;.byte “charstring ”中数据初始化伪指令中数据初始化伪指令.string 伪指令的操作数。伪指令的操作数。3符号符号符号被用做标号、常数及替代符号;符号被用做

12、标号、常数及替代符号;符号名最多可由符号名最多可由32个字母和数字混合组成;个字母和数字混合组成;符号的第一个字符不能是数字,符号内不能有空格符号的第一个字符不能是数字,符号内不能有空格;由户定义的符号分大小写由户定义的符号分大小写 例如汇编时例如汇编时ABc、Abc、 abc被识别为被识别为3个不同的符号。个不同的符号。 用汇编器选项用汇编器选项(-C)可消除对大小写的识别。可消除对大小写的识别。6.2 伪指令伪指令伪指令仅在汇编和连接时提供控制信息和数据,并不产生目标代码伪指令仅在汇编和连接时提供控制信息和数据,并不产生目标代码;TMS320C2000的汇编伪指令的功能:的汇编伪指令的功能

13、: 汇编代码和数据到指定的段;汇编代码和数据到指定的段; 为未定义的变量保存空间;为未定义的变量保存空间; 控制列表文件;控制列表文件; 分配存储器;分配存储器; 汇编条件块;汇编条件块; 定义全局变量;定义全局变量; 指定汇编器能得到的宏;指定汇编器能得到的宏; 检查符号调试信息。检查符号调试信息。 伪指令分为伪指令分为8类。类。1)段定义伪指令)段定义伪指令2)初始化常数伪指令)初始化常数伪指令 3)段程序计数器排列伪指令)段程序计数器排列伪指令4)输出列表格式伪指令)输出列表格式伪指令5)引用其他文件伪指令)引用其他文件伪指令6)条件汇编伪指令)条件汇编伪指令 7)汇编时的符号伪指令)汇

14、编时的符号伪指令8)其他伪指令)其他伪指令 共有五条伪指令共有五条伪指令 .bss data .text .sect usect 把汇编语句程序的各部分与适把汇编语句程序的各部分与适当的段联系起来当的段联系起来 伪指令分为伪指令分为8类。类。1)段定义伪指令)段定义伪指令2)初始化常数伪指令)初始化常数伪指令 3)段程序计数器排列伪指令)段程序计数器排列伪指令4)输出列表格式伪指令)输出列表格式伪指令5)引用其他文件伪指令)引用其他文件伪指令6)条件汇编伪指令)条件汇编伪指令 7)汇编时的符号伪指令)汇编时的符号伪指令8)其他伪指令)其他伪指令 这类伪指令为当前段汇编数值。这类伪指令为当前段汇

15、编数值。例例 .int.word.long.byte.string 伪指令分为伪指令分为8类。类。1)段定义伪指令)段定义伪指令2)初始化常数伪指令)初始化常数伪指令3)段程序计数器排列伪指令)段程序计数器排列伪指令4)输出列表格式伪指令)输出列表格式伪指令5)引用其他文件伪指令)引用其他文件伪指令6)条件汇编伪指令)条件汇编伪指令 7)汇编时的符号伪指令)汇编时的符号伪指令8)其他伪指令)其他伪指令 可使段程序计数器可使段程序计数器SPC指向预指向预定的位置定的位置共有两条伪指令共有两条伪指令 .align.even 伪指令分为伪指令分为8类。类。1)段定义伪指令)段定义伪指令2)初始化常数

16、伪指令)初始化常数伪指令 3)段程序计数器排列伪指令)段程序计数器排列伪指令4)输出列表格式伪指令)输出列表格式伪指令5)引用其他文件伪指令)引用其他文件伪指令6)条件汇编伪指令)条件汇编伪指令 7)汇编时的符号伪指令)汇编时的符号伪指令8)其他伪指令)其他伪指令 该类伪指令控制列表文件的格该类伪指令控制列表文件的格式。式。 伪指令分为伪指令分为8类。类。1)段定义伪指令)段定义伪指令2)初始化常数伪指令)初始化常数伪指令 3)段程序计数器排列伪指令)段程序计数器排列伪指令4)输出列表格式伪指令)输出列表格式伪指令5)引用其他文件伪指令)引用其他文件伪指令6)条件汇编伪指令)条件汇编伪指令 7

17、)汇编时的符号伪指令)汇编时的符号伪指令8)其他伪指令)其他伪指令 该类伪指令为文件提供信息或该类伪指令为文件提供信息或提供这些文件的信息。提供这些文件的信息。 伪指令分为伪指令分为8类。类。1)段定义伪指令)段定义伪指令2)初始化常数伪指令)初始化常数伪指令 3)段程序计数器排列伪指令)段程序计数器排列伪指令4)输出列表格式伪指令)输出列表格式伪指令5)引用其他文件伪指令)引用其他文件伪指令6)条件汇编伪指令)条件汇编伪指令 7)汇编时的符号伪指令)汇编时的符号伪指令8)其他伪指令)其他伪指令 这类伪指令使汇编器根据表这类伪指令使汇编器根据表达式求值结果的真或假来汇达式求值结果的真或假来汇编

18、代码的某些段。编代码的某些段。 伪指令分为伪指令分为8类。类。1)段定义伪指令)段定义伪指令2)初始化常数伪指令)初始化常数伪指令 3)段程序计数器排列伪指令)段程序计数器排列伪指令4)输出列表格式伪指令)输出列表格式伪指令5)引用其他文件伪指令)引用其他文件伪指令6)条件汇编伪指令)条件汇编伪指令 7)汇编时的符号伪指令)汇编时的符号伪指令8)其他伪指令)其他伪指令 该类伪指令使定义的符号名该类伪指令使定义的符号名等同于常数值或字符串等同于常数值或字符串 例例 .set.equ.struct.endstruct 常用的伪指令常用的伪指令 终止源程序汇编伪指令终止源程序汇编伪指令 .end 赋

19、值伪指令赋值伪指令 .set 和和 .equ 句法:句法: 符号符号 .set 数值数值 符号符号 .equ 数值数值 例:例: DAC0 .set 0001h ;DAC0 = 0001h 存储存储16位字伪指令位字伪指令 .int 和和 .word 句法;句法; .int 数值数值1,数值,数值n .word 数值数值1,数值,数值n 例:例: .word 11h,22h,33h 定义标题伪指令定义标题伪指令 .title 句法:句法: .title “字符串字符串” 例:例:.title “example 定义代码段伪指令定义代码段伪指令 .text 创建一个可执行的代码段。创建一个可执行

20、的代码段。 (即为汇编程序正文,通常称为(即为汇编程序正文,通常称为.text段)段) 定义数据段伪指令定义数据段伪指令 .data 创建一个已初始化数据段。(通常称为创建一个已初始化数据段。(通常称为.data段)段) 在存储器中为变量保留空间伪指令在存储器中为变量保留空间伪指令 .bss 创建一个未初始化数据段。创建一个未初始化数据段。(即保留一个数据空间,通常称(即保留一个数据空间,通常称.bss段)段) 定义初始化命名段伪指令定义初始化命名段伪指令 .sect 创建一个可定义段名的已初始化数据段。创建一个可定义段名的已初始化数据段。 句法:句法: .sect “段名段名” 为未命名段中

21、的变量保留空间伪指令为未命名段中的变量保留空间伪指令 .usect 创建一个可定义段名的未初始化数据段创建一个可定义段名的未初始化数据段 句法:句法: .usect “段名段名”, 长度长度* exmple.asm* .datacoeff.word011h, 022h, 033h.bssvar1, 1 ; reserve space.bssbuffer, 10 ; for two variablesptr.word1234h.textadd:LACC 0Fhaloop:SUB#1BCNDaloop,LEQSACLvar1, 0.dataivals.word0AAh, 0BBhvar2.usec

22、t“newvars”, 1inbuf.usect“newvars”, 7.textADD#0FFh6.3 宏指令宏指令为了简化汇编语言程序的书写,常把一些频繁出现的程序段定义为宏为了简化汇编语言程序的书写,常把一些频繁出现的程序段定义为宏指令指令当程序需要执行这一段程序段时只要一条宏调用语句当程序需要执行这一段程序段时只要一条宏调用语句 ,减少减少汇编语言汇编语言程序的重复书写程序的重复书写TMS320系列系列DSP汇编器支持宏指令汇编器支持宏指令(1)宏定义宏定义(2 2)宏调用)宏调用举例举例(1 1)宏定义)宏定义格式格式: :宏名宏名 .macro .macro 形式参数形式参数1,

23、1, 形式参数形式参数2, 2, 形式参数形式参数33 宏体宏体 .endm .endm 6.3 宏指令宏指令为了简化汇编语言程序的书写,常把一些频繁出现的程序段定义为宏为了简化汇编语言程序的书写,常把一些频繁出现的程序段定义为宏指令指令当程序需要执行这一段程序段时只要一条宏调用语句当程序需要执行这一段程序段时只要一条宏调用语句 ,减少减少汇编语言汇编语言程序的重复书写程序的重复书写TMS320系列系列DSP汇编器支持宏指令汇编器支持宏指令(1)宏定义宏定义(2 2)宏调用)宏调用举例举例(2 2)宏调用)宏调用格式格式: :宏名宏名 实参数实参数1, 1, 实参数实参数2, 2, 实参数实参

24、数33 6.3 宏指令宏指令为了简化汇编语言程序的书写,常把一些频繁出现的程序段定义为宏为了简化汇编语言程序的书写,常把一些频繁出现的程序段定义为宏指令指令当程序需要执行这一段程序段时只要一条宏调用语句当程序需要执行这一段程序段时只要一条宏调用语句 ,减少减少汇编语言汇编语言程序的重复书写程序的重复书写TMS320系列系列DSP汇编器支持宏指令汇编器支持宏指令(1)宏定义宏定义(2 2)宏调用)宏调用举例举例例例1 1宏定义:宏定义:parmsparms.macro.macrox, y, zx, y, zLACCLACCx xADD yADD yADDC zADDC z.endm.endm宏调

25、用宏调用: :parmsparms55,66,7755,66,77例例2: 宏定义:宏定义:KICK_DOG.macro;看门狗复位宏定义看门狗复位宏定义LDP#00E0h ;DP7000h707FhSPLK#055h, WDKEY;WDCNTR由下一步复位被使能由下一步复位被使能SPLK#0AAh, WDKEY ;WDCNTR 被复位被复位.endm宏调用宏调用: KICK_DOG例例3: 宏定义宏定义:DELAY_S .macrodelay_value;延时延时 = 0.05 s delay_valueRPT #delay_valueNOP .endm宏调用宏调用: DELAY_S 20

26、;延时延时 = 1 s6.3 宏指令宏调用与子程序的区别宏调用与子程序的区别: :1 1)宏调用与子程序都可以被多次调用,但在程序汇编)宏调用与子程序都可以被多次调用,但在程序汇编时,子程序只在一个地方形成目标代码,而宏调用时,子程序只在一个地方形成目标代码,而宏调用在每个调用的地方都形成相应的目标代码(即只省在每个调用的地方都形成相应的目标代码(即只省汇编指令,不省目标代码)汇编指令,不省目标代码)2 2)宏调用使用参数,而子程序不使用参数)宏调用使用参数,而子程序不使用参数 6.4 公共目标文件格式公共目标文件格式COFF TMS320系列系列DSP的目标文件格式为公共目标文件格式的目标文

27、件格式为公共目标文件格式(COFF: Common Object File Format)采用这种目标文件格式的优点:采用这种目标文件格式的优点:将指令和数据将指令和数据按照段的概念按照段的概念进行组织和存储;进行组织和存储;程序可读性大大增强程序可读性大大增强;编写程序更容易;编写程序更容易;便于程序的移植;便于程序的移植;有利于进行模块化的程序设计;有利于进行模块化的程序设计;为管理代码段及系统存储器提供了灵活的方法和手段。为管理代码段及系统存储器提供了灵活的方法和手段。 COFF鼓励用户在编写汇编语言程序时使用鼓励用户在编写汇编语言程序时使用代码块代码块和和数据块数据块,这些块被称为这些

28、块被称为段段一、段一、段段是目标文件中的最小单位。段是目标文件中的最小单位。 在存储器中占据在存储器中占据连续空间连续空间的一块代码的一块代码和数据。和数据。每个段都是相互独立分开的。每个段都是相互独立分开的。COFF目标文件包含三个默认的段:目标文件包含三个默认的段: 文本段:文本段:用用.text 伪指令来定义,该段通常包含可执行代码伪指令来定义,该段通常包含可执行代码 数据段:数据段:用用.data 伪指令来定义,该段通常包含巳初始化数据伪指令来定义,该段通常包含巳初始化数据预留段:预留段:用用.bss伪指令来定义,该段是为未初始化的数据保留空间伪指令来定义,该段是为未初始化的数据保留空

29、间 另外还有两个自定义段:另外还有两个自定义段:用用 .sect 伪指令来定义一个伪指令来定义一个自定义数据段自定义数据段 用用 .usect 伪指令来定义一个伪指令来定义一个自定义预留段自定义预留段 COFF目标文件的段分为两大类:目标文件的段分为两大类:已初始化段已初始化段 未初始化段。未初始化段。 有明确内容存储在目标文件中;有明确内容存储在目标文件中; 该段的值是不可修改的该段的值是不可修改的 是建立在是建立在程序存储器程序存储器中中 通常包含通常包含程序代码、常数表格和数据程序代码、常数表格和数据已初始化段包括:已初始化段包括:.text段(文本段)段(文本段).data段(数据段)

30、段(数据段)用用.sect创建的自定义段创建的自定义段 COFF目标文件的段分为两大类:目标文件的段分为两大类:已初始化段已初始化段 未初始化段。未初始化段。 在在存储器中保留空间存储器中保留空间; 在目标文件中没有实际内容;在目标文件中没有实际内容; 运行程序时用于运行程序时用于存储变量存储变量 建立在片内或片外建立在片内或片外RAM中中 未初始化段包括:未初始化段包括:.bss段段用用.usect创建的自定义段创建的自定义段各段在存储器中的定位各段在存储器中的定位.text.data.bss.sect自定义段.usect自定义段ROMRAM二、汇编器对段的处理二、汇编器对段的处理 汇编器根

31、据定义段的伪指令来识别汇编程序中的各个部分:汇编器根据定义段的伪指令来识别汇编程序中的各个部分:未初始化段:未初始化段:.bss.usect已初始化段:已初始化段:.text.data.sect格式:格式: .bss 符号,字数符号,字数符号符号保留存储器空间第一个字的变保留存储器空间第一个字的变量名;量名;字数字数保留存储器空间的字长保留存储器空间的字长例:例:.bssvar1, 5 在存储器中保留在存储器中保留5个字的空间,第一个个字的空间,第一个字的变量名为字的变量名为var1二、汇编器对段的处理二、汇编器对段的处理 汇编器根据定义段的伪指令来识别汇编程序中的各个部分:汇编器根据定义段的

32、伪指令来识别汇编程序中的各个部分:未初始化段:未初始化段:.bss.usect已初始化段:已初始化段:.text.data.sect格式:格式: 符号符号 .usect “段名段名”,字数,字数符号符号保留存储器空间第一个字的变保留存储器空间第一个字的变量名;量名;字数字数保留存储器空间的字长保留存储器空间的字长段名段名用户为自定义段起的名字用户为自定义段起的名字例:例:var2 .usect “newvars”, 7 在存储器中保留在存储器中保留7个字的空间,段名为个字的空间,段名为newvars,第一个字的变量名为,第一个字的变量名为var2二、汇编器对段的处理二、汇编器对段的处理 汇编器

33、根据定义段的伪指令来识别汇编程序中的各个部分:汇编器根据定义段的伪指令来识别汇编程序中的各个部分:未初始化段:未初始化段:.bss.usect已初始化段:已初始化段:.text.data.sect .text 段包含可执行代码段包含可执行代码 .data 和和.sect(自定义段)包含已初(自定义段)包含已初始化数据始化数据 已初始化段的内容在目标程序中,并定已初始化段的内容在目标程序中,并定位到位到ROM中中 每个初始化段可重新定位每个初始化段可重新定位(实际地址不实际地址不确定)确定) 每个初始化段的编写可以是不连续的,每个初始化段的编写可以是不连续的,通过汇编器可以把相同的段汇编在一起。

34、通过汇编器可以把相同的段汇编在一起。二、汇编器对段的处理二、汇编器对段的处理 汇编器根据定义段的伪指令来识别汇编程序中的各个部分:汇编器根据定义段的伪指令来识别汇编程序中的各个部分:未初始化段:未初始化段:.bss.usect已初始化段:已初始化段:.text.data.sect段程序计数器(段程序计数器(SPC):): 汇编器为每个段设立独立的程序计数器,即段程序计数器汇编器为每个段设立独立的程序计数器,即段程序计数器 SPC即为文本段或数据段的当前地址。起始值为即为文本段或数据段的当前地址。起始值为0* exmple.asm* .datacoeff.word011h, 022h, 033h

35、;创建;创建.data 段段.bssvar1, 1 ;在;在.bss段中为两个段中为两个.bssbuffer, 10;变量保留空间;变量保留空间ptr.word1234h;继续建;继续建.data 段段.text;创建;创建.text 段段add:LACC 0Fhaloop:SUB#1BCNDaloop,LEQSACLvar1, 0.data;继续创建;继续创建.data 段段ivals.word0AAh, 0BBhvar2.usect“newvars”, 1 ;创建自定义段;创建自定义段newvarsinbuf.usect“newvars”, 7 ;为两个变量保留空间;为两个变量保留空间.t

36、ext;继续创建;继续创建.text 段段ADD#0FFh* exmple.asm* SPC代码代码0000.data00000011coeff.word011h, 022h, 033h;创建;创建.data 段段0001 0022000200330000.bssvar1, 1 ;在;在.bss段中为两个段中为两个0001.bssbuffer, 10 ;变量保留空间;变量保留空间00030123ptr.word0123h ;继续建;继续建.data 段段0000.text ;创建;创建.text 段段0000100fadd:LACC 0Fh0001bfa0aloop:SUB#1h0002000

37、10003e3ccBCNDaloop,LEQ0004000100059000SACLvar1, 0004.data;继续创建;继续创建.data 段段000400aaivals.word0AAh, 0BBh000500bb0000var2.usect“newvars”, 1 ;创建自定义段;创建自定义段newvars0001inbuf.usect“newvars”, 7 ;为两个变量保留空间;为两个变量保留空间0006.text ;继续创建;继续创建.text 段段0006b8ffADD#0FFh例中:创建了四个段例中:创建了四个段1) .text段段7个字的目标代码个字的目标代码2) .da

38、ta段段 6个字的数据个字的数据3) .bss 段段 在存储器中保留在存储器中保留11个字个字4) newvars段段自定义段,在存储器中保留自定义段,在存储器中保留8个字个字100fbfa00001e3cc00019000b8ff.text001100220033123400AA00BB.data保留11个字.bss保留8个字newvars三、链接器对段的处理三、链接器对段的处理 链接器对段的处理要完成两个功能:链接器对段的处理要完成两个功能:把一个或多个目标文件把一个或多个目标文件(文件名文件名.obj)的各个段作为链接的输入段,的各个段作为链接的输入段,经连接产生可执行的经连接产生可执行

39、的COFF输出文件输出文件(文件名文件名.out),在其中建立各,在其中建立各个输出段。个输出段。为输出文件的各个输出段确定存储器地址为输出文件的各个输出段确定存储器地址链接器使用两个命令来支持上述任务:链接器使用两个命令来支持上述任务:MEMORY 来定义目标系统的存储器配置来定义目标系统的存储器配置 SECTIONS 告诉连接器怎样组合输入段以及输出段放在存储器告诉连接器怎样组合输入段以及输出段放在存储器的位置的位置.text.data.bsstable_1初始化段u_vars未初始化段file1.objtable_1初始化段.text.data.bsstable_1初始化段u_vars未

40、初始化段file2.objtable_1初始化段FFT初始化段file1 .textfile2 .textfile1 .datafile2 .datafile1 table_1file2 table_1file2 FFTunusedfile1 .bssfile2 .bssfile1 u_varsfile2 u_varsunusedRAMROM 文件的链接 重定位重定位连接器在处理每一个段时,原来的段地址都是从地址连接器在处理每一个段时,原来的段地址都是从地址0000开始,所有开始,所有可重定位符号(标号)均相对于它们的段内地址。可重定位符号(标号)均相对于它们的段内地址。连接器通过下列措施来重

41、定位段连接器通过下列措施来重定位段1)把各段定位到存储器内,从适当的地址开始;)把各段定位到存储器内,从适当的地址开始;2)调整符号(标号)值对应于新的段地址;)调整符号(标号)值对应于新的段地址;3)调整对已重定位符号的引用,以便反映调整后的符号值)调整对已重定位符号的引用,以便反映调整后的符号值汇编器在需要引用重新定位的符号处留了重定位的入口;汇编器在需要引用重新定位的符号处留了重定位的入口;连接器在符号重定位时,利用这些入口修正对符号的引用;连接器在符号重定位时,利用这些入口修正对符号的引用;例:重定位前 重定位后SPC代码 PC代码.refX0000.text00007980BY020

42、0798000010004020102040002bf80LACCX0202bf800003 0000! 020300100004be22Y:IDLE0204be22说明:说明:1)X,Y都是需重定位的,都是需重定位的, Y在本模块定义,在本模块定义,X在另一个模块定义;在另一个模块定义;2)程序进行汇编时,)程序进行汇编时, X值为值为0(外部引用),(外部引用),Y值为值为0004(段内地址)(段内地址)3)形成两个重定位入口:)形成两个重定位入口:X, Y.text段对段对X的引用是外部引用(列表文件中用的引用是外部引用(列表文件中用“ !”表示)表示) 对对Y的引用是内部引用(列表文件

43、中用的引用是内部引用(列表文件中用“ ”表示)表示) 4)假设:)假设:X被重定位到地址被重定位到地址 10h .text段被重定位后从地址段被重定位后从地址 0200h开始开始四、外部符号的定义与引用四、外部符号的定义与引用所谓外部符号是在一个模块定义,在另一个模块引用的符号所谓外部符号是在一个模块定义,在另一个模块引用的符号外部符号定义与引用的伪指令:外部符号定义与引用的伪指令:.def 在当前模块中定义,并可在别的模块中使用的符号在当前模块中定义,并可在别的模块中使用的符号.ref 在当前模块中使用,但在别的模块中定义的符号在当前模块中使用,但在别的模块中定义的符号.global 全局符

44、号全局符号例:.defX; 定义 X.refY; 引用 YX:ADD056hMPYY6.5 程序的汇编程序的汇编汇编程序(汇编器)是将汇编语言源程序转换成汇编程序(汇编器)是将汇编语言源程序转换成COFF的机器语言目标的机器语言目标文件文件汇编器的功能:汇编器的功能: 将汇编语言源程序汇编成可重定位的目标文件(将汇编语言源程序汇编成可重定位的目标文件(.obj文件)文件) 如果需要的话,可生成一个列表文件(如果需要的话,可生成一个列表文件(.lst文件)文件) 将程序代码分成若干个段,每个段的目标代码都有一个段程序计数器将程序代码分成若干个段,每个段的目标代码都有一个段程序计数器(SPC)来管

45、理)来管理 定义和引用符号,需要的话可形成一张交叉引用表定义和引用符号,需要的话可形成一张交叉引用表汇编程序(汇编器)的运行汇编程序(汇编器)的运行dspainput file object file listing file -options dspa 汇编程序名 6.5 程序的汇编程序的汇编汇编程序(汇编器)是将汇编语言源程序转换成汇编程序(汇编器)是将汇编语言源程序转换成COFF的机器语言目标的机器语言目标文件文件汇编器的功能汇编器的功能: 将汇编语言源程序汇编成可重定位的目标文件(将汇编语言源程序汇编成可重定位的目标文件(.obj文件)文件) 如果需要的话,可生成一个列表文件(如果需要

46、的话,可生成一个列表文件(.lst文件)文件) 将程序代码分成若干个段,每个段的目标代码都有一个段程序计数器将程序代码分成若干个段,每个段的目标代码都有一个段程序计数器(SPC)来管理)来管理 定义和引用符号,需要的话可形成一张交叉引用表定义和引用符号,需要的话可形成一张交叉引用表汇编程序(汇编器)的运行汇编程序(汇编器)的运行dspainput file object file listing file -options input file 输入汇编语言源程序文件名 (.asm 文件)(扩展名可省缺) 6.5 程序的汇编程序的汇编汇编程序(汇编器)是将汇编语言源程序转换成汇编程序(汇编器)

47、是将汇编语言源程序转换成COFF的机器语言目标的机器语言目标文件文件汇编器的功能汇编器的功能: 将汇编语言源程序汇编成可重定位的目标文件(将汇编语言源程序汇编成可重定位的目标文件(.obj文件)文件) 如果需要的话,可生成一个列表文件(如果需要的话,可生成一个列表文件(.lst文件)文件) 将程序代码分成若干个段,每个段的目标代码都有一个段程序计数器将程序代码分成若干个段,每个段的目标代码都有一个段程序计数器(SPC)来管理)来管理 定义和引用符号,需要的话可形成一张交叉引用表定义和引用符号,需要的话可形成一张交叉引用表汇编程序(汇编器)的运行汇编程序(汇编器)的运行dspainput fil

48、e object file listing file -options object file 命名创建的目标文件名 (.obj 文件)(若不提供文件名,则以 “ 输入文件名.obj ”来命名) 6.5 程序的汇编程序的汇编汇编程序(汇编器)是将汇编语言源程序转换成汇编程序(汇编器)是将汇编语言源程序转换成COFF的机器语言目标的机器语言目标文件文件汇编器的功能:汇编器的功能: 将汇编语言源程序汇编成可重定位的目标文件(将汇编语言源程序汇编成可重定位的目标文件(.obj文件)文件) 如果需要的话,可生成一个列表文件(如果需要的话,可生成一个列表文件(.lst文件)文件) 将程序代码分成若干个段

49、,每个段的目标代码都有一个段程序计数器将程序代码分成若干个段,每个段的目标代码都有一个段程序计数器(SPC)来管理)来管理 定义和引用符号,需要的话可形成一张交叉引用表定义和引用符号,需要的话可形成一张交叉引用表汇编程序(汇编器)的运行汇编程序(汇编器)的运行dspainput file object file listing file -options listing file 命名产生的列表文件名 (.lst 文件)(若不提供文件名,则以 “ 输入文件名.lst ”来命名) 6.5 程序的汇编程序的汇编汇编程序(汇编器)是将汇编语言源程序转换成汇编程序(汇编器)是将汇编语言源程序转换成CO

50、FF的机器语言目标的机器语言目标文件文件汇编器的功能:汇编器的功能: 将汇编语言源程序汇编成可重定位的目标文件(将汇编语言源程序汇编成可重定位的目标文件(.obj文件)文件) 如果需要的话,可生成一个列表文件(如果需要的话,可生成一个列表文件(.lst文件)文件) 将程序代码分成若干个段,每个段的目标代码都有一个段程序计数器将程序代码分成若干个段,每个段的目标代码都有一个段程序计数器(SPC)来管理)来管理 定义和引用符号,需要的话可形成一张交叉引用表定义和引用符号,需要的话可形成一张交叉引用表汇编程序(汇编器)的运行汇编程序(汇编器)的运行dspainput file object file

51、 listing file -options -options 选项例: -l 产生列表文件-x产生交叉引用表列表文件:10000.data200010011coeff.word011h, 022h, 033h;创建.data 段0002 00220003003330000.bssvar1, 1 ;在.bss段中为两个40001.bssbuffer, 10 ;变量保留空间500030123ptr.word0123h ;继续建.data 段60000.text ;创建.text 段70000200fadd:LAC 0Fh80001d003aloop:SBLK#10002000180003f280

52、BLEZaloop00040001900056000SACLvar1, 0100004.data;继续创建.data 段11000400aaivals.word0AAh, 0BBh000500bb 行号SPC 目标代码 源程序语句6.6 程序的链接程序的链接链接器的主要任务:链接器的主要任务:根据链接命令或链接命令文件(根据链接命令或链接命令文件(.cmd文件)把文件)把1个或多个目个或多个目标文件标文件(文件名文件名obj)链接起来,生成可执行的输出文件链接起来,生成可执行的输出文件(文件文件名名.out)和存储器映像文件(和存储器映像文件(.map文件)文件)链接器所做工作:链接器所做工作

53、:把各个段配置到目标系统的存储器把各个段配置到目标系统的存储器对段和符号进行重定位,给它们指定一个最终的地址对段和符号进行重定位,给它们指定一个最终的地址解决输入文件之间未定义的外部引用解决输入文件之间未定义的外部引用链接器的运行:链接器的运行:dsplnk file1.obj file2.obj -o file.out或dsplnk linker.cmd 链接命令文件链接命令文件链接命令文件的扩展名为链接命令文件的扩展名为 .cmd,包含以下内容:,包含以下内容:1)输入文件名:要链接的目标文件、归档库文件或其他命令文件)输入文件名:要链接的目标文件、归档库文件或其他命令文件2)链接器选项)

54、链接器选项3)MEMORY 和和 SECTIONS 链接器伪指令链接器伪指令4)赋值语句:定义并赋值给全局符号)赋值语句:定义并赋值给全局符号5)注释:用)注释:用/*和和*/定界符加注释定界符加注释链接命令文件(链接命令文件(.cmd文件)举例:文件)举例:a.Obj b.obj c.obj /* input filename */-o prog.out -m prog.map /* options */MEMORYRAM:origin = 0100h length = 0100hROM:origin = 0200h length = 0100hSECTIONS.text ROM.data

55、ROM.bss RAM MEMORY伪指令MEMORY伪指令用于规定目标存储器的模型,定义用户系统所包含的存储器的形式,以及占据的地址范围TMS320C2000芯片的型号不同,其存储器的配置是不相同的。通过MEMORY伪指令可以进行不同型号芯片存储器的配置MEMORY伪指令的一般句法:MEMORY (大写) PAGE0: name1(attr): origin = constant, length = constant;PAGEn: name1(attr): origin = constant, length = constant;PAGE : 定义一个存储器空间,最多可定义255页 通常 P

56、AGE0 定义为程序存储器 PAGE1 定义为数据存储器 PAGE2 定义为I/O空间不使用PAGE选项,则链接器默认为PAGE0 一个PAGE代表一个完全独立的地址空间。 PAGE0上配置的存储器可以和PAGE1上已配置的存储器交叠 MEMORY伪指令MEMORY伪指令用于规定目标存储器的模型,定义用户系统所包含的存储器的形式,以及占据的地址范围TMS320C2000芯片的型号不同,其存储器的配置是不相同的。通过MEMORY伪指令可以进行不同型号芯片存储器的配置MEMORY伪指令的一般句法: MEMORY (大写) PAGE0: name1(attr): origin = constant,

57、 length = constant; PAGEn: name1(attr): origin = constant, length = constant;name : 对存储器区域取名,有1-8个字符组成 名字对链接器没有特殊意义,仅标识通常 存储器的区域范围不同PAGE上的存储器范围可以取相同的名字,但同一PAGE内的存储器范围不能有相同的名字,且不能重叠 MEMORY伪指令MEMORY伪指令用于规定目标存储器的模型,定义用户系统所包含的存储器的形式,以及占据的地址范围TMS320C2000芯片的型号不同,其存储器的配置是不相同的。通过MEMORY伪指令可以进行不同型号芯片存储器的配置MEM

58、ORY伪指令的一般句法: MEMORY (大写) PAGE0: name1(attr): origin = constant, length = constant; PAGEn: name1(attr): origin = constant, length = constant;attr (属性) : (可选项)为已命名的存储器区间规定1-4个属性R 规定对存储器可读;W规定对存储器可写;X 规定存储器可装入可执行代码;I 规定存储器可进行初始化任何没有规定属性的存储器都具有全部四项属性 MEMORY伪指令MEMORY伪指令用于规定目标存储器的模型,定义用户系统所包含的存储器的形式,以及占据的

59、地址范围TMS320C2000芯片的型号不同,其存储器的配置是不相同的。通过MEMORY伪指令可以进行不同型号芯片存储器的配置MEMORY伪指令的一般句法: MEMORY (大写) PAGE0: name1(attr): origin = constant, length = constant; PAGEn: name1(attr): origin = constant, length = constant;origin : 指定一个存储器区域的起始地址也可写成 org 或 o MEMORY伪指令MEMORY伪指令用于规定目标存储器的模型,定义用户系统所包含的存储器的形式,以及占据的地址范围T

60、MS320C2000芯片的型号不同,其存储器的配置是不相同的。通过MEMORY伪指令可以进行不同型号芯片存储器的配置MEMORY伪指令的一般句法: MEMORY (大写) PAGE0: name1(attr): origin = constant, length = constant; PAGEn: name1(attr): origin = constant, length = constant;length : 指定一个存储器区域的长度也可写成 len 或 l例:所定义的存储器映像VECSPROG未定义PAGE00000h003Fh0040hFF3FhFF40hFFFFhMMRS未定义PA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论