伪指令和命令文件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7、其他伪指令
(1).end:终止汇编。它是一个程序的最后一条源 ) :终止汇编。 语句。此伪指令与文件结束符具有同样的效果。 语句。此伪指令与文件结束符具有同样的效果。 ( 2) .label: 定义一个特定的标号 , 表示当前段的 ) : 定义一个特定的标号, 装载地址。 装载地址 。 当段在一个地址处装载但在另一个地址 处运行时,该指令特别有用。 处运行时,该指令特别有用。 ( 3) .version: 告诉汇编器该代码是属于哪一种处 ) : 理器。 伪指令必须出现在指令之前, 理器。.version伪指令必须出现在指令之前,否则将 伪指令必须出现在指令之前 出错。 出错。
TMS320LF2407 伪指令和命令文件简介
一、2407中常用的伪指令简介 中常用的伪指令简介
1、定义段的伪指令 、 2、初始化常数的伪指令 、 3、调准段程序计数器的伪指令 、 4、引用其它文件的伪指令 、 5、条件汇编伪指令 、 6、汇编时符号伪指令 、 7、其他伪指令 、
1、定义段的伪指令 、
3、调准段程序计数器的伪指令
调准在128个字的边界。 确保跟 个字的边界。 (1).align:把SPC调准在 ) : 调准在 个字的边界 随在.align伪指令之后的代码从数据页边界处开始。 伪指令之后的代码从数据页边界处开始。 随在 伪指令之后的代码从数据页边界处开始 如果SPC已调至数据页的边界,它不再增量。 已调至数据页的边界, 如果 已调至数据页的边界 它不再增量。 (2).even:调准 ) :调准SPC,使其指向下一个完整的字。 ,使其指向下一个完整的字。 在 使 用 .field 伪 指 令 之 后 用 户 应 当 使 用 .even , 如 伪指令未填满一个字, 果.field伪指令未填满一个字,.even指令将使汇编器 伪指令未填满一个字 指令将使汇编器 填满,并用0填未用到的位 填未用到的位。 填满,并用 填未用到的位。
2、初始化常数的伪指令 、
(1).bes和.space:在当前段中保留特定的位数。汇编 ) 和 :在当前段中保留特定的位数。 器用0填充这些保留位 用户可以通过把位数乘16来保 填充这些保留位。 器用 填充这些保留位。用户可以通过把位数乘 来保 留规定的字数。 留规定的字数。 当使用.space的标号时,指向保留位的第一个字。 的标号时, 当使用 的标号时 指向保留位的第一个字。 当使用.bes的标号时,指向保留位的最后一个字。 的标号时, 当使用 的标号时 指向保留位的最后一个字。 ( 2) .byte: 将一个或多个 位的数值置入当前段连续 ) : 将一个或多个8位的数值置入当前段连续 的字中。除了每个数值的宽度限制为8位以外, 类似。 与.word类似。 类似 (3).field:将单个数值置入当前字规定的位数中。用 ) :将单个数值置入当前字规定的位数中。 户可以用.field伪指令将多个域 ( field) 组装到单个字 伪指令将多个域( 户可以用 伪指令将多个域 ) 在字被填满之前,汇编器将不使SPC增量。 增量。 中,在字被填满之前,汇编器将不使 增量
5、条件汇编伪指令
条件汇编伪指令使用户能指示汇编器根据表达式求值 结果的真或假来汇编代码的某些段。 结果的真或假来汇编代码的某些段。 (1).if/.elseif/.else/.endif:告诉汇编器根据表达式的 ) : 值有条件地汇编代码块。 值有条件地汇编代码块。 .if expression 标示条件块的开始,如果.if条件为 标示条件块的开始,如果 条件为 那么汇编后面的代码块。 真,那么汇编后面的代码块。 .elseif expression 如果 条件为假且 如果.if条件为假且 条件为假且.elseif为真,那 为真, 为真 么汇编后面的代码块。 么汇编后面的代码块。 .else 如果.if为假 为假, 如果 为假,那么汇编后面的代码 块。 .endif 标志条件块的末尾并结束条件块。 标志条件块的末尾并结束条件块。
( 2) .loop/.break/.endloop: 告诉汇编器根据表达 ) : 式的值来重复地汇编代码块。 式的值来重复地汇编代码块。 .loop expression 标示可重复代码块的开始。 标示可重复代码块的开始。 .break expression 告诉汇编器当 告诉汇编器当.break表达式为假 表达式为假 时继续重复汇编;如果表达式为真,那么转移到紧 时继续重复汇编;如果表达式为真, 接在.endloop之后的代码。 之后的代码。 接在 之后的代码 .endloop 标志可重复块的末尾。 标志可重复块的末尾。
编译器处理段的过程为:每个源文件 都编泽成独立的目标文件(以后缀.obJ结 都编泽成独立的目标文件(以后缀.obJ结 尾),每个目标文件含有自己的段:连接器 把这些目标文件中相同段名的部分连接在 一起,生成最终的可执行文件(以后缀.out 一起,生成最终的可执行文件(以后缀.out 结尾) 结尾)。 段分为两大类:己初始化的段和未初 始化的段。 使用定义段的伪指令对这些段进行定 义,并把汇编语句程序的各部分与适当的 段联系起来。
C语言程序送给编译器进行编译的时候是采 用了分段的方式,使用段可以实现模块化 编程,从而用更加灵活的方法来管理代码 和目标系统的内存空间。 这里模块化编程的意思就是说程序员可以 根据自己的愿意自由决定把哪些代码归属 到哪些段,然后加以不同的处理。比如, 把已初始化数据归属到一个段,未初始化 数据归属到一个段,而不是混杂在一起。
二、命令文件 .CMD
TMS320LF2407的工程中主要包含头文件、库 的工程中主要包含头文件、 的工程中主要包含头文件 文件、命令文件、中断向量文件和程序源文件。 文件、命令文件、中断向量文件和程序源文件。 头文件中定义DSP系统用到的一些寄存器映射地 头文件中定义DSP系统用到的一些寄存器映射地 址。用户用到的常量和用户自定义的寄存器都在头 文件中定义,头文件名的后缀为.H。 文件中定义,头文件名的后缀为 。寄存器头文件 可以从其他文件或相关资料中复制, 可以从其他文件或相关资料中复制,或复制后根据 需要进行修改。 需要进行修改。 中断向量文件vectors.asm:定义了系统各种中断 : 中断向量文件 服务程序。 服务程序。
已初始化的段含有真实的指令和数据,存放 在程序存储空间。程序存储空间在DSP片内 在程序存储空间。程序存储空间在DSP片内 是FLASH ,调试代码时,常常通过跳线 MP/MC,装载代码到片外的程序存储空间。 MP/MC,装载代码到片外的程序存储空间。 未初始化的段只是保留变量的地址空间,未 初始化的段存放在数据存储空间,数据存储 空间多为RAM存储单元。在DSP上调用 空间多为RAM存储单元。在DSP上调用 _c_int0初始化库前,未初始化的段并没有真 _c_int0初始化库前,未初始化的段并没有真 实的内容。
命令文件名的后缀为.CMD,命令文件实现对 , 命令文件名的后缀为 程序存储器空间和数据存储器空间的分配。 程序存储器空间和数据存储器空间的分配。文件常 用的伪指令有Memory和Sections伪指令。 伪指令。 用的伪指令有 和 伪指令 Memory:用来标示实际存在目标系统中且可被使 : 用的存储器范围,每个存储器范围具有名字, 用的存储器范围,每个存储器范围具有名字,起始 地址和长度。 地址和长度。 Sections :描述输入段怎样被组合到输出段内;在可 描述输入段怎样被组合到输出段内; 执行程序内定义输出段; 执行程序内定义输出段;规定在存储器内何处放置输 出段;允许重命名输出段。 出段;允许重命名输出段。
Rts2xx.lib包含: 包含: 包含 ANSIC标准库; 标准库; 标准库 系统启动程序_c_int0; 系统启动程序 ; 允许C访问特殊指令的函数和宏 访问特殊指令的函数和宏。 允许 访问特殊指令的函数和宏。 rts2xx.lib库文件可在 库文件可在 “C:\CCStudio_v3.1\C2400\cgtools\lib”下找 下找 不能直接打开查看,一般不能修改。 到 。不能直接打开查看,一般不能修改。 程序源文件( 或 程序源文件(.C或.ASM)用于用户编写具有一定 ) 功能的程序。 功能的程序。
6、汇编时符号伪指令
(1).asg:把字符串赋给替代符号。 ) :把字符串赋给替代符号。 (2).set和.equ:把常量值赋予符号。 ) 和 :把常量值赋予符号。 ( 3) .struct/.endstruct: 建立类 语言的结构定 ) : 建立类C语言的结构定 不分配存储器, 义。不分配存储器,它们简单地创建可重复使用 的符号模板。 的符号模板。 的结构特性赋给标号。 (4).tag:把类 的结构特性赋给标号 。不分配 ) : 把类C的结构特性赋给标号 存储器,结构标号必须在使用之前定义。 存储器,结构标号必须在使用之前定义。 ( 4) .eval: 对表达式求值 , 把结果转化为字符 , ) : 对表达式求值, 把结果转化为字符, 并把字符赋给替代符号。 并把字符赋给替代符号。
ห้องสมุดไป่ตู้
(4).float和.bfloat:计算单精度 位IEEE格式浮 ) 和 :计算单精度32位 格式浮 点数的值, 并存入当前段的两个连续的字中, 点数的值 , 并存入当前段的两个连续的字中 , 先 存储低字,后存储高字。 存储低字,后存储高字。 .bfloat: float前加 “ b”, 意味着保证定义的浮点 前加“ , : 前加 数不会跨越数据页的边界。 数不会跨越数据页的边界。 个或多个16位值置入当前 ( 5) .int和 .word: 将 2个或多个 位值置入当前 ) 和 : 个或多个 段的连续字中。 段的连续字中。 ( 6) .long和 .blong: 将 32位数值置入当前段连续 ) 和 : 位数值置入当前段连续 两个字中,先存放低位字。 两个字中,先存放低位字。 .blong:保证目标不会跨越数据页的边界。 :保证目标不会跨越数据页的边界。 (7).string:将8位字符从一个或多个字符串置入 ) : 位字符从一个或多个字符串置入 当前段。除了把两个字符组装入每一个字外, 类似。 与 .byte类似 。 需要时 , 字符串中最后一个字用空 类似 需要时, 字符( )填充。 字符(0)填充。
定义未初始化的段: 定义未初始化的段: 为未初始化的变量。 (1) .bss 为未初始化的变量 。 在 .bss段内保留存 ) 段内保留存 储器空间。 储器空间。 在未初始化命名段内保留空间。 (2) .usect 在未初始化命名段内保留空间。.usect ) 伪 指 令 和 .bss 伪 指 令 相 类 似 , 但 是 它 允 许 用 户 与 分开保留空间。 段.bss分开保留空间。 分开保留空间 定义初始化的段: 定义初始化的段: 创建具有绝对地址的初始化命名段。 (3) .asect 创建具有绝对地址的初始化命名段 。 ) 包含代码或数据。在绝对段内,用户可以使用.label 包含代码或数据。在绝对段内,用户可以使用 伪指令来定义可重定位标号。 伪指令来定义可重定位标号。 标示.text段内代码部分 , 是系统定义的 段内代码部分, (4). text 标示 ) 段内代码部分 默认段,如不明确声明,代码一般都放在该段中。 默认段,如不明确声明,代码一般都放在该段中。 用户可以自行定义初始化的段。 (5) .sect 用户可以自行定义初始化的段 。 用 .sect ) 定义的段可包含代码或数据。 定义的段可包含代码或数据。
4、引用其它文件的伪指令
( 1) .copy和 .include: 告诉汇编器开始从其它文件 ) 和 : 中读入源语句。 中读入源语句。 当汇编器完成从copy( 复制 ) 或者 当汇编器完成从 ( 复制) 或者include( 包含 ) ( 包含) 文件内读入源语句时,恢复从当前文件读源语句。 文件内读入源语句时,恢复从当前文件读源语句。 ( 2) .def: 识别在当前模块中定义且可以被其它模 ) : 块使用的符号。 块使用的符号。 (3).global:声明外部符号。 ) :声明外部符号。 .global伪指令对于已定义符号起 伪指令对于已定义符号起.def的作用, 对于未 的作用, 伪指令对于已定义符号起 的作用 定义符号起.ref的作用 的作用。 定义符号起 的作用。 ( 4) .ref: 识别在当前模块中使用但在其它模块中 ) : 定义的符号。 定义的符号。