DSP汇编伪指令集讲解
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4 .copy, .include .copy, .include告诉编译器从其他文件中读入源语句。 区别在于:.copy读入的源语句将在列表文件中列出, 而.include伪指令读入的不在列表文件中列出。 当汇编器遇到.copy和 .include伪指令时,将停止汇 编当前的源文件语句,而去编译.copy和 .include文件中 的语句,然后继续汇编.copy和 .include后开始的源文件 语句。 5 .data , .text .data是数据段定义伪指令。它告诉汇编器把源代码汇 编到.data段中,且.data成为当前段。该段通常用来存放 数据表或初始化前的变量。 .text:定义.text段中的代码部分,该部分为可执行代 码。.text段是默认段,若汇编开始不指定其他段,就自动 汇编到该段。
4. 当编写具体的应用程序的时候, 用.copy或.include伪指令将I/O寄存器头文 件合中断矢量头文件复制到应用程序中, 形成一个汇编源程序(如delay.asm),再 由汇编器进行汇编后生成一个目标文件 (如delay.obj),最后连接器把该目标文 件和命令文件相连接,生成可执行文件 (如delay.out).
本例中用.usect伪指令定义两个未初始化的命名 段var1和var2。符号ptr和array分别指向var1段和 var2段的第一个字。 dflag指向var1段中50个字块 中的第一个字。
SPC 0000 0000 0000 0001 0001 0065 0002 0000 0003 目标代码 源程序 .text 2003 LACC ptr .usect array .usect 0037 ADD dflag .usect 0065 ADD vec .usect 0000 ADD .global ;汇编到.text段 03h “var1”,1 ;在var1段保留一个字 “var1”,100 ;在var1段保留100个字 037h “var1”,50 dflag ;还在.text段 “var2”,100 ; 在var2段保留100个字 vec ;还在.text段 array ;将array定义为外部符号名
1
五 . 常用的伪指令的讲解: .align
用途:.align伪指令重置短程序计数器(SPC),使 其指向下一个页边界,以保证后面的代码从一个数据页开 始。汇编器将原页中间的未用空间用含NOP指令的字填充, 一直填到该页边界。 例5.1 新的 一页 0000 0004 .byte 4 ;0页:0000~0079H 0080 .align ;从下一页00080H开始 0080 4572 .string “Error” ; “Er” 0081 726F ; “ro” 0082 7200 ; “r” 0100 .align ;从下一页00100H开始 0100 0006 .byte 6
3 .bss 用法: .bss 符号,字长[, 块标志] .bss 该指令表示在RAM中保留空间。 (1)符号是一个必要参数,它指向.bss保留空间 的第一个地址。字长也是必需参数,它是一个绝 对表达式,表示汇编在.bss段内分配多个字。 (2)字长也是必需参数,它是一个绝对表达式, 表示汇编器在.bss段内分配多个字。 (3)块标志是可选参数,如果不指定块标志或指 定为0,则汇编器在当前.bss段SPC处分配空间; 如果块标志为1,则汇编器将检查当前SPC和页边 界之间是否有足够的空间为变量分配,若有就连 续分配,若无就从下页开始分配。
5. 宏定义与子程序的区别:
宏定义 为了简化汇编语言源程序的书写,通常把一些
出现较为频繁的程序段定义为宏指令,当程序需要被 执行时,只需要一条宏调用语句。使用宏指令的优点 在于可以有效的缩短源程序的长度,节省代码占用内 存空间,使得代码易读,同时减少了重复书写引起的 错误。 子程序 是一个程序段,在程序中通过跳转指令调用, 在每次调用的时候,都需要把整个子程序复制到内存 中运行,占用更多的内存空间。
2 .bes 在当前段中保留一个指定数目的位数, 并用0填充。[用位数(n*16)可以保留n个字单 元]。 例5.2 0007 0100 .word 100h, 200h 0008 0200 0009 Res_1 .space 17 000B 000F .word 15 000C Res_2 .bes 20 000E 00BA .byte 0BAh 000F Res_3 .space 7*16
.bss, .data, .text, .sect, .usect;
2.初始化常数伪指令:在当前段中汇编数值。
.bes, .space, .byte, .field, .float, .bfloat, .int .word, .
long, .blong, .string;
3.段程序计数器排列伪指令:使段程序计数器 SPC指向预定的位置(例如页边界)。
连续空间的代码块或数据块。 页:64K的数据存储器可以分为512个数据页,每页的 大小是128字。
3. 输出段:
在SECTIONS伪指令描述的输出文件中定义的段,这
些段被定义好了内容以及怎么被分配。
4.源列表文件:
将源文件进行汇编,在产生目标文件的同时,还可以
产生源列表文件。它是在汇编器对源程序进行汇编后 产生的目标代码和源语句的列表文件。可以优化编译 器输出。
6 .title 用法:.title “字符串” 该伪指令为每一页输出列表文件打印标题(字符串的 内容)。字符串不能超过65个字符,汇编器在随后的页面 中打印出标题。其作用是生成标志符号,方便通过用反汇 编器结合.title所定义字符串来观察生成的*.out文件的代码。 7 .def , .ref , .global .def , .ref, .global 伪指令所指定的符号为全局符号, 这些全局符号可以在外部定义或在外部被引用。 .def指定在当前模块中定义且可以在其他模块中使用 的符号。汇编器将该符号引入符号表。 .ref指定一个或多个在当前模块中使用但在其他模块 中定义的符号。一般与.def定义的符号对应。汇编器将该 符号标记为未定义的外部符号放入目标符号表,由连接器 在连接时处理该符号的定义。 .global同时具备.def , .ref的功能,需要时可代替它们。
.usect执行之后的存储器分布示意图
8.2 .sect用法:
.sect
“段名”
定义初始化命名段。段名必须用引号引起。该段中可包括代码或者数据, 类似于.text和.data。 9 .set伪指令: 用法: 符号 .set 数值 .set定义的符号在符号表中,不能重复定义。在数值表达式中的符号必 需事先定义。用.def或.global可以使用由.set定义的符号被其他模块调用。 例: IMR .set 0004h ; Interrupt Mask Register IFR .set 0006h ; Interrupt Flag Register 10 .byte, .float , .bfloat, .int , .word, .long , .blong, .string, .field 10.1 .byte用法: [标号] .byte 数值1[,数值2,……] .byte指令将一个或者多个8位的值植入当前段的连续字中。数值可以是 常数,表达式,字符串。使用标号的时候,汇编器指向第一个.byte位置。每 个.byte指令可以定义100个设置,若有字符串,则总数值长度不超过200个字 符。例如: 0000 .space 100h*16 0100 strx .byte ”ab”,”c” 0101 … 后面几个指令用法也基本类似,但数据类型不同。
.align, .even;
4.输出列表格式伪指令:控制列表文件的格式。
.drlist, .drnolist, .list, .fcnolist, .length, .width,.list,
.nolist, .mlist, .mnolist, .opinion, .ssnolist, .tab, .title
6. SPC介绍:
汇编器为每个段保留一个独立的程序计数器(SPC),汇
编器从0地址开始处理每一个段,同一个段均按顺序存 放。连接器根据每个段在内存图的最后位置进行再定 位。
二. DSP汇编的工作原理:
1. 汇编编译连接:结合图进行讲述
2. COFF文件格式:Common Object File Format 使用汇编器可以将汇编语言源程序汇编成为目 标文件,用连接器将若干个目标文件连接成一个可 以被TMS320C1X/C2000/C5X芯片执行的可执行文 件。这些目标文件的格式称为通用目标文件格式 COFF。 COFF文件总包括3个默认的段: 文本段(.text):通常包括可执行代码。 数据段(.data):通常包括已初始化的数据。 预留段(.bss):通常保留用于未初始化变量的空间。
8 .sect , .usect - 8.1 .usect用法: 符号名 .usect “段名”,字长[, 块边界] .usect为一个未命名段中的变量保留空间。类似.bss伪 指令(都为保留空间,但.usect可以在内存中任意定义, 而.bss则是独立的)。 (1)符号名指向.usect指定的第一个单元,它代表所预留空 间的变量名。 (2)段名告诉编译器从哪一个命名段开始保留空间。段名放 在双引号内,前8个字符有效。 (3)字长定义了该段保留的字数空间,可以用表达式表示。 (4)块边界为可选项,如果为非0,则改段为分块段。表示 在进行地址分配时,尽量不超过一页,若超过一页时,则从 另一页的边界开始。 用.usect对同一段名重复定义,可以将连续存放在存储器 的若干变量定义在同一个段内。
三. 伪指令的功能
伪指令的功能包括:
1.把代码和数据汇编到指定的段。 2.为未定义的变量保存空间。 3.控制列表文件。 4.分配存储器。 5.汇编条件块。 6.定义全局变量。 7.指定汇编器能得到的义伪指令:把汇编程序的各个部分与适当 的段(数据块或程序块)联系起来。
.page, .sslist,
5.引用其他文件伪指令:提供或者获取文件的信 息。 .copy, .include, .global, .def, .ref, .mlib; 6.条件汇编伪指令: .if, .elseif, .else, .endif, .loop, .break, .endloop; 7.汇编时的符号伪指令:把自定义的符号等同于 常数值或者字符串;‘ .asg, .eval, .set, .equ, .struct, .endstruct, .newblock 8.其他伪指 令:.end, .label, .mmregs, .port, .sblock, .version, .emsg, .wmsg;
六.简单的程序设计过程:
在程序设计时,一般来说需要进行规范的文件 管理,使得源代码组织清晰易读,有利于交流和 加快开发的进度。 1.如果需要在多个模块中使用相同的设置和中断 处理,通常将芯片映射到I/O空间的寄存器地址及 标号、预置变量和常数的空间等设置语句集中在 一个文件中,称为I/O寄存器头文件(如init.h)。 2.将转移中断矢量地址的指令集中在一个文件中, 称为中断矢量头文件(如vector.h)。 3.将定义程序,数据和I/O空间地址块大小和位置 的伪指令集中在一个文件称为命令文件(如 F2407.cmd)。 [以上三个合称为公用文件。]
DSP汇编伪指令 集讲解
一 相关的概念:
1.伪指令\宏指令\汇编指令
伪指令:
是在汇编和连接的时候提供控制信息和数据,并不产
生目标代码。
宏指令:
用户自己创建的指令,在汇编时将其展开并汇编为对
应的目标代码。
汇编指令: 在汇编时将产生一一对应的目标代码。
2.段\页
段:目标文件的最小单位称为段,它是在存储器中占有