DSP教程 第七章_伪指令和宏语言
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
号作为宏参数仅在被定义的宏中有效。
▲ 每个宏最多可以用32个宏参数。 ▲ 宏可以嵌套,但宏的所有元素都应在同一个文件中定义。 (2)调用宏:在定义了宏以后,就可以在源程序中将宏的名字作为操作码来调用。 格式: 宏名 [实参数1][,实参数2]…[,实参数n]
第7章 伪/宏wk.baidu.com令和目标链接文件
7 . 2 宏指令
7.4 目标文件链接
链接器命令文件和链接器伪指令
▲ 链接器通过链接COFF目标文件建立可 执行文件, ▲ 目标文件中的段是链接时的重要依据。 ▲ 链接器可把段定位到用户系 统已配置的存储器中。 ▲ 链接器命令文件(.cmd)则给出链接器在链接时的有关信息 ▲ DSP芯片的存储器配置随应用 的不同而不同. 用链接器伪指令 MEMORY(存储器伪指令)可以确定目标系统的各种内存配置。 ▲ 当MEMORY决定了存储器模式后,可以用链接器伪指令SECTIONS (段伪指令)确定链接器组合输入段的方法和输出段在存储器中的位置。 ▲ 如果不使用这两条伪指令,链接器则用默认存储器的定位方式来组合段, 并把它们定位到存储器中。
第7章 伪/宏指令和目标链接文件
7.4 目标文件链接
链接器命令文件和链接器伪指令
例6.24 MEMORY指令举例
/ * Sample Command file with MEMORY directive * / file1.obj file2.obj -o prog.out MEMORY { PAGE0: ROM: ORIGIN=0C00h ,LENGTH=1000h PAGE1: SCRATCH: ORIGIN =60h, LENGTH =20h RAM: ORIGIN =200h, LENGTH =200h }
第7章 伪/宏指令和目标链接文件
7.4 目标文件链接
链接器命令文件和链接器伪指令
属性:可选项,当被使用时,必须用括号括起来。属性把输出段的定位限制在某
些存储器范围内。如果用户不使用任何属性,则输出段即可以定位到任何 范围内。有效的属性包括:R——存储器可读; W——存储器可写; X——储器可以包含可执行代码; I——存储器可被初始化。
并且在链接时还可引用其他段内定义的符号
段程序计数器
汇编器为每个段设置了一个独立的程序计数器,这些计数器称为段程 序计数器(SPC,Section Program Counters)。 可以用段程序计数器排列伪指令.align或.even,强迫SPC指向预定的位 置。
第7章 伪/宏指令和目标链接文件
√表达式中的符号只具有符号的地址值,不进行类型检查。
√ 链接器表达式可以是绝对的或可重定位的。
第7章 伪/宏指令和目标链接文件
7.4 目标文件链接
链接器命令文件和链接器伪指令
▲ MEMORY伪指令
—— 确定在目标系统中具有物理位置且可被程序使用的存储器范围。
MEMORY伪指令的一般语句形式为:
MEMORY { PAGE 0: 存储器名1[(属性)]:ORIGIN=常数, LENGTH=常数 PAGE n: 存储器名n[(属性)]: ORIGIN=常数,LENGTH=常数 }
第7章 伪/宏指令和目标链接文件
7.4 目标文件链接
链接器命令文件和链接器伪指令
PAGE:
√定义一个存储器空间,用户可以定义多达255页。 √ PAGE0定义程序存储器,PAGE1定义数据存储器, PAGE2定义I/O空间。 √如果用户没有使用PAGE选项,那么链接器把段定位到PAGE0。 √每个PAGE代表一个完全独立的地址空间。 √在PAGE0上已配置的存储器可以和在PAGE1上已配置的存储器重叠。 存储器名: √命名存储器范围。由1~8个字符组成。 √名字对于链接器没有特殊的意义,仅指明存储器的区域。 √在不同页上存储器范围可以有相同的名字, √在同一页,所有的存储器范围不能有相同的名字,且不能重叠。
(3)展开宏:汇编器在对源文件进行汇编时,对调用的宏进行展开。在展开
过程中,汇编器用宏体取代宏调用语句,宏体中的形式参数实际参数代替。
, ① 如果某个形式参数没有对应的实参数为其赋值,该形式参数将被空串 (“ ”)代替。 ② 如果实参数的个数多于形式参数,则余下的实参数将赋给最后一个形式 参数(用逗号隔开)。 ③ 如果要把一串变量赋给一个形式参数,或者把一个逗号(或分号)传 给一个形式参数,就必须用引号将它们引起来。 ④ 汇编时,汇编器先用实参数代替形式参数并展开宏,然后把源语句汇编 为目标代码,并输出到列表文件中。
第7章 伪/宏指令和目标链接文件
7. 1 伪指令——分为8类:
▲ 段定义伪指令:把汇编语句程序的各部分与适当的段联系起来。 .bes, .bss, .data, .text, .sect, .usect,.sblock。 ▲初始化常数伪指令:为当前段汇编数值。 .space, .byte, .field, .float, .xfloat, .int, .word, .long, .xlong, .pstring,string。 ▲段程序计数器排列伪指令: 使段程序计数器SPC指向预定的位置。 align, .even。 ▲输出列表格式伪指令:控制列表文件的格式。 .drlist, .drnolist, .fclist, .fcnolist, .length, .width,.list,.nolist, .mlist, .mnolist, .option, .page, .sslist, .ssnolist, .tab, .title。 ▲引用其他文件伪指令:为文件提供信息或提供这些文件的信息。 . .copy, .include, .global, .def, .ref, .mlib。 ▲条件汇编伪指令:使汇编器根据表达式求值结果的真或假来汇编代码的某些段。 .if, .elseif, .else, .endif, .loop, .break, .endloop。 ▲汇编时的符号伪指令:使定义的符号名等同于常数值或字符串。 .asg, .eval, .set, .equ, .struct, .endstruct,.label 。 ▲ 汇编模式伪指令:定义在C28x 或认可C2xLP模式。.c28_amode, .lp_amode。 ▲其他伪指令:具有其他功能和特性的伪指令。 .end, .mmregs, .newblock, .port, .sblock, .version, .emsg, .wmsg。
第7章 伪/宏指令和目标链接文件
7. 2 宏指令
▲ 将频繁出现的程序段定义为宏指令, ▲ 当程序中需要执行该程序段时,只需用一条宏调用语句。 ▲ 缩短源程序的长度,使源程序易读,减少了书写错误。 使用宏的过程要经过以下3个步骤: 1)定义宏:用户在使用宏之前必须先定义宏。在程序的任何地方都可以定义一
第7章 伪/宏指令和目标链接文件
7.4 目标文件链接
目标文件的最小单位被称为段,它是在存储器中占有 段 连续空间的代码块或数据块。 COFF目标文件总是包括3个默认的段 : ▲ 文本段:用.text定义,通常包括可执行代码。 ▲ 数据段:用.data定义,通常包括已初始化的数据。 ▲ 预留段:用.bss定义,通常保留用于未初始化变量的空间。 用.usect,.sect或.asect伪指令可创建命名段。这些命名段 可以像.text,.data一样被使用。 COFF有两种基本类型的段: ① 已初始化的段 —— 包含数据或代码。用.text和.data伪指令定义的段和
▲ 把SPC赋予符号“.”:“.”表示定位期间SPC的当前值。“.”符号仅可用
在 SECTIONS伪指令内的赋值语句中,用来表示段的当前运行地址。
第7章 伪/宏指令和目标链接文件
7.4 目标文件链接
链接器命令文件和链接器伪指令
▲ 赋值表达式:链接器表达式必须遵循以下规则: √ 表达式可包含全局符号、常数,以及表8-3-1所列的C语言运算符。 √ 所有数被当做长整数(32位)处理。 √ 链接器用和汇编器相同的方式识别常数。见表8-3-2.
1
第7章 伪/宏指令和目标链接文件
7.1、伪指令 7.2、宏语言 7.3、内嵌函数 7.4、目标文件链接
第7章 伪/宏指令和目标链接文件
伪指令
TMS320C2000/C5X的汇编伪指令可以实现以下功能: ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ 汇编代码和数据到指定的段; 为未定义的变量保存空间; 控制列表文件; 分配存储器; 汇编条件块; 定义全局变量; 指定汇编器能得到的宏; 检查符号调试信息。
ORIGIN:指定存储器的起始地址,也可以写成org或o。这个值是以字节规定
的16位常数,也可以是十进制、八进制或十六进制。
LENGTH:指定存储器的长度,也可以写成len或l。数值的表示与origin相同 注意: ▲ 当用户使用MEMORY伪指令时,要确信已指定了所有可 用于装载代码的存储器范围。 ▲ 链接器不把程序放到未配置的存储器中。
个宏。可在源文件开始处或者在.include/.copy文件中或者在宏库中定义。
格式:
宏名 .macro [形式参数1][,形式参数2]…[,形式参数n] } 宏体 [.mexit] .endm
第7章 伪/宏指令和目标链接文件
7. 2 宏指令
宏名 —— 用通常规定的字符串格式书写。 .mexit —— 相当于“goto .endm”,用于条件判断后的转移,可缺省。 形式参数 —— 或称为替代符号。同样按通常规定的字符串格式书写。替代符
第7章 伪/宏指令和目标链接文件
7.4 目标文件链接
链接器命令文件和链接器伪指令
链接时给符号赋值 ▲ 赋值语句的语法:链接器中赋值语句的语法类似于C语言中赋值语句语法。
符号 = 表达式 符号 += 表达式 符号 -= 表达式 符号 *= 表达式 符号 /= 表达式 ;把表达式的值赋予符号 ;把表达式的值加到符号上 ;从符号减去表达式的值 ;符号乘以表达式 ;符号除以表达式
第7章 伪/宏指令和目标链接文件
7 .4 目标文件链接
用汇编器可以将汇编语言源程序汇编为目标文件,用链接 器将若干个目标文件链接成一个可被DSP芯片执行的可执行文 件。这些目标文件的格式称为通用目标文件格式(COFF, Common Object File Format)。 通用目标文件格式允许用户编写汇编语言程序时使用代码 块和数据块,这些块被称为段。 DSP系统中常用的文件后缀 .C —— C源文件 .ASM ——汇编文件 .H ——头文件 .PRJ ——工程文件 .MAP ——映射文件 .OBJ——目标文件 .CMD —— 命令文件 .LST —— 列表文件 .OUT ——可执行文件
第7章 伪/宏指令和目标链接文件
7.4 目标文件链接
链接器命令文件和链接器伪指令
链接器命令文件 .cmd 链接器命令文件允许用户把链接信息放置在文件中。命令 文件是ASCII文件,可以包含下列各项中的某一项: ▲ 输入文件名。该输入文件可以是目标文件、归档库或其他命令文件。 ▲ 链接器选项。在命令文件中可以用命令行上的链接器选项。 ▲ MEMORY和SECTIONS链接器伪指令。 ▲ 注释。用户可以使用/*和*/定界符把注释加到命令文件中。 ▲ 赋值语句。该语句定义并赋值给全局符号。
用.sect或.asect伪指令创建的命名段均为已初始化的段。
② 未初始化的段—— 在内存映射中为未初始化数据保留空间。.bss段和用
.usect伪指令创建的命名段是未初始化的段,在目标文 件中这些段没有实际内容。
第7章 伪/宏指令和目标链接文件
7.4 目标文件链接
段
▲ 汇编器在汇编过程中建立这些段,链接器把段重定位到目标存储器中 ▲ 所有的段都是独立的、可定位的 ▲ 相同的段将按先后次序定位在连续的区域内 ▲ 未初始化段被定位到RAM内;初始化段可单独定位在RAM或ROM内,
第7章 伪/宏指令和目标链接文件
7 . 2 宏指令
例6.23 宏定义:
parms .macro x,y,z a=x , b=y c=z .endm 调用宏: parms 100,200
汇编时展开宏: ;a=100 ;b=200 ;c=“ ” parms “100,200,300”,55,66,77 ;a=“100,200,300” ;b=55 ;c=66,77
▲ 每个宏最多可以用32个宏参数。 ▲ 宏可以嵌套,但宏的所有元素都应在同一个文件中定义。 (2)调用宏:在定义了宏以后,就可以在源程序中将宏的名字作为操作码来调用。 格式: 宏名 [实参数1][,实参数2]…[,实参数n]
第7章 伪/宏wk.baidu.com令和目标链接文件
7 . 2 宏指令
7.4 目标文件链接
链接器命令文件和链接器伪指令
▲ 链接器通过链接COFF目标文件建立可 执行文件, ▲ 目标文件中的段是链接时的重要依据。 ▲ 链接器可把段定位到用户系 统已配置的存储器中。 ▲ 链接器命令文件(.cmd)则给出链接器在链接时的有关信息 ▲ DSP芯片的存储器配置随应用 的不同而不同. 用链接器伪指令 MEMORY(存储器伪指令)可以确定目标系统的各种内存配置。 ▲ 当MEMORY决定了存储器模式后,可以用链接器伪指令SECTIONS (段伪指令)确定链接器组合输入段的方法和输出段在存储器中的位置。 ▲ 如果不使用这两条伪指令,链接器则用默认存储器的定位方式来组合段, 并把它们定位到存储器中。
第7章 伪/宏指令和目标链接文件
7.4 目标文件链接
链接器命令文件和链接器伪指令
例6.24 MEMORY指令举例
/ * Sample Command file with MEMORY directive * / file1.obj file2.obj -o prog.out MEMORY { PAGE0: ROM: ORIGIN=0C00h ,LENGTH=1000h PAGE1: SCRATCH: ORIGIN =60h, LENGTH =20h RAM: ORIGIN =200h, LENGTH =200h }
第7章 伪/宏指令和目标链接文件
7.4 目标文件链接
链接器命令文件和链接器伪指令
属性:可选项,当被使用时,必须用括号括起来。属性把输出段的定位限制在某
些存储器范围内。如果用户不使用任何属性,则输出段即可以定位到任何 范围内。有效的属性包括:R——存储器可读; W——存储器可写; X——储器可以包含可执行代码; I——存储器可被初始化。
并且在链接时还可引用其他段内定义的符号
段程序计数器
汇编器为每个段设置了一个独立的程序计数器,这些计数器称为段程 序计数器(SPC,Section Program Counters)。 可以用段程序计数器排列伪指令.align或.even,强迫SPC指向预定的位 置。
第7章 伪/宏指令和目标链接文件
√表达式中的符号只具有符号的地址值,不进行类型检查。
√ 链接器表达式可以是绝对的或可重定位的。
第7章 伪/宏指令和目标链接文件
7.4 目标文件链接
链接器命令文件和链接器伪指令
▲ MEMORY伪指令
—— 确定在目标系统中具有物理位置且可被程序使用的存储器范围。
MEMORY伪指令的一般语句形式为:
MEMORY { PAGE 0: 存储器名1[(属性)]:ORIGIN=常数, LENGTH=常数 PAGE n: 存储器名n[(属性)]: ORIGIN=常数,LENGTH=常数 }
第7章 伪/宏指令和目标链接文件
7.4 目标文件链接
链接器命令文件和链接器伪指令
PAGE:
√定义一个存储器空间,用户可以定义多达255页。 √ PAGE0定义程序存储器,PAGE1定义数据存储器, PAGE2定义I/O空间。 √如果用户没有使用PAGE选项,那么链接器把段定位到PAGE0。 √每个PAGE代表一个完全独立的地址空间。 √在PAGE0上已配置的存储器可以和在PAGE1上已配置的存储器重叠。 存储器名: √命名存储器范围。由1~8个字符组成。 √名字对于链接器没有特殊的意义,仅指明存储器的区域。 √在不同页上存储器范围可以有相同的名字, √在同一页,所有的存储器范围不能有相同的名字,且不能重叠。
(3)展开宏:汇编器在对源文件进行汇编时,对调用的宏进行展开。在展开
过程中,汇编器用宏体取代宏调用语句,宏体中的形式参数实际参数代替。
, ① 如果某个形式参数没有对应的实参数为其赋值,该形式参数将被空串 (“ ”)代替。 ② 如果实参数的个数多于形式参数,则余下的实参数将赋给最后一个形式 参数(用逗号隔开)。 ③ 如果要把一串变量赋给一个形式参数,或者把一个逗号(或分号)传 给一个形式参数,就必须用引号将它们引起来。 ④ 汇编时,汇编器先用实参数代替形式参数并展开宏,然后把源语句汇编 为目标代码,并输出到列表文件中。
第7章 伪/宏指令和目标链接文件
7. 1 伪指令——分为8类:
▲ 段定义伪指令:把汇编语句程序的各部分与适当的段联系起来。 .bes, .bss, .data, .text, .sect, .usect,.sblock。 ▲初始化常数伪指令:为当前段汇编数值。 .space, .byte, .field, .float, .xfloat, .int, .word, .long, .xlong, .pstring,string。 ▲段程序计数器排列伪指令: 使段程序计数器SPC指向预定的位置。 align, .even。 ▲输出列表格式伪指令:控制列表文件的格式。 .drlist, .drnolist, .fclist, .fcnolist, .length, .width,.list,.nolist, .mlist, .mnolist, .option, .page, .sslist, .ssnolist, .tab, .title。 ▲引用其他文件伪指令:为文件提供信息或提供这些文件的信息。 . .copy, .include, .global, .def, .ref, .mlib。 ▲条件汇编伪指令:使汇编器根据表达式求值结果的真或假来汇编代码的某些段。 .if, .elseif, .else, .endif, .loop, .break, .endloop。 ▲汇编时的符号伪指令:使定义的符号名等同于常数值或字符串。 .asg, .eval, .set, .equ, .struct, .endstruct,.label 。 ▲ 汇编模式伪指令:定义在C28x 或认可C2xLP模式。.c28_amode, .lp_amode。 ▲其他伪指令:具有其他功能和特性的伪指令。 .end, .mmregs, .newblock, .port, .sblock, .version, .emsg, .wmsg。
第7章 伪/宏指令和目标链接文件
7. 2 宏指令
▲ 将频繁出现的程序段定义为宏指令, ▲ 当程序中需要执行该程序段时,只需用一条宏调用语句。 ▲ 缩短源程序的长度,使源程序易读,减少了书写错误。 使用宏的过程要经过以下3个步骤: 1)定义宏:用户在使用宏之前必须先定义宏。在程序的任何地方都可以定义一
第7章 伪/宏指令和目标链接文件
7.4 目标文件链接
目标文件的最小单位被称为段,它是在存储器中占有 段 连续空间的代码块或数据块。 COFF目标文件总是包括3个默认的段 : ▲ 文本段:用.text定义,通常包括可执行代码。 ▲ 数据段:用.data定义,通常包括已初始化的数据。 ▲ 预留段:用.bss定义,通常保留用于未初始化变量的空间。 用.usect,.sect或.asect伪指令可创建命名段。这些命名段 可以像.text,.data一样被使用。 COFF有两种基本类型的段: ① 已初始化的段 —— 包含数据或代码。用.text和.data伪指令定义的段和
▲ 把SPC赋予符号“.”:“.”表示定位期间SPC的当前值。“.”符号仅可用
在 SECTIONS伪指令内的赋值语句中,用来表示段的当前运行地址。
第7章 伪/宏指令和目标链接文件
7.4 目标文件链接
链接器命令文件和链接器伪指令
▲ 赋值表达式:链接器表达式必须遵循以下规则: √ 表达式可包含全局符号、常数,以及表8-3-1所列的C语言运算符。 √ 所有数被当做长整数(32位)处理。 √ 链接器用和汇编器相同的方式识别常数。见表8-3-2.
1
第7章 伪/宏指令和目标链接文件
7.1、伪指令 7.2、宏语言 7.3、内嵌函数 7.4、目标文件链接
第7章 伪/宏指令和目标链接文件
伪指令
TMS320C2000/C5X的汇编伪指令可以实现以下功能: ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ 汇编代码和数据到指定的段; 为未定义的变量保存空间; 控制列表文件; 分配存储器; 汇编条件块; 定义全局变量; 指定汇编器能得到的宏; 检查符号调试信息。
ORIGIN:指定存储器的起始地址,也可以写成org或o。这个值是以字节规定
的16位常数,也可以是十进制、八进制或十六进制。
LENGTH:指定存储器的长度,也可以写成len或l。数值的表示与origin相同 注意: ▲ 当用户使用MEMORY伪指令时,要确信已指定了所有可 用于装载代码的存储器范围。 ▲ 链接器不把程序放到未配置的存储器中。
个宏。可在源文件开始处或者在.include/.copy文件中或者在宏库中定义。
格式:
宏名 .macro [形式参数1][,形式参数2]…[,形式参数n] } 宏体 [.mexit] .endm
第7章 伪/宏指令和目标链接文件
7. 2 宏指令
宏名 —— 用通常规定的字符串格式书写。 .mexit —— 相当于“goto .endm”,用于条件判断后的转移,可缺省。 形式参数 —— 或称为替代符号。同样按通常规定的字符串格式书写。替代符
第7章 伪/宏指令和目标链接文件
7.4 目标文件链接
链接器命令文件和链接器伪指令
链接时给符号赋值 ▲ 赋值语句的语法:链接器中赋值语句的语法类似于C语言中赋值语句语法。
符号 = 表达式 符号 += 表达式 符号 -= 表达式 符号 *= 表达式 符号 /= 表达式 ;把表达式的值赋予符号 ;把表达式的值加到符号上 ;从符号减去表达式的值 ;符号乘以表达式 ;符号除以表达式
第7章 伪/宏指令和目标链接文件
7 .4 目标文件链接
用汇编器可以将汇编语言源程序汇编为目标文件,用链接 器将若干个目标文件链接成一个可被DSP芯片执行的可执行文 件。这些目标文件的格式称为通用目标文件格式(COFF, Common Object File Format)。 通用目标文件格式允许用户编写汇编语言程序时使用代码 块和数据块,这些块被称为段。 DSP系统中常用的文件后缀 .C —— C源文件 .ASM ——汇编文件 .H ——头文件 .PRJ ——工程文件 .MAP ——映射文件 .OBJ——目标文件 .CMD —— 命令文件 .LST —— 列表文件 .OUT ——可执行文件
第7章 伪/宏指令和目标链接文件
7.4 目标文件链接
链接器命令文件和链接器伪指令
链接器命令文件 .cmd 链接器命令文件允许用户把链接信息放置在文件中。命令 文件是ASCII文件,可以包含下列各项中的某一项: ▲ 输入文件名。该输入文件可以是目标文件、归档库或其他命令文件。 ▲ 链接器选项。在命令文件中可以用命令行上的链接器选项。 ▲ MEMORY和SECTIONS链接器伪指令。 ▲ 注释。用户可以使用/*和*/定界符把注释加到命令文件中。 ▲ 赋值语句。该语句定义并赋值给全局符号。
用.sect或.asect伪指令创建的命名段均为已初始化的段。
② 未初始化的段—— 在内存映射中为未初始化数据保留空间。.bss段和用
.usect伪指令创建的命名段是未初始化的段,在目标文 件中这些段没有实际内容。
第7章 伪/宏指令和目标链接文件
7.4 目标文件链接
段
▲ 汇编器在汇编过程中建立这些段,链接器把段重定位到目标存储器中 ▲ 所有的段都是独立的、可定位的 ▲ 相同的段将按先后次序定位在连续的区域内 ▲ 未初始化段被定位到RAM内;初始化段可单独定位在RAM或ROM内,
第7章 伪/宏指令和目标链接文件
7 . 2 宏指令
例6.23 宏定义:
parms .macro x,y,z a=x , b=y c=z .endm 调用宏: parms 100,200
汇编时展开宏: ;a=100 ;b=200 ;c=“ ” parms “100,200,300”,55,66,77 ;a=“100,200,300” ;b=55 ;c=66,77