DSP汇编伪指令集讲解
第五章 DSP的汇编指令..

第五章 TMS320C55x系列DSP的汇编指令
(2) 用户自定义的双指令的并行
这两条指令的并行是通过用户或C编译器定义的。两条指令 同时执行两个操作,用并行符“||”区分并行执行的两条指令。 例:
MPYM *AR1+, *CDP, AC1 ;D单元的一个MAC来完成
||XOR AR2,T1
;A单元的ALU来完成
第五章 TMS320C55x系列DSP的汇编指令
1、高速数字信号处理中常采用汇编语言编程。 2、汇编语言中的两种指令集 (1) 助记符指令集:有助于记忆的符号来表示指令。 (2) 代数指令集:类似于代数表达式,运算关系清楚明了。 注意:DSP的软件开发工具只支持单一的指令形式,不支持助记
符指令和代数指令的混合形式。 3、术语、符号和缩写见P93的表5-1 4、运算符见表5-2
令执行的条件:
TCx(测试/控制标志为1) !TCx(测试/控制标志为0)
TC1&TC2 TC1&!TC2 TC1|TC2 TC1|!TC2 TC1^TC2 TC1^!TC2
!TC1&TC2 !TC1&!TC2 !TC1|TC2 !TC1|!TC2 !TC1^TC2 !TC1^!TC2
第五章 TMS320C55x系列DSP的汇编指令
4、双16比特算术指令: [(1)语法、(2)操作数、(3)状态位] 在D单元中利用其ALU的双16比特模式,同时执行(并行)两个16
比特算术运算,包括加-减、减-加、两个加和两个减运算。
例:
说明: NO:不能并行执行 3:指令的长度为3字节 1:周期为1 X:在X(执行)流水线阶段处理
D – ALU:在D单元ALU执行。 执行结果:AC0=(*AR3)+CARRY+AC1 状态位: Affected by CARRY,C54CM,M40等
DSP常用汇编语言指令简介

南航自动化学院DSP技术应用实验 室
6. I/O与存储器等指令举例
z Example1:IN 7,1000h ;(DP=6)从地址为1000H 的外部端口读入数据,盛放在地址为307h的数 据单元内。类似的指令还有:OUT。
LAR AR0, #60h
;AR0内容赋值为60h
ZAC
; 累加器ACC清零
loop: ADD *+, AR1 ;把当前工作寄存器AR0指向 的内存单元数值加到ACC,然后AR0内容加1,当前工 作寄存器指针指向AR1
BANZ loop, *-AR0 ;判断AR0是否为0,否则程序 转到loop,同时AR0的内容减1。
3. TREG(暂存单元指令),PREG(乘积单元指 令),multiply instructions (乘积指令)
4. Branch instructions (程序分支转移指令) 5. Control instructions (控制指令) 6. I/O and memory instruction(I/O和存储器指令)
室
2. 工作寄存器等指令举例
z Example1:MAR *+,AR1;把当前工作寄 存器的内容加1,然后再改变工作寄存器为 AR1。
z Example2:LAR AR4,#8123h;把AR4的 值改变为立即数。
LAR AR0,16;(DP=6)把 地址=310H的内存单元内容装入AR0。
z Example3:SAR AR0,*+;(如果当前工 作寄存器=AR1)把AR0的内容拷贝到AR1 指向的内存单元。 南航自动化学院DSP技术应用实验
汇编指令、伪指令大全

MOV指令为双操作数指令,两个操作数中必须有一个是寄存器.MOV DST , SRC // Byte / Word执行操作: dst = src1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用CS段寄存器).2.立即数不能直接送段寄存器3.不允许在两个存储单元直接传送数据4.不允许在两个段寄存器间直接传送信息PUSH入栈指令及POP出栈指令: 堆栈操作是以"后进先出"的方式进行数据操作.PUSH SRC //Word入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器.入栈时高位字节先入栈,低位字节后入栈.POP DST //Word出栈操作数除不允许用立即数和CS段寄存器外, 可以为通用寄存器,段寄存器和存储器.执行POP SS指令后,堆栈区在存储区的位置要改变.执行POP SP 指令后,栈顶的位置要改变.XCHG(eXCHanG)交换指令: 将两操作数值交换.XCHG OPR1, OPR2 //Byte/Word执行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp1.必须有一个操作数是在寄存器中2.不能与段寄存器交换数据3.存储器与存储器之间不能交换数据.XLAT(TRANSLATE)换码指令: 把一种代码转换为另一种代码.XLAT (OPR 可选) //Byte执行操作: AL=(BX+AL)指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码.LEA(Load Effective Address) 有效地址传送寄存器指令LEA REG , SRC //指令把源操作数SRC的有效地址送到指定的寄存器中.执行操作: REG = EAsrc注: SRC只能是各种寻址方式的存储器操作数,REG只能是16位寄存器MOV BX , OFFSET OPER_ONE 等价于 LEA BX , OPER_ONEMOV SP , [BX] //将BX间接寻址的相继的二个存储单元的内容送入SP中LEA SP , [BX] //将BX的内容作为存储器有效地址送入SP中LDS(Load DS with pointer)指针送寄存器和DS指令LDS REG , SRC //常指定SI寄存器。
dsp中的汇编伪指令

dsp中的汇编伪指令dsp中的汇编伪指令伪指令分类伪指令及其表⽰格式具体描述段定义伪指令 .asect “段名” , 地址汇编到⼀以绝对地址为起始的段中 .bss 符号,字数[,块标号] 在未初始化数据段bss中保留空间 .data 汇编到已初始化数据段data中 .sect “段名” 汇编到⼀已命名(已初始化)的段中.text 汇编到可执⾏代码段text中符号 .usect “段名”,字数[,块标号] 在⼀已命名(未初始化)的段中保留空间常数初始化伪指令(包括数据和地址常数) .bes 位数在当前段中保留位数(标号指向所保留空间的尾部) .bfloat 数值初始化⼀个32位,IEEE单精度的浮点常数;禁⽌有跨页的初始化对象。
.blong 数值1[,…,数值n] 初始化⼀个或多个32位整数;禁⽌有跨页的初始化对象。
.byte 数值1[,…,数值n] 初始化当前段中⼀个或多个连续字节 .field 数值1[,…,数值n] 初始化⼀个可变长度的字段 .float 数值初始化⼀个32位,IEEE单精度的浮点常数 .int 数值1[,…,数值n] 初始化⼀个或多个16位整数 .long 数值1[,…,数值n] 初始化⼀个或多个32位整数 .space 位数在当前段中保留位数(标号指向所保留空间的头部) .string “字符串1”[,…,“字符串n”] 初始化⼀个或多个⽂本字符串 .word 数值1[,…,数值n] 初始化⼀个或多个16位整数对准段程序计数器的伪指令 .align 在⼀页的边缘对准SPC(段程序计数器) .even 在⼀偶数的边缘对准SPC定义输出列表格式的伪指令 .drlist 使所有伪指令⾏都被列出(缺省⽅式) .drnolist 禁⽌某些伪指令⾏的列出 .fclist 允许列出错误的条件代码块(缺省⽅式) .fcnolist 禁⽌列出错误的条件代码块 .length 页的长度定义源⽂件列表的页长 .list 从头开始源⽂件的列表 .mlist 允许宏列表和循环块(缺省⽅式) .mnolist 禁⽌宏列表和循环块定义输出列表格式的伪指令 .nolist 停⽌源⽂件列表 .option{B/D/F/L/M/T/X} 选择输出列表⽂件的参数 .page 在源⽂件列表中⽣成⼀页.sslist 允许扩展⼦程序符号列表 .ssnolist 禁⽌扩展⼦程序符号列表(缺省⽅式) .tab ⼤⼩设置表的⼤⼩ .title “字符串” 在列表页头显⽰⼀个标题 .width 页宽设置源⽂件列表的页宽外部⽂件定位的指伪令 .copy [“]⽂件名[”] 包含其他⽂件中的源语句 .def 符号1[,…,符号n] 标明⼀个或多个在当前模块中定义⽽在其他模块中要⽤到的符号 .global 符号1[,…,符号n] 标明⼀个或多个全局(外部)符号 .include [“]⽂件名[”] 包含其他⽂件中的源语句 .mlib [“]⽂件名[”] 定义宏定义库 .ref符号1[,…,符号n] 标明⼀个或多个在另⼀模块中定义⽽在当前模块中要⽤到的符号条件汇编伪指令 .break [确切定义的表达式] 如果条件满⾜,就结束.loop汇编。
第七章_DSP的汇编伪指令

址的块) • .usect建立的段是在RAM中为变量保留空间
(类似于.bss段),.sect建立的是包含代码或数 据的段(类似于.text段和.data段)。 • 汇编器确定汇编语言程序的各个部分属于哪 一个特定的段,汇编器有六个命令来完成这种 功能,即:用于创建未初始化段.bss, .usect和 用于创建已初始化.text, .data, .sect,.asect, 如果程序未作说明,则统一汇编到.text段中。
宏语言可以使用户:
定义自己的宏,或重新定义正执行的宏 简化长的或复杂的汇编代码 访问由归档器建立的宏库 在一个宏内定义条件块和可重复的块 在一个宏内操作字符串 控制展开列表
定义宏
在程序中使用宏之前,首先必须定义它。可 以用两种方法来定义:
(1)在源文件开始处定义; (2) .include/.copy文件中定义; (3)在宏库中定义。
汇编伪指令
伪指令(Assembler Directives)
段定义伪指令
❖.bss
在该段中保留若干字
❖.data
汇编入已初始化的数据段
❖.sect “section name” 汇编入已命名的段
❖.text
汇编入可执行的代码段
.bss page,128 在 .bss段中为page定义128个字。
写入一个命令文件link.cmd :
定义宏举例
* add3 p1, p2, p3 (形参) * p3 = p1 + p2 + p3
add3 .macro p1, p2, p3 lacc p1 add p2 add p3 .endm
3-3 汇编伪指令

MAC *AR3+,*AR4+,A ;执行乘法并累加,结果放在A中
STL A,@y ;将A的低字内容送结果单元y
RET
;结束子程序
.end
;结束全部程序
No Assembly Errors, No Assembly Warnings
Field 4:
源程序语
17
句
(4)列表文件——段定义举例
例4-4 2 3
000001 0000
16 000002 7718
STM #STACK+10h,SP ;设置堆栈指针初值
000003 001017 000004 7711
000005 000018 000006 EC07
源文件的每一行都会在列表文件 STM #a,A中R1生成;A一R1行指向。a包的地括址行号、段程序 RPT #7 计数器;从S程P序C的存储数器值向、数据汇存编储后器 的目
;;;为为定源结F变义i果e量程标l句dyx号序分4分:语配配41个个单单元元的的空空间间15
一条指令可以生成1或2个字的目标代码。
11 000000
.data
;定义数据代码段
12 000000 0001 table: .word 1,2,3,4 ;在标号table开始的8个单元中
000001 0002 000002 0003 000003 0004
;定义数据代码段
;在标号table开始的8个单元中
;为这8个单元赋初值
13
(3)段程序计数器(SPC)
作用 表示一个程序代码段或数据段的当前地址
编址 过程
一开始,汇编器将每个SPC置0。当汇 编器将程序代码或数据加到一个段内 时,相应的SPC就增加。如果再继续对 某个段汇编,则相应的SPC就在先前的 数值上继续增加。链接器在链接时要 对每个段进行重新定位。
c54xx系列DSP汇编指令详解

意义 或运算 异或运算
减1 赋值于 表示一个立即数 x 的补码
|x|
x 的绝对值
0x
十六进制数据
>>
右移
<<
左移
×
乘法
*
指针指向的地址
TMS320C54xx 系列 DSP 的指令一共有 129 条,按功能分为如下几类:算术指令、逻 辑指令、程序控制指令、存储和装入指令以及循环指令。下面根据每种指令功能的不同,
目的累加器的反 if dst=A,then dst_=B if dst=B then dst_=A
E 地址总线 EAB 地址寄存器 23 位立即数表示的程序存储器地址 ST1 寄存器中的分数方式位 十六进制数据 十六进制数据 累加器 A 的高端(位 32~16) ST1 寄存器中的保持方式位 中断标志寄存器 ST1 寄存器中的中断屏蔽位 少于 9 位的短立即数
3 位立即数(0 ≤ k3 ≤ 7 ) 5 位立即数(-16 ≤ k5 ≤ 15 ) 9 位立即数(0 ≤ k9 ≤ 115 )
16 位长立即数 使用长字寻址 32 位单数据存储器操作数 存储器映射寄存器,AR0~AR7 或 SP
存储器映射寄存器,AR0~AR7 或 SP
紧跟 XC 指令的字数,n=1 或 2 指定在 RSBX、SSBX 和 XC 指令中修改的状态寄存器 N=0,状态寄存器 ST0 N=1,状态寄存器 ST1 ST0 寄存器中的累加器 A 的溢出标志 ST0 寄存器中的累加器 B 的溢出标志 目的累加器(A 或 B)的溢出标志 目的累加器反(A 或 B)的溢出标志 源累加器(A 或 B)的溢出标志 ST1 寄存器中的溢出方式位 16 位立即数表示的端口地址
③ 乘法指令
DSP教程4.TMS320C55x的指令系统_伪指令

条件汇编伪指令
• .if/.else/.endif 条件汇编代码块 • .loop/.endloop 条件循环代码块
宏语言
• Macro:A user-defined routine that can be used as an instruction
• 这条指令是我们用户定义的,并非汇编函 数中含有的。 • 当程序要将特定的程序任务执行若干次时, 显得尤为重要。
• 在宏库中定Biblioteka ,我直接调用这个宏库就可 以了定义宏 续
• Macname .macro [parameter] • Model statement • [.mexit] • .endm • Macname:宏名,相当于你自己造的操作码
例子
我们定义一个三个数的相加
调用宏
• 在源代码中永红的名字作为操作数来进行 宏调用。 • add3 就是宏名,调用的时候这个就可以看 成一个指令。
伪指令 Assembler Directives
伪指令为程序提供数据、控制汇编的过程, 主要工作包括: • 将代码和数据汇编到制定的位置 • 在存储器中为未初始化的变量保留存储空 间( • 控制列表的方式 • 定义全局变量 • 为汇编器制定可以获得宏
段定义伪指令
• .bss 在该段保留若干个子 • .data 汇编已经初识话的数据段 • .sect“section name”已初始化的自定义段。 中断向量表就是一个很好的例子 存在FLASH 中程序段 • .text 汇编的可执行的代码段,是指text下面 的汇编代码都存在该段,(程序段),C语 言经过汇编器编译后所生成的汇编指令就 是存在该段
宏语言可使用户执行的操作
• 可以定义自己的宏,或者重新定义正在执 行的宏。
- 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对同一段名重复定义,可以将连续存放在存储器 的若干变量定义在同一个段内。