Download presentation
Presentation is loading. Please wait.
Published byKatrina Pearson Modified 6年之前
1
第5章 TMS320C54x汇编语言程序设计 内容提要 汇编语言程序设计是应用软件设计的基础,主要任务是利用汇编指令和伪指令编写源程序以完成指定的功能。 本章将结合例子介绍TMS320C54x汇编语言源程序设计的基本方法,涉及的内容包括: 汇编语言源程序的格式 常数、字符串、符号和表达式的规定 堆栈的使用方法 分支、调用、返回控制程序 加法、乘法、除法、长字和并行运算程序 单指令、块重复、循环嵌套等重复操作程序 数据块传送程序 小数运算程序和浮点运算程序 2018年11月20日 DSP原理及应用
2
第5章 TMS320C54x汇编语言程序设计 5.1 概述 5.2 堆栈的使用方法 5.3 控制程序 5.4 算术运算程序
第5章 TMS320C54x汇编语言程序设计 5.1 概述 5.2 堆栈的使用方法 5.3 控制程序 5.4 算术运算程序 5.5 重复操作程序 5.6 数据块传送程序 5.7 小数运算程序 5.8 浮点运算程序 2018年11月20日 DSP原理及应用
3
第5章 TMS320C54x汇编语言程序设计 5.1 概述 TMS320C54x汇编语言源程序由源语句组成。这些语句可以包含汇编语言指令、汇编伪指令和注释。程序的编写必须符合一定的格式,以便汇编器将源文件转换成机器语言的目标文件。 本节将介绍汇编语言源程序的格式、各种常数、符号、字符串和表达式的规定。 2018年11月20日 DSP原理及应用
4
第5章 TMS320C54x汇编语言程序设计 5.1 概述 5.1.1 汇编语言源程序格式 汇编语言程序以.asm为扩展名,可以用任意的编辑器编写源文件。一条语句占源程序的一行,长度可以是源文件编辑器格式允许的长度,但汇编器每行最多读200个字符。因此,语句的执行部分必须限制在200个字符以内。 2018年11月20日 DSP原理及应用
5
5.1.1 汇编语言源程序格式 1. 源文件格式 助记符指令源语句的每一行通常包含4个部分:标号区、助记符区、操作数区和注释区。
第5章 TMS320C54x汇编语言程序设计 5.1.1 汇编语言源程序格式 1. 源文件格式 助记符指令源语句的每一行通常包含4个部分:标号区、助记符区、操作数区和注释区。 助记符指令语法格式: [标号][:] 助记符 [操作数] [; 注释] 【例5.1.1】 助记符指令源语句举例。 NANHUA .set ; 符号NANHUA=1 Begin: LD #NANHUA,AR1 ; 将1加载到AR1 标 号 助记符 操作数 注 释 2018年11月20日 DSP原理及应用
6
① 所有语句必须以标号、空格、星号或分号(*或;)开始; ② 标号是可选项,若使用标号,则标号必须从第一列开始;
第5章 TMS320C54x汇编语言程序设计 1. 源文件格式 语句的书写规则: ① 所有语句必须以标号、空格、星号或分号(*或;)开始; ② 标号是可选项,若使用标号,则标号必须从第一列开始; ③ 所有包含有汇编伪指令的语句必须在一行完成指定; ④ 各部分之间必须用空格分开,Tab字符与空格等效; 2018年11月20日 DSP原理及应用
7
⑤ 程序中注释是可选项。如果注释在第一列开始时,前面必须标上星号或分号,在其他列开始的注释前面必须以分号开头;
第5章 TMS320C54x汇编语言程序设计 1. 源文件格式 语句的书写规则: ⑤ 程序中注释是可选项。如果注释在第一列开始时,前面必须标上星号或分号,在其他列开始的注释前面必须以分号开头; ⑥ 如果源程序很长,需要书写若干行,可以在前一行用反斜杠字符(\)结束,余下部分接着在下一行继续书写。 2018年11月20日 DSP原理及应用
8
所有汇编指令和大多数汇编伪指令都可以选用标号,供本程序或其它程序调用。
第5章 TMS320C54x汇编语言程序设计 2.标号 所有汇编指令和大多数汇编伪指令都可以选用标号,供本程序或其它程序调用。 ① 标号必须从语句的第1列写起,其后的冒号“:”可任选; ② 标号为任选项,若不使用标号,则语句的第一列必须是空格、星号或分号; ③ 标号是由字母、数字以及下划线和美元符号等组成,最多可达32个字符; ④ 标号分大小写,且第一个字符不能是数字。 2018年11月20日 DSP原理及应用
9
在使用标号时,标号的值是段程序计数器SPC的当前值。 例如,若使用.word伪指令初始化几个字,则标号将指到第一个字。
第5章 TMS320C54x汇编语言程序设计 2.标号 在使用标号时,标号的值是段程序计数器SPC的当前值。 例如,若使用.word伪指令初始化几个字,则标号将指到第一个字。 【例5.1.2】 标号格式举例。 … … A Start: .word 0Ah,3,7 ;假设汇编了某个其他代码 标号,值为40h 2018年11月20日 DSP原理及应用
10
助记符用来表示指令所完成的操作,可以是汇编语言指令、汇编伪指令、宏伪指令。
第5章 TMS320C54x汇编语言程序设计 3.助记符 助记符用来表示指令所完成的操作,可以是汇编语言指令、汇编伪指令、宏伪指令。 助记符指令:一般用大写,不能从第一列开始 ; 汇编伪指令:用来为程序提供数据和控制汇编进程。以句号“.”开始,且用小写; 宏伪指令:用来定义一段程序,以便宏调用来调用这段程序。以句号“.”开始,且用小写; 宏调用:用来调用由宏伪指令定义的程序段。 2018年11月20日 DSP原理及应用
11
操作数是指指令中参与操作的数值或汇编伪指令定义的内容,紧跟在助记符的后面,由一个或多个空格分开。
第5章 TMS320C54x汇编语言程序设计 4.操作数 操作数是指指令中参与操作的数值或汇编伪指令定义的内容,紧跟在助记符的后面,由一个或多个空格分开。 操作数之间必须用逗号“,”分隔; 操作数可以是常数、符号或表达式; 操作数中的常数、符号或表达式可用来作为地址、立即数或间接地址; 2018年11月20日 DSP原理及应用
12
汇编器允许指定的常数、符号或表达式作为地址、立即数或间接地址。
第5章 TMS320C54x汇编语言程序设计 4.操作数 (1) 指令的操作数前缀 汇编器允许指定的常数、符号或表达式作为地址、立即数或间接地址。 作为操作数的前缀有三种情况: 使用“#”符号作为操作数的前缀; 使用“*”符号作为操作数的前缀; 符号作为操作数的前缀。 2018年11月20日 DSP原理及应用
13
使用“#”号作为前缀,汇编器将操作数作为立即数处理。即使操作数是寄存器或地址,也将作为立即数。
第5章 TMS320C54x汇编语言程序设计 (1) 指令的操作数前缀 ① 用“#” 作前缀 使用“#”号作为前缀,汇编器将操作数作为立即数处理。即使操作数是寄存器或地址,也将作为立即数。 如果操作数是地址,汇编器将把地址处理为一个数值,而不使用地址的内容。 例如: Label: ADD # 99, B 操作数# 99是一个立即数。 2018年11月20日 DSP原理及应用
14
使用“*”符号作为前缀,汇编器将操作数作为间接地址,即把操作数的内容作为地址。
第5章 TMS320C54x汇编语言程序设计 (1) 指令的操作数前缀 ② 用“*”作前缀 使用“*”符号作为前缀,汇编器将操作数作为间接地址,即把操作数的内容作为地址。 例如: Label: LD * AR3, B 操作数*AR3指定一个间接地址。该指令将引导汇编器找到寄存器AR3的内容作为地址,然后将该地址中的内容装入指定的累加器B中。 2018年11月20日 DSP原理及应用
15
使用“@”符号作为前缀,汇编器将操作数作为直接地址,即操作数由直接地址码赋值。
第5章 TMS320C54x汇编语言程序设计 (1) 指令的操作数前缀 ③ 例如: Label: LD @ x, A 只要DP=0,将直接地址x中的内容装入指定的累加器A中。 2018年11月20日 DSP原理及应用
16
将“#”加在数值之前而构成的立即数方式,主要用在指令中。
第5章 TMS320C54x汇编语言程序设计 4.操作数 (2) 伪指令的立即数 将“#”加在数值之前而构成的立即数方式,主要用在指令中。 通常,立即数在伪指令中用的较少,但在某些情况下,立即数也可以作为伪指令的操作数。 例如: SUB # 18, B ; 操作数#18为立即数 例如: .byte 立即数方式没有使用,但汇编器认为操作数是一个数值18(即立即数),用18数值初始化一个字节。 2018年11月20日 DSP原理及应用
17
注释可位于句首或句尾,位于句首时,以“*”或“;”开始,位于句尾时,以分号“;”开始。
第5章 TMS320C54x汇编语言程序设计 5.注释 用来说明指令功能的文字,便于用户阅读。 注释可位于句首或句尾,位于句首时,以“*”或“;”开始,位于句尾时,以分号“;”开始。 注释可单独一行或数行; 注释是任选项。 例如: bss sym, ; 保留空间于.bss ************************************** * 改变段,允许第五个‘mylab’定义 * 2018年11月20日 DSP原理及应用
18
5.1.2 汇编语言中的常数与字符串 汇编器可支持7种类型的常数(常量)。 第5章 TMS320C54x汇编语言程序设计 数据类型 举 例
第5章 TMS320C54x汇编语言程序设计 5.1.2 汇编语言中的常数与字符串 汇编器可支持7种类型的常数(常量)。 数据类型 举 例 说 明 二进制 b或 B 八进制 226q或572Q 十进制 1234或+1234或-11234 缺省型 十六进制 0A40h或0A40H或0xA40 浮点数 1.623e-23 仅用于C语言 字符 ‘D’ 字符串 “this is a string” 2018年11月20日 DSP原理及应用
19
第5章 TMS320C54x汇编语言程序设计 5.1.2 汇编语言中的常数与字符串 1.二进制整数 二进制整型常量最多由16位二进制数字(0或1)组成,后缀为B(或b)。如果数字小于16位,汇编器将其右边对齐,并在前面补零。 例如: B (十进制)或88(十六进制) b (十进制)或3C(十六进制) 10b (十进制)或2(十六进制) B (十进制)或8F(十六进制) 2018年11月20日 DSP原理及应用
20
第5章 TMS320C54x汇编语言程序设计 5.1.2 汇编语言中的常数与字符串 2.八进制整数 八进制整型常量最多由6位的八进制数字(0到7) 组成,后缀为Q(或q)或前缀为0(零)。 例如: 100011Q (十进制)或8009(十六进制) 124q (十进制)或54(十六进制) 八进制常数也可使用C语言的记号,即加前缀0。 (十进制)或8009(十六进制) (十进制)或54(十六进制) 2018年11月20日 DSP原理及应用
21
第5章 TMS320C54x汇编语言程序设计 5.1.2 汇编语言中的常数与字符串 3.十进制整数 十进制整型常量由十进制数字串组成,无后缀。取值范围为:-32 768~32 767或0~65 535。 例如: (十进制)或846(十六进制) (十进制)或0FFFF(十六进制) - -32768(十进制)或8000(十六进制) 2018年11月20日 DSP原理及应用
22
第5章 TMS320C54x汇编语言程序设计 5.1.2 汇编语言中的常数与字符串 4.十六进制整数 十六进制整型常量最多由4位十六进制数字组成,带后缀H(或h)。它必须以数字(0~9)开始,也可以加前缀0x。 例如: 0DH (十进制)或000D(十六进制) 12BCH (十进制)或12BC(十六进制) 十六进制常数也可用C语言记号,即加前缀0x。 0x0D (十进制)或000D(十六进制) 0x12BC (十进制)或12BC(十六进制) 2018年11月20日 DSP原理及应用
23
5.1.2 汇编语言中的常数与字符串 5.浮点数 浮点整型常量由一串十进制数字组成,可以带小数点、分数和指数部分。 浮点数的表示方法:
第5章 TMS320C54x汇编语言程序设计 5.1.2 汇编语言中的常数与字符串 5.浮点数 浮点整型常量由一串十进制数字组成,可以带小数点、分数和指数部分。 浮点数的表示方法: [±][n].[n] [E | e] [±] [n] n——为一串十进制数,浮点数前可带加减号(+或-),且小数点必须指定。 例如: 99.e9——有效的数;99e9——非法。 合法:.314 ,3.14 , -.314e-19 。 2018年11月20日 DSP原理及应用
24
第5章 TMS320C54x汇编语言程序设计 5.1.2 汇编语言中的常数与字符串 6. 汇编时间常数 在程序中使用.set伪指令给一个符号赋值,该符号就成为一个汇编时间常数,等效于一个常数。 为了使用表达式中的常数,赋给符号的必须是绝对值。 例如:将常数值18赋给符号bei_hua。 bei_hua set LD # bei_hua,A 2018年11月20日 DSP原理及应用
25
也可以用.set伪指令将符号常数赋给寄存器名。此时,该符号变成了寄存器的替代名。
第5章 TMS320C54x汇编语言程序设计 6. 汇编时间常数 也可以用.set伪指令将符号常数赋给寄存器名。此时,该符号变成了寄存器的替代名。 例如: AuxRl set ARl MVMM AuxRl,SP 注意:常量不能进行符号扩展。 如:0ACH等于十六进制的00AC或十进制172, 不等于-84。 2018年11月20日 DSP原理及应用
26
第5章 TMS320C54x汇编语言程序设计 5.1.2 汇编语言中的常数与字符串 7.字符常数 字符常数是包括在单引号内的字符串。若单引号之间没有字符,则值为0。每个字符在内部表示为8位ASCII码。 例如: ‘a’ 内部表示为61 h ‘B’ 内部表示为42 h 2018年11月20日 DSP原理及应用
27
第5章 TMS320C54x汇编语言程序设计 5.1.2 汇编语言中的常数与字符串 8.字符串 字符串是由双引号括起来的一串字符,最大长度是可以变化的,由要求字符串的伪指令来设置。字符在内部用8位ASCII码来表示。 例如: “example” 定义了一个长度为7的字符串:example 2018年11月20日 DSP原理及应用
28
.setsect——作为该伪指令中的段地址 .byte——作为数据初始化伪指令中的变量名 .string——作为该伪指令的操作数
第5章 TMS320C54x汇编语言程序设计 8.字符串 字符串可用于下列伪指令中: .copy——作为复制伪指令中的文件名 .sect——作为命名段伪指令中的段名 .setsect——作为该伪指令中的段地址 .byte——作为数据初始化伪指令中的变量名 .string——作为该伪指令的操作数 注意:字符常数与字符串的差别。 字符常数代表单个整数值。 字符串只是一串字符。 2018年11月20日 DSP原理及应用
29
5.1.3 汇编源程序中的符号 汇编程序中的符号用于标号、常数和替代字符。
第5章 TMS320C54x汇编语言程序设计 5.1.3 汇编源程序中的符号 汇编程序中的符号用于标号、常数和替代字符。 由字母、数字以及下划线和美元符号(A~Z,a~z,0~9,_和$)等组成; 符号名最多可长达200个字符; 在符号中,第1位不能是数字,并且符号中不能含空格。 2018年11月20日 DSP原理及应用
30
5.1.3 汇编源程序中的符号 1. 标号 作为标号的符号代表在程序中对应位置的符号地址。
第5章 TMS320C54x汇编语言程序设计 5.1.3 汇编源程序中的符号 1. 标号 作为标号的符号代表在程序中对应位置的符号地址。 通常,标号是局部变量,在一个文件中局部使用的标号必须是唯一的。 助记符操作码和汇编伪指令名(不带前缀“.”)为有效标号。 标号分大小写。 在调用汇编器时使用-c选项,可以不分大小写。 例如:ABC,Abc,abc是3个不同的符号。 2018年11月20日 DSP原理及应用
31
标号还可以作为.global,.ref,.def或.bss等汇编伪指令的操作数。
第5章 TMS320C54x汇编语言程序设计 1. 标号 标号还可以作为.global,.ref,.def或.bss等汇编伪指令的操作数。 如: .global label lable1 NOP ADD label,B B label1 2018年11月20日 DSP原理及应用
32
5.1.3 汇编源程序中的符号 2. 符号常数 符号也可被设置成常数值。为了提高程序的可读性,可以用有意义的名称来代表一些重要的常数值。
第5章 TMS320C54x汇编语言程序设计 5.1.3 汇编源程序中的符号 2. 符号常数 符号也可被设置成常数值。为了提高程序的可读性,可以用有意义的名称来代表一些重要的常数值。 伪指令.set和.struct/.tag/.endstruct可以用来将常数赋给符号名。 注意:符号常数不能被重新定义。 2018年11月20日 DSP原理及应用
33
2. 符号常数 第5章 TMS320C54x汇编语言程序设计 【例5.1.3】 定义符号常数举例。 N .set 512
第5章 TMS320C54x汇编语言程序设计 2. 符号常数 【例5.1.3】 定义符号常数举例。 N set buffer .set * N nzg1 .set 1 nzg2 .set 2 nzg3 .set 3 item .struct .int nzg1 .int nzg2 .int nzg3 tang .endstruct array .tag item .bss array,tang* N ;定义常数 ;item结构定义 ;常数偏移nzg1 = 1 ;常数偏移nzg2 = 2 ;常数偏移nzg2 = 3 ;声明数组 2018年11月20日 DSP原理及应用
34
5.1.3 汇编源程序中的符号 3. 定义符号常数 使用-d选项可以将常数值与一个符号等同起来。
第5章 TMS320C54x汇编语言程序设计 5.1.3 汇编源程序中的符号 3. 定义符号常数 使用-d选项可以将常数值与一个符号等同起来。 定义符号常数后,在汇编源文件中可用符号代替和它等同的值。 定义格式: asm d name = [value] 汇编命令 汇编选项 符号名称 符号的值 若value省略,则符号的值设置为l。 2018年11月20日 DSP原理及应用
35
3. 定义符号常数 第5章 TMS320C54x汇编语言程序设计 注意:内部函数$isdefed中的变量必须括在双引号内。
第5章 TMS320C54x汇编语言程序设计 3. 定义符号常数 检测类型及伪指令 检测类型 使用的伪指令 存在 不存在 与值相等 与值不等 .if $isdefed("name") .if $isdefed("name") = 0 .if name = value .if name != value 注意:内部函数$isdefed中的变量必须括在双引号内。 引号表明变量按字面解释而不是作为替代字符。 2018年11月20日 DSP原理及应用
36
5.1.3 汇编源程序中的符号 4.预先定义的符号常数 汇编器有若干预先定义符号,包括: ① 美元符号$,代表段程序指针SPC的当前值;
第5章 TMS320C54x汇编语言程序设计 5.1.3 汇编源程序中的符号 4.预先定义的符号常数 汇编器有若干预先定义符号,包括: ① 美元符号$,代表段程序指针SPC的当前值; ② 映像寄存器符号,包括AR0~AR7; ③ 映像寄存器由汇编器设置为符号。用于指定存储器模式。由-mk选项设置,默认值为0 。 2018年11月20日 DSP原理及应用
37
第5章 TMS320C54x汇编语言程序设计 5.1.3 汇编源程序中的符号 5. 替代符号 可将字符串值(变量)赋给符号,使符号名与该变量等效,成为字符串的别名,这种用来代表变量的符号称为替代符号。 当汇编器遇到替代符号时,将用字符串值替代符号。和符号常数不同,替代符号可以被重新定义。可在程序中的任何地方将变量赋给替代符号。 例如: .asg "high",AR ;寄存器AR2 2018年11月20日 DSP原理及应用
38
5.1.3 汇编源程序中的符号 5. 局部标号 局部标号是一种特殊的标号,使用的范围和影响是临时性的。 定义方法:
第5章 TMS320C54x汇编语言程序设计 5.1.3 汇编源程序中的符号 5. 局部标号 局部标号是一种特殊的标号,使用的范围和影响是临时性的。 定义方法: ① 用$n来定义。n是0~9的十进制数; ② 用NAME?定义。NAME是任何一个合法的符号名。汇编器用紧随其后一个唯一数值的句点代替问号。 注意:局部标号不能用伪指令来定义。 2018年11月20日 DSP原理及应用
39
局部标号可以被取消定义,并可以再次被定义或自动产生。
第5章 TMS320C54x汇编语言程序设计 5. 局部标号 局部标号可以被取消定义,并可以再次被定义或自动产生。 取消局部变量的方法: ① 使用.newblock伪指令; ② 使用伪指令.sect,.text或.data改变段 ; ③ 使用伪指令.include或.copy,进入include文件; ④ 达到include文件的结尾,离开include文件。 2018年11月20日 DSP原理及应用
40
5. 局部标号 第5章 TMS320C54x汇编语言程序设计 【例5.1.4】合法、非法局部标号$n举例。
第5章 TMS320C54x汇编语言程序设计 5. 局部标号 【例5.1.4】合法、非法局部标号$n举例。 假设符号ADDRA,ADDRB,ADDRC已经在前面作了定义。 Label1: LD ADDRA,A SUB ADDRB,A BC $1,ALT LD ADDRB,A B $2 $ LD ADDRA,A $ ADD ADDRC,A .newblock STL A,ADDRC $ NOP ;将ADDRA装入累加器A ;减去地址B ;如果小于0,分支转移到$1 ;否则将ADDRB装入累加器A ;分支转移到$2 ;$1:将ADDRA装入累加器A ;$2:加上ADDRC ;取消$1的定义,使它可被再次使用 ;若小于0,分支转移到$1 ;存ACC的低16位到ADDRC .newblock BC $1,ALT ;若小于0,分支转移到$1 STL A,ADDRC ;存ACC的低16位到ADDRC $ NOP .newblock ;错误:$1被多次定义 2018年11月20日 DSP原理及应用
41
【例5.1.5】name?形式的局部标号的使用方法。
第5章 TMS320C54x汇编语言程序设计 【例5.1.5】name?形式的局部标号的使用方法。 ;******************************************** ; 局部标号’mylab’的第1个定义 NOP mylab? NOP B mylab? ;******************************************* .copy“a.inc” ;包括文件中有‘mylab’第2次定义 ;从包括文件中退出复位后, ‘mylab’的第3个定义 2018年11月20日 DSP原理及应用
42
【例5.1.5】name?形式的局部标号的使用方法。
第5章 TMS320C54x汇编语言程序设计 【例5.1.5】name?形式的局部标号的使用方法。 ;******************************************** ; 在宏中‘mylab’的第4个定义, ; 为了避免冲突,宏使用不同的名称空间 maymac .macro mylab? NOP B mylab? .endm ;******************************************* mymac B mylab? ;宏调用。引用‘mylab'的第3个定义 ;既不被宏调用复位,也不与定义在 宏中的相同名冲突 2018年11月20日 DSP原理及应用
43
【例5.1.5】name?形式的局部标号的使用方法。
第5章 TMS320C54x汇编语言程序设计 【例5.1.5】name?形式的局部标号的使用方法。 ;******************************************** ; 改变段,允许‘mylab'的第5个定义 .sect “Secto_One” NOP mylab? .word 0 B mylab? 2018年11月20日 DSP原理及应用
44
【例5.1.5】name?形式的局部标号的使用方法。
第5章 TMS320C54x汇编语言程序设计 【例5.1.5】name?形式的局部标号的使用方法。 ;******************************************** ; .newblock伪指令,允许‘mylab'的第6个定义 .newblock mylab? .word 0 NOP B mylab? 2018年11月20日 DSP原理及应用
45
5.1.4 汇编源程序中的表达式 表达式可以是常数、符号,或者是由算术运算符分开的一系列常数和符号。
第5章 TMS320C54x汇编语言程序设计 5.1.4 汇编源程序中的表达式 表达式可以是常数、符号,或者是由算术运算符分开的一系列常数和符号。 有效表达式的值: -32 768~32 767 序号 符 号 运算操作 求值顺序 1 + - ~ ! 取正、取负、按位求补、逻辑负 从右至左 2 * / % 乘法、除法、求模 从左至右 3 + - 加法、减法 4 ^ 指数 从左到右 5 << >> 左移、右移 6 < <= 小于、小于等于 7 > >= 大于、大于等于 8 != = 不等于、等于 9 & 按位与运算 10 ∧ 按位异或运算 11 | 按位或运算 影响表达式的主要因素: ① 圆括号( )。圆括号内的表达式最先计算; ② 优先级。’C54x汇编器使用与C语言相似的优 先级,优先级高的先计算; 不能用大括号{ }或中括号[ ]代替圆括号( )。 ③ 从左到右运算。具有相同的优先级,按从左 到右的顺序计算。 2018年11月20日 DSP原理及应用
46
5.1.4 汇编源程序中的表达式 1. 运算符 ’C54x汇编器使用与C语言相似的优先级。
第5章 TMS320C54x汇编语言程序设计 5.1.4 汇编源程序中的表达式 1. 运算符 ’C54x汇编器使用与C语言相似的优先级。 取正(+)、负(-)和乘(*)比二进制形式有较高的优先级。 2. 条件表达式 汇编器支持关系运算符,可以用于任何表达式。 = 等于 = = 等于 != 不等于 > = 大于或等于 < = 小于或等于 > 大于 < 小于 2018年11月20日 DSP原理及应用
47
第5章 TMS320C54x汇编语言程序设计 5.1.4 汇编源程序中的表达式 3. 有效定义的表达式 某些汇编器要求有效定义的表达式作为操作数。操作数是汇编时间常数或链接时可重定位的符号。 有效定义的表达式是指表达式中的符号或汇编时间常数在表达式之前就已经被定义。 有效定义的表达式的计算必须是绝对的。 2018年11月20日 DSP原理及应用
48
3. 有效定义的表达式 第5章 TMS320C54x汇编语言程序设计 【例5.1.6】 有效定义的表达式。 .data
第5章 TMS320C54x汇编语言程序设计 3. 有效定义的表达式 【例5.1.6】 有效定义的表达式。 .data label1 .word 0 .word 1 .word 2 label2 .word 3 X set 50h goodsym1 .set l00h + X goodsym2 .set $ goodsym3 .set label1 goodsym4 .set label2-label1 ; 将16位值0,1,2放入标号为 label1的当前段连续字中 ; 将3放入标号为label2的字中 ; 定义X的值 ; 有效定义的表达式 ; 引用已定义的所有局部标号 ; 有效定义的表达式 2018年11月20日 DSP原理及应用
49
3. 有效定义的表达式 第5章 TMS320C54x汇编语言程序设计 【例5.1.7】无效定义的表达式。 .global Y
第5章 TMS320C54x汇编语言程序设计 3. 有效定义的表达式 【例5.1.7】无效定义的表达式。 .global Y badsym1 .set Y badsym2 .set h + Y badsym3 .set h + Z Z set h ; 定义Y为全局外部符号 ; Y在当前文件中未定义 ; 无效的表达式 ; 无效的表达式,Z还未定义 ; 定义Z,但应在表达式使用之前 2018年11月20日 DSP原理及应用
50
第5章 TMS320C54x汇编语言程序设计 5.1.4 汇编源程序中的表达式 4. 表达式上溢和下溢 汇编时执行了算术操作以后,汇编器检查上溢和下溢的条件。当出现上溢或下溢时,汇编器会发出一个值被截断了的警告。 汇编器不检查乘法的溢出状态。 2018年11月20日 DSP原理及应用
51
5.1.4 汇编源程序中的表达式 5. 可重新定位符号和合法表达式 对于绝对符号、可重新定位符号以及外部符号的有效操作,可参见下表。
第5章 TMS320C54x汇编语言程序设计 5.1.4 汇编源程序中的表达式 5. 可重新定位符号和合法表达式 对于绝对符号、可重新定位符号以及外部符号的有效操作,可参见下表。 带有绝对符号和可重新定位符号的表达式 如果A为… 并且B为… A+B为… A-B为… 绝对 可重新定位 外部 非法 2018年11月20日 DSP原理及应用
52
表达式不能包含可重新定位符号和外部符号的乘或除; 表达式中不能含有对其他的段为可重新定位的符号;
第5章 TMS320C54x汇编语言程序设计 5. 可重新定位符号和合法表达式 表达式不能包含可重新定位符号和外部符号的乘或除; 表达式中不能含有对其他的段为可重新定位的符号; 用.global伪指令定义为全局的符号和寄存器也可以用在表达式中。这些符号和寄存器被声明为外部符号; 可重新定位的寄存器也可以用在表达式中,这些寄存器的地址相对于定义它们的寄存器段是可重新定位的,除非将它们声明为外部符号。 2018年11月20日 DSP原理及应用
53
例如:在下面的程序中,使用了4个定义在相同段的符号。
第5章 TMS320C54x汇编语言程序设计 5. 可重新定位符号和合法表达式 例如:在下面的程序中,使用了4个定义在相同段的符号。 .global extern_1 intern_1: .word ‘’’D’ LAB1: .set 2 intern_2: .word 3 LD #LAB1+((5+4)*3),A LD #LAB1+3+(4*7),A .global extern_1 intern_1: .word ‘’’D’ LAB1: .set 2 intern_2: .word 3 LD #LAB1+((5+4)*3),A LD #LAB1+3+(4*7),A ;定义在外部的全局符号 ;定义在现行模块中,可重新定位 ;LAB1=2,绝对符号 ;定义在现行模块中,可重新定位 ;LAB1为绝对符号,A=29 ;LAB1为绝对符号,A=33 2018年11月20日 DSP原理及应用
54
单操作数运算仅能应用于绝对符号,不能应用于可重新定位符号。
第5章 TMS320C54x汇编语言程序设计 5. 可重新定位符号和合法表达式 所有合法表达式可以化简为两种形式: ① 可重新定位符号±绝对符号; ② 绝对符号。 单操作数运算仅能应用于绝对符号,不能应用于可重新定位符号。 表达式简化为仅含有可重新定位符号是非法的。 2018年11月20日 DSP原理及应用
55
5. 可重新定位符号和合法表达式 第5章 TMS320C54x汇编语言程序设计 【例5.1.8】 判断下列指令中表达式的合法性。
第5章 TMS320C54x汇编语言程序设计 5. 可重新定位符号和合法表达式 【例5.1.8】 判断下列指令中表达式的合法性。 LD extern_1-10,B LD 10-extern_1,B LD -(intern_1),B LD extern_1/10,B LD intern_1 + extern_1,B 可重新定位 合法 非法 不可将重新定位符号变负 非法 可重新定位符号不可变负 非法 可重新定位符号不可乘除 非法 可重新定位+可重新定位=非法 2018年11月20日 DSP原理及应用
56
5. 可重新定位符号和合法表达式 第5章 TMS320C54x汇编语言程序设计 【例5.1.9】 判断下列指令中表达式的合法性。 合法
第5章 TMS320C54x汇编语言程序设计 5. 可重新定位符号和合法表达式 【例5.1.9】 判断下列指令中表达式的合法性。 LD intern_1 - intern_2 + extern_1,B LD intern_1 + intern_2 + extern_1,B LD intern_1 + extern_1 - intern_2,B 合法 绝对符号+可重新定位 绝对符号 可重新定义-可重新定义=绝对符号 可重新定位 可重新定位 可重新定位 非法 可重新定义+可重新定义=非法 非法 可重新定义+可重新定义=非法 2018年11月20日 DSP原理及应用
57
第5章 TMS320C54x汇编语言程序设计 5.2 堆栈的使用方法 当程序调用中断服务程序或子程序时,需要将程序计数器PC的值和一些重要的寄存器值进行压栈保护,以便程序返回时能从间断处继续执行。 ’C54x提供一个用16位堆栈指针SP寻址的软件堆栈。 当向堆栈中压入数据时,堆栈是从高地址向低地址方向填入,堆栈指针SP先减1,然后将数据压入堆栈。 当从堆栈中弹出数据时。数据先从堆栈中弹出,然后堆栈指针SP加1。 2018年11月20日 DSP原理及应用
58
5.2 堆栈的使用方法 1. 堆栈的设置 若程序中要使用堆栈,必须先进行设置,如: 在数据RAM空间开辟一个堆栈区。
第5章 TMS320C54x汇编语言程序设计 5.2 堆栈的使用方法 1. 堆栈的设置 若程序中要使用堆栈,必须先进行设置,如: size .set stack .usect “STACK”,size STM # stack + size,SP 在RAM中定义一个STACK 的保留空间,共120个单元 保留区的高地址赋给SP, 作为堆栈的栈底 在数据RAM空间开辟一个堆栈区。 设置好堆栈后,就可以使用堆栈了,如: CALL pmad ;(SP)-1→SP,(PC)+2→TOS,pmad→PC RET ;(TOS)→PC,(SP)+1→SP 设置堆栈指针,# stack + size→SP。 2018年11月20日 DSP原理及应用
59
2. 堆栈区大小的确定 堆栈区的大小可以按照以下步骤来确定: 第5章 TMS320C54x汇编语言程序设计
第5章 TMS320C54x汇编语言程序设计 2. 堆栈区大小的确定 堆栈区的大小可以按照以下步骤来确定: ① 先开辟一个较大的堆栈区,用已知数充填,如: LD # -9224,B STM # length,AR1 MVMM SP,AR4 loop: STL B,*AR4- BANZ loop,*AR1- ;堆栈区要充填的数0DBF8h加载B ;设置循环次数 ;设置数据指针AR4,SP→AR4 ;循环,充填数据 数据RAM D … SP→ AR4→ DBF8 length DBF8 DBF8 … … DBF8 DBF8 DBF8 2018年11月20日 DSP原理及应用
60
2. 堆栈区大小的确定 堆栈区的大小可以按照以下步骤来确定: 第5章 TMS320C54x汇编语言程序设计
第5章 TMS320C54x汇编语言程序设计 2. 堆栈区大小的确定 堆栈区的大小可以按照以下步骤来确定: ① 先开辟一个较大的堆栈区,用已知数充填。 ② 运行程序,执行所有堆栈操作。 数据RAM AR4→ DBF8 … SP→ ③ 检查堆栈中的数值。 用过的堆栈区就是实际需要的堆栈空间。 SP→ 7AB3 … 用过的栈区 0013 6B14 2018年11月20日 DSP原理及应用
61
第5章 TMS320C54x汇编语言程序设计 5.3 控制程序 ’C54x具有丰富的程序控制指令,利用这些指令可以执行分支转移、子程序调用、子程序返回,条件执行以及循环等控制操作。 5.3.1 分支操作程序 程序控制中的分支操作包括: 分支转移程序 子程序调用 子程序返回 条件操作程序 2018年11月20日 DSP原理及应用
62
5.3.1 分支操作程序 1. 分支转移程序 通过传送控制到程序存储器的其他位置,分支转移会中断连续的指令流。
第5章 TMS320C54x汇编语言程序设计 5.3.1 分支操作程序 1. 分支转移程序 通过传送控制到程序存储器的其他位置,分支转移会中断连续的指令流。 分支转移指令可以改写PC值,使程序改变流向。其指令分为无条件分支转移和条件分支转移两类。两者都可以带延时操作和不带延时操作。 分支转移指令 分 类 指 令 说 明 无条件 分支转移 B[D] 用该指令指定的地址加载PC BACC[D] 用累加器的低16位指定的地址加载PC 条 件 BC[D] 若满足指令给定条件,用该指令指定的地址加载PC BANG[D] 若当前选择辅助寄存器不等于0,用该指令指定的地址加载PC 远 程 FB[D] 用该指令指定的地址加载PC和XPC FBACC[D] 用累加器的低23位指定的地址加载PC和XPC 2018年11月20日 DSP原理及应用
63
条件分支转移:要在满足用户一个或多个条件时才执行分支转移; 远程分支转移:允许分支转移到扩展存储器。
第5章 TMS320C54x汇编语言程序设计 1. 分支转移程序 无条件分支转移:无条件执行分支转移; 条件分支转移:要在满足用户一个或多个条件时才执行分支转移; 远程分支转移:允许分支转移到扩展存储器。 【例5.3.1】 分支转移举例。 STM #88H,AR0 LD #1000H,A zhong: SUB AR0,A BC zhong,AGT,AOV ;将操作数#88H装入AR0 ;将操作数#1000H装入ACC ;将A中的内容减去AR0中的 ;内容结果装入A ;若累加器A>0且溢出, ;则转至zhong,否则往下执行 2018年11月20日 DSP原理及应用
64
第5章 TMS320C54x汇编语言程序设计 5.3.1 分支操作程序 2. 子程序调用程序 与分支转移一样,通过传送控制到程序存储器的其他位置,子程序调用会中断连续的指令流。但是与分支转移不同的是,这种传送是临时的。 当函数的子程序被调用时,紧跟在调用后的下一条指令的地址保存在堆栈中。这个地址用于返回到调用程序并继续执行调用前的程序。 子程序调用操作分成两种形式:无条件调用和条件调用,两者都可以带延时操作和不带延时操作。 2018年11月20日 DSP原理及应用
65
2. 子程序调用程序 第5章 TMS320C54x汇编语言程序设计 子程序调用指令 分 类 指 令 说 明 无条件调用 CALL[D]
第5章 TMS320C54x汇编语言程序设计 2. 子程序调用程序 子程序调用指令 分 类 指 令 说 明 无条件调用 CALL[D] 将返回的地址压入堆栈,并用该指令指定的地址加载PC CALA[D] 将返回的地址压入堆栈,用累加器A或B指定的地址加载PC 条件调用 CC[D] 如果满足指令给定条件,将返回的地址压入堆栈,并用该 指令指定的地址加载PC 远程调用 FCALL [D] 将XPC和PC压入堆栈,并用该指令指定的地址加载PC和XPC FCALA [D] 将XPC和PC压入堆栈,用累加器的低23位指定的地址加载 PC和XPC 2018年11月20日 DSP原理及应用
66
条件调用和无条件调用操作相同,但是条件调用要在满足一个或多个条件时才执行调用。
第5章 TMS320C54x汇编语言程序设计 2. 子程序调用程序 无条件调用是指无条件执行调用。 条件调用和无条件调用操作相同,但是条件调用要在满足一个或多个条件时才执行调用。 远程调用允许对扩展存储器的子程序或函数进行调用。 2018年11月20日 DSP原理及应用
67
2. 子程序调用程序 第5章 TMS320C54x汇编语言程序设计 【例5.3.2】 子程序调用举例。 STM #123H,AR0
第5章 TMS320C54x汇编语言程序设计 2. 子程序调用程序 【例5.3.2】 子程序调用举例。 STM #123H,AR0 LD #456H,AR1 CALL new LD AR1,16,A new:MPY AR0,AR1,A RET ;将操作数#123H装入AR0 ;将操作数#456H装入AR1 ;调子程序new ;将AR1的内容左移16位后装入A ;AR0与AR1的内容相乘,结果放入A中 ;子程序返回 2018年11月20日 DSP原理及应用
68
5.3.1 分支操作程序 3. 子程序返回程序 子程序返回程序可以使程序重新在被中断的连续指令处继续执行。
第5章 TMS320C54x汇编语言程序设计 5.3.1 分支操作程序 3. 子程序返回程序 子程序返回程序可以使程序重新在被中断的连续指令处继续执行。 返回指令通过将弹出堆栈的值(包含将要执行的下一条指令的地址),送到程序计数器PC来实现返回功能。 ’C54x可以执行无条件返回和条件返回,并且它们都可以带延时或不带延时操作。 2018年11月20日 DSP原理及应用
69
3. 子程序返回程序 第5章 TMS320C54x汇编语言程序设计 子程序返回指令 分 类 指 令 说 明 无条件返回 RET[D]
第5章 TMS320C54x汇编语言程序设计 3. 子程序返回程序 子程序返回指令 分 类 指 令 说 明 无条件返回 RET[D] 将堆栈顶部的返回地址加载到PC。 RETE[D] 将堆栈顶部的返回地址加载到PC,并使能可屏蔽中断。 RETF[D] 将RTN寄存器中的返回地址加载到PC,并使能可屏蔽中断。 条件返回 RC[D] 如果满足指令给定条件,将堆栈顶部的返回地址加载到PC。 远程返回 FCALL [D] 将堆栈顶部的值弹出加载到XPC, 将堆栈中下一个值弹出加载到PC。 FCALA [D] 将堆栈中下一个值弹出加载到PC,并使能可屏蔽中断。 2018年11月20日 DSP原理及应用
70
条件返回可以给予被调用函数或中断服务程序(ISR)更多的返回方式,以便根据被处理的数据选择返回路径,通过使用条件返回指令来实现返回。
第5章 TMS320C54x汇编语言程序设计 3. 子程序程序 无条件返回是无条件执行返回操作。 条件返回可以给予被调用函数或中断服务程序(ISR)更多的返回方式,以便根据被处理的数据选择返回路径,通过使用条件返回指令来实现返回。 远程返回允许从扩展存储器的子程序或函数返回。 2018年11月20日 DSP原理及应用
71
第5章 TMS320C54x汇编语言程序设计 5.3.1 分支操作程序 4. 条件操作程序 ’C54x的一些指令只有在满足一个或是多个条件后才被执行,如条件分支转移、条件调用和条件返回等指令。 这些指令都用条件来限制分支转移、调用和返回操作。这些条件可用条件算符来表示。 2018年11月20日 DSP原理及应用
72
4. 条件操作程序 第5章 TMS320C54x汇编语言程序设计 条 件 算 符 操作符号 条 件 说 明 AEQ A=0 累加器A等于0
第5章 TMS320C54x汇编语言程序设计 4. 条件操作程序 条 件 算 符 操作符号 条 件 说 明 AEQ A=0 累加器A等于0 AOV AOV=1 累加器A溢出 BEQ B=0 累加器B等于0 BOV BOV=1 累加器B溢出 ANEQ A0 累加器A不等于0 ANOV AOV=0 累加器A不溢出 BNEQ B0 累加器B不等于0 BNOV BOV=0 累加器B不溢出 ALT A<0 累加器A小于0 C C=1 ALU进位位置1 BLT B<0 累加器B小于0 NC C=0 ALU进位位置0 ALEQ A0 累加器A小于等于0 TC TC=1 测试/控制标志位置1 BLEQ B0 累加器B小于等于0 NTC TC=0 测试/控制标志位置0 AGT A>0 累加器A大于0 BIO BIO低 BIO信号电平为低 BGT B>0 累加器B大于0 NBIO BIO高 BIO信号电平为高 AGEQ A0 累加器A大于等于0 UNC 无 无条件操作 BGEQ B0 累加器B大于等于0 2018年11月20日 DSP原理及应用
73
在条件操作时也可以要求有多个条件,只有所有条件满足时才被认为是满足条件。这种多个条件的组合就构成了指令的多重条件。
第5章 TMS320C54x汇编语言程序设计 4. 条件操作程序 在条件操作时也可以要求有多个条件,只有所有条件满足时才被认为是满足条件。这种多个条件的组合就构成了指令的多重条件。 多重条件算符 第1组 第2组 A类 B类 C类 EQ NEQ LEQ GEQ LT GT OV NOV TC NTC C NC BIO NBIO 2018年11月20日 DSP原理及应用
74
① 第1组:分为两类,最多可选择两个条件, 组内两类条件可以与/或构成多重条件,但不能用组内同类条件构成与/或多重条件。
第5章 TMS320C54x汇编语言程序设计 4. 条件操作程序 选用多重条件时应当注意以下几点: ① 第1组:分为两类,最多可选择两个条件, 组内两类条件可以与/或构成多重条件,但不能用组内同类条件构成与/或多重条件。 当选择两个条件时,累加器必须是同一个。 例如,可以同时选择AGT和AOV,但不能同时选择AGT和BOV。 ② 第2组:分为三类,最多可选三个条件,可以在每类中各选一个条件进行与/或构成多重条件,但不能在同类选两个以上条件。 ③ 组与组之间可用或构成多重条件。 例如,可以同时测试TC、C和BIO,但不能同时测试NTC、C和NC。 2018年11月20日 DSP原理及应用
75
4. 条件操作程序 BC sub,BLEQ ; 条件分支转移 第5章 TMS320C54x汇编语言程序设计 【例5.3.3】 条件操作程序。
第5章 TMS320C54x汇编语言程序设计 4. 条件操作程序 【例5.3.3】 条件操作程序。 BC sub,BLEQ ; 条件分支转移 若累加器B≤0,则转至sub, 否则,往下执行 CC start,AGEQ,AOV ; 条件调用 若累加器A≥0且溢出, 则调用start,否则往下执行 RC NTC ; 条件返回 若TC = 0,则返回,否则往下执行 2018年11月20日 DSP原理及应用
76
若需要多个条件相与时,用单条指令表示。 如:BC new, AGT, AOV 转移条件:AGT和AOV的与逻辑
第5章 TMS320C54x汇编语言程序设计 4. 条件操作程序 注意: 若需要多个条件相与时,用单条指令表示。 如:BC new, AGT, AOV 转移条件:AGT和AOV的与逻辑 若需要两个条件相或时,需用两条指令分别表示。 如:若累加器A大于0或溢出,则转移至sub 转移条件:AGT和AOV的或逻辑 BC sub, AGT BC sub, AOV 2018年11月20日 DSP原理及应用
77
5.3.1 分支操作程序 5. 比较转移程序 比较操作指令: 利用比较指令CMPR可实现比较转移操作。 CMPR 测试条件,辅助寄存器ARx
第5章 TMS320C54x汇编语言程序设计 5.3.1 分支操作程序 5. 比较转移程序 比较操作指令: CMPR 测试条件,辅助寄存器ARx 指令功能:辅助寄存器ARx与AR0进行比较, 若比较结果使所给定的测试条件成立,则TC位置1。 实现方法:① 通过CMPR的比较结果得TC值; ② 根据TC值,由条件转移指令实现分支转移。 利用比较指令CMPR可实现比较转移操作。 2018年11月20日 DSP原理及应用
78
5. 比较转移程序 例如:比较操作后条件分支转移 第5章 TMS320C54x汇编语言程序设计 STM #5,AR1 ; AR1=5
第5章 TMS320C54x汇编语言程序设计 5. 比较转移程序 例如:比较操作后条件分支转移 STM #5,AR ; AR1=5 STM #10,AR0 ; AR0=10 loop: … … *AR ; AR1=AR1+1 CMPR LT,AR ;若AR1-AR0<0,则TC=1,否则为0 BC loop, TC ;若AR1-AR0<0,则循环 若AR1=AR0,则顺序执行 2018年11月20日 DSP原理及应用
79
第5章 TMS320C54x汇编语言程序设计 5.3 控制程序 5.3.2 循环操作程序 在程序设计时,经常需要重复执行某一段程序。利用BANZ(当辅助寄存器不为0时转移)指令可实现循环计数和操作。 循环操作指令: BANZ 转移地址,辅助寄存器 指令功能:当辅助寄存器不为0时,则转至转移地址,否则顺序执行。 2018年11月20日 DSP原理及应用
80
5.3.2 循环操作程序 【例5.3.4】 用AR2作为循环计数器,由BANZ实现程序的循环控制。
第5章 TMS320C54x汇编语言程序设计 5.3.2 循环操作程序 【例5.3.4】 .bss x, ;给x保留10个空间 .bss y, ;给y保留1个空间 STM #x,AR1 ;设置数据段的首地址 STM #9,AR2 ;设置循环计数值 LD #0,A ;累加器清0 loop: ADD *AR1+,A ;累加运算,并修改地址 BANZ loop,*AR2- ;若计数值不为0,则循环,并计数值减1 若计数值为0,则结束循环 STL ;累加和存入y中 用AR2作为循环计数器,由BANZ实现程序的循环控制。 注意: BANZ loop, *AR2- ;先判断,再修正AR2=AR2-1 2018年11月20日 DSP原理及应用
81
5.4 算术运算程序 基本算术运算包括: 加减法和乘法运算 除法运算 长字和并行运算 第5章 TMS320C54x汇编语言程序设计
第5章 TMS320C54x汇编语言程序设计 5.4 算术运算程序 基本算术运算包括: 加减法和乘法运算 除法运算 长字和并行运算 2018年11月20日 DSP原理及应用
82
5.4 算术运算程序 5.4.1 加、减法和乘法运算 在数字信号处理中,加法和乘法运算是最常见的算术运算。
第5章 TMS320C54x汇编语言程序设计 5.4 算术运算程序 5.4.1 加、减法和乘法运算 在数字信号处理中,加法和乘法运算是最常见的算术运算。 【例5.4.1】 计算y = a x + b 程序: LD @a, T ;取a值,T=a MPY @x, B ;完成ax乘积,B=ax ADD @b, B ;完成ax+b运算,B=ax+b STL B, @y ;计算结果存入y中 2018年11月20日 DSP原理及应用
83
5.4.1 加、减法和乘法运算 【例5.4.2】 计算y = xl al + x2 a2 程序: LD @x1, T
第5章 TMS320C54x汇编语言程序设计 5.4.1 加、减法和乘法运算 【例5.4.2】 计算y = xl al + x2 a2 程序: LD @x1, T MPY @a1, B LD @x2, T MAC @a2, B STL B, @y STH B, @y+1 ;T=x1 ;B=x1a1 ;T=x2 ;乘法累加,B=x1a1+x2a2 ;计算结果的低字BL存入y中 ;计算结果的高字BH存入y+1中 2018年11月20日 DSP原理及应用
84
5.4.1 加、减法和乘法运算 【例5.4.3】计算 y = 程序: 第5章 TMS320C54x汇编语言程序设计
第5章 TMS320C54x汇编语言程序设计 5.4.1 加、减法和乘法运算 【例5.4.3】计算 y = 程序: ******************************************** * example.asm * .title “example.asm” .mmregs stack .usect “STACK”,10h .bss a,4 .bss x,4 .bss y,1 .def start .data ;为堆栈指定空间 ;为变量分配9个字的空间 2018年11月20日 DSP原理及应用
85
5.4.1 加、减法和乘法运算 【例5.4.3】计算 y = 程序: table: .word 1,2,3,4
第5章 TMS320C54x汇编语言程序设计 5.4.1 加、减法和乘法运算 【例5.4.3】计算 y = 程序: table: .word 1,2,3,4 .word 8,6,4,2 .text start: STM #0,SWWSR STM #STACK+10h,SP STM #a,AR1 RPT #7 MVPD table,*AR1+ CALL SUM end: B end ; 变量初始化 ; 插入0个等待状态 ; 设置堆栈指针 ; AR1指向a ; 移动8个数据 ; 从程序存储器到数据存储器 ; 调用SUM子程序 2018年11月20日 DSP原理及应用
86
5.4.1 加、减法和乘法运算 【例5.4.3】计算 y = 程序: SUM: STM #a, AR3
第5章 TMS320C54x汇编语言程序设计 5.4.1 加、减法和乘法运算 【例5.4.3】计算 y = 程序: SUM: STM #a, AR3 STM #x, AR4 RPTZ A, #3 MAC *AR3+,*AR4+,A STL y RET .end ;子程序执行 2018年11月20日 DSP原理及应用
87
5.4.1 加、减法和乘法运算 第5章 TMS320C54x汇编语言程序设计
第5章 TMS320C54x汇编语言程序设计 5.4.1 加、减法和乘法运算 【例5.4.4】求4项乘积aixi(i=1,2,3,4)中的最大值,并存放累加器A中。 程序: STM #a, AR1 STM #x, AR2 STM #2, AR3 LD *AR1+,T MPY *AR2+,A loop1: LD *AR1+,T MPY *AR2+,B MAX A BANZ loop1,*AR3- ;ai首地址a给AR1 ;xi首地址x给AR2 ;设置计数器AR3=2 ;取系数T=ai,并修改AR1 ;乘法运算A=aixi,并修改AR2 ;乘法运算B=aixi,并修改AR2 ;求A和B中的最大值 ;若AR3≠0,则循环,并修改AR3 若AR3=0,则不循环 2018年11月20日 DSP原理及应用
88
第5章 TMS320C54x汇编语言程序设计 5.4 算术运算程序 5.4.2 除法运算 在’C54x中没有除法器硬件,也没有专门的除法指令。但是,利用条件减法指令(SUBC)和重复指令(RPT)可实现两个无符号数的除法运算。 条件减法指令: SUBC Smem, src 功能:(src)-(Smem)<<15→ALU输出端 若ALU输出0,则(ALU输出)<<1+1→src 否则(src)<<1→src 重复指令: RPT #K 功能:RC=#K,重复执行下条指令K+1次。 2018年11月20日 DSP原理及应用
89
5.4.2 除法运算 1. |被除数|<|除数| 第5章 TMS320C54x汇编语言程序设计 num quot
第5章 TMS320C54x汇编语言程序设计 5.4.2 除法运算 AR1 数据存储器 1. |被除数|<|除数| num quot 例: 编写0.4÷(-0.8)的程序 num 0.4 分子 .bss num,1 den -0.8 分母 .bss den,1 quot 商 .bss quot,1 : .data : table .word 4*32768/10 ;0.4 .word -8*32768/10 ;-0.8 table 0.4 -0.8 .text start: STM #num,AR1 RPT #1 MVPD table,*AR1+ 2018年11月20日 DSP原理及应用
90
5.4.2 除法运算 1. |被除数|<|除数| 第5章 TMS320C54x汇编语言程序设计 quot 0.4 : -0.8 商
第5章 TMS320C54x汇编语言程序设计 5.4.2 除法运算 AR1 quot 0.4 : -0.8 商 数据存储器 num den quot table 1. |被除数|<|除数| 例: 编写0.4÷(-0.8)的程序 LD @den,16,A 0.8 ;分母送AH MPYA @num -0.5 ;商符号送B ABS A ;取分母绝对值 (num)×AH → B, 即分子×分母→B,取符号。 STH LD @num,16,A ;分子送AH ABS A ;取分子绝对值 RPT #14 SUBC @den,A ;15次减法循环 完成除法 XC 1,BLT ;若B<0,则变号 NEG A STL 2018年11月20日 DSP原理及应用 ;保存商
91
5.4.2 除法运算 1. |被除数|<|除数| 第5章 TMS320C54x汇编语言程序设计 例: 编写0.4÷(-0.8)的程序
第5章 TMS320C54x汇编语言程序设计 5.4.2 除法运算 1. |被除数|<|除数| 例: 编写0.4÷(-0.8)的程序 运行结果: 被除数 除 数 商(十六进制) 商(十进制) 4*32 768/100(0.4) -8*32 768/100(-0.8) 0xC000 -0.5 -128 1 024 0xF000 -0.125 2018年11月20日 DSP原理及应用
92
5.4.2 除法运算 2. |被除数|>|除数| 第5章 TMS320C54x汇编语言程序设计 例: 编写16384÷512的程序
第5章 TMS320C54x汇编语言程序设计 5.4.2 除法运算 2. |被除数|>|除数| 例: 编写16384÷512的程序 .bss num,1 .bss den,1 .bss quot,1 .data table .word .word 512 .text start: STM #num,AR1 RPT #1 MVPD table,*AR1+ ;16 384 ;512 ;传送2个数据至分子、分母单元 2018年11月20日 DSP原理及应用
93
5.4.2 除法运算 2. |被除数|>|除数| 第5章 TMS320C54x汇编语言程序设计 例: 编写16384÷512的程序
第5章 TMS320C54x汇编语言程序设计 5.4.2 除法运算 2. |被除数|>|除数| 例: 编写16384÷512的程序 LD @den,16,A MPYA @num ABS A STH LD @num,A RPT #15 SUBC @den,A XC 1,BLT NEG A STL ;将分母移到累加器A(31~16) ;(num)*A(32~16)→B,获取商的符号 ;分母取绝对值 ;分母绝对值存回原处 ;分子→A(32~16) ;分子取绝对值 ;16次减法重复操作,完成除法 ;如果B<0(商是负数),则需要变号 ;保存商 2018年11月20日 DSP原理及应用
94
5.4.2 除法运算 2. |被除数|>|除数| 第5章 TMS320C54x汇编语言程序设计 例: 编写16384÷512的程序
第5章 TMS320C54x汇编语言程序设计 5.4.2 除法运算 2. |被除数|>|除数| 例: 编写16384÷512的程序 运行结果: 被除数 除 数 商(十六进制) 商(十进制) 16 384 512 0xC020 32 66*32 768/100(0.66) -33*32 768/100(-0.33) 0xFFFE -2 注意:SUBC指令仅对无符号数进行操作,因此先对被除数和除数取绝对值,然后利用乘法操作获取商的符号,最后通过条件操作指令给商加上适当的符号。 2018年11月20日 DSP原理及应用
95
5.4 算术运算程序 5.4.3 长字运算和并行运算 1.长字运算 ’C54x可以利用32位长操作数进行长字运算。 长字指令:
第5章 TMS320C54x汇编语言程序设计 5.4 算术运算程序 5.4.3 长字运算和并行运算 1.长字运算 ’C54x可以利用32位长操作数进行长字运算。 长字指令: DLD Lmem,dst DST src,Lmem DADD Lmem,src[,dst] DSUB Lmem,src[,dst] DRSUB Lmem,src[,dst] ;dst=Lmem 单周期 ;Lmem=src 双周期 ;dst=src+Lmem 单周期 ;dst=src-Lmem 单周期 ;dst=Lmem-src 单周期 2018年11月20日 DSP原理及应用
96
指令中给出的地址为偶地址,则存储器低地址存放高16位操作数。
第5章 TMS320C54x汇编语言程序设计 1.长字运算 (1) 偶地址排列 长字的排列方式 偶地址排列 奇地址排列 指令中给出的地址为偶地址,则存储器低地址存放高16位操作数。 如: DLD *AR3+,A 执行前:A 00 0000 数据存储器 0100h 6 C A C 0101h B D 9 0 AR3 0100 高字 执行后:A 低字 00 0000 6CAC BD90 AR3 0100 0101 0102 2018年11月20日 DSP原理及应用
97
1.长字运算 (1) 偶地址排列 第5章 TMS320C54x汇编语言程序设计 【例5.4.5】 偶地址排列法举例。 .bss a,2
第5章 TMS320C54x汇编语言程序设计 1.长字运算 (1) 偶地址排列 【例5.4.5】 偶地址排列法举例。 .bss a,2 .bss y,2 .data table: .word 06CACH,0BD90H .text … STM #a,AR1 RPT #1 MVPD table,*AR1+ STM #a,AR3 DLD *AR3+,A 执行前: A = h AR3 = 0100h (0100h)= 6CACh(高字) (0101h)= BD90h(低字) 执行后: A = 00 6CAC BD90h AR3 = 0102h (0100h)= 6CACh (0101h)= BD90h 2018年11月20日 DSP原理及应用
98
指令中给出的地址为奇地址,则存储器低地址存放低16位操作数。
第5章 TMS320C54x汇编语言程序设计 1.长字运算 (2) 奇地址排列 指令中给出的地址为奇地址,则存储器低地址存放低16位操作数。 如: DLD *AR3+,A 执行前:A 00 0000 数据存储器 0100h 6 C A C 0101h B D 9 0 AR3 0101 低字 高字 执行后:A 00 0000 BD90 6CAC AR3 0101 0103 0102 2018年11月20日 DSP原理及应用
99
1.长字运算 (2) 奇地址排列 第5章 TMS320C54x汇编语言程序设计 【例5.4.6】 奇地址排列法举例。 .bss a,2
第5章 TMS320C54x汇编语言程序设计 1.长字运算 (2) 奇地址排列 【例5.4.6】 奇地址排列法举例。 .bss a,2 .bss y,2 .data table: .word 06CACH,0BD90H .text … STM #a,AR1 RPT #1 MVPD table,*AR1- STM #a,AR3 DLD *AR3+,A 执行前: A = h AR3 = 0101h (0100h)= 6CACh(低字) (0101h)= BD90h(高字) 执行后: A = 00 BD90 6CAC h AR3 = 0103h (0100h)= 6CACh (0101h)= BD90h 2018年11月20日 DSP原理及应用
100
…… 第5章 TMS320C54x汇编语言程序设计 【例5.4.7】计算Z32 = X32 + Y32。 X31~X16 0 0 0 0
第5章 TMS320C54x汇编语言程序设计 【例5.4.7】计算Z32 = X32 + Y32。 X31~X 标准运算 数据 存储器 xhi X31~X16 xlo X15~X0 …… yhi Y31~Y16 ylo Y15~Y0 zhi zlo X15~X0 LD @xhi,16,A LD @xhi,16,A ADD @yhi,16,A STH STL .bss xhi,1 .bss xlo,1 .bss yhi,1 .bss ylo,1 .bss zhi,1 .bss zlo,1 … X31~X16 X15~X0 + Y31~Y ADD @yhi,16,A Z31~Z16 X15~X0 Y15~Y0 Z31~Z16 Z15~Z0 STH Z31~Z16 AG AH AL STL Z15~Z0 X31~X16 Z31~Z16 X15~X0 Z15~Z0 X15~X0 6字,6T 2018年11月20日 DSP原理及应用
101
…… 第5章 TMS320C54x汇编语言程序设计 【例5.4.7】计算Z32 = X32 + Y32。 标准运算 长字运算 X31~X16
第5章 TMS320C54x汇编语言程序设计 【例5.4.7】计算Z32 = X32 + Y32。 标准运算 长字运算 数据 存储器 xhi X31~X16 X15~X0 …… yhi Y31~Y16 Y15~Y0 zhi LD @xhi,16,A ADD @yhi,16,A STH STL 6字,6T DLD @xhi,A DADD @yhi,A DST DLD @xhi,A .bss xhi,2,1,1 .bss yhi,2,1,1 .bss zhi,2,1,1 … DADD @yhi,A DST X31~X16 X15~X0 3字,3T + Y31~Y16 Y15~Y0 Z31~Z16 Z15~Z0 AG AH AL Z31~Z16 Z31~Z16 Z15~Z0 X31~X16 X15~X0 Z15~Z0 2018年11月20日 DSP原理及应用
102
5.4.3 长字运算和并行运算 2.并行运算 并行运算就是同时利用D总线和E总线,通过并行指令来实现数据的加载和算术运算。
第5章 TMS320C54x汇编语言程序设计 5.4.3 长字运算和并行运算 2.并行运算 并行运算就是同时利用D总线和E总线,通过并行指令来实现数据的加载和算术运算。 D总线用来执行加载或算术运算。 E总线用来存放先前的结果。 并行指令: 并行加载和乘法指令 并行加载和存储指令 并行存储和乘法指令 并行存储和加/减指令 2018年11月20日 DSP原理及应用
103
LD Xmem,dst1||MAC[R] Ymem,[,dst2] 功能:dst1=Xmem<<16;
第5章 TMS320C54x汇编语言程序设计 2.并行运算 并行加载和乘法指令: LD||MAC[R] LD||MAS[R] 例如: LD Xmem,dst1||MAC[R] Ymem,[,dst2] 功能:dst1=Xmem<<16; dst2=dst2+T*Ymem。 2018年11月20日 DSP原理及应用
104
ST src,Ymem ||LD Xmem,dst 功能:Ymem=src>>(16-ASM);
第5章 TMS320C54x汇编语言程序设计 2.并行运算 并行加载和存储指令: ST||LD 例如: ST src,Ymem ||LD Xmem,dst 功能:Ymem=src>>(16-ASM); dst=Xmem<<16。 2018年11月20日 DSP原理及应用
105
ST src,Ymem ||MAC[R] Xmem,dst 功能:Ymem=src>>(16-ASM);
第5章 TMS320C54x汇编语言程序设计 2.并行运算 并行存储和乘法指令: ST||MPY ST||MAC[R] ST||MAS[R] 例如: ST src,Ymem ||MAC[R] Xmem,dst 功能:Ymem=src>>(16-ASM); dst=dst+T*Xmem。 2018年11月20日 DSP原理及应用
106
ST src,Ymem ||ADD Xmem,dst 功能:Ymem=src>>(16-ASM); dst=dst+Xmem。
第5章 TMS320C54x汇编语言程序设计 2.并行运算 并行存储和加/减指令: ST||ADD ST||SUB 例如: ST src,Ymem ||ADD Xmem,dst 功能:Ymem=src>>(16-ASM); dst=dst+Xmem。 2018年11月20日 DSP原理及应用
107
2.并行运算 注 意 并行指令均为单字单周期指令; 并行指令先存储,后加载或算术运算; 并行指令的操作均在累加器的高位中
第5章 TMS320C54x汇编语言程序设计 2.并行运算 注 意 并行指令均为单字单周期指令; 并行指令先存储,后加载或算术运算; 并行指令的操作均在累加器的高位中 进行,并且大多数指令受ASM位的影响。 2018年11月20日 DSP原理及应用
108
【例5.4.8】编写计算z=x+y和f=e+d的程序
第5章 TMS320C54x汇编语言程序设计 2.并行运算 【例5.4.8】编写计算z=x+y和f=e+d的程序 · bss x,3 · bss x,3 · bss d,3 STM #x,AR5 STM #d,AR2 LD #0,ASM LD *AR5+,16,A ADD *AR5+,16,A ST A,*AR5 ||LD *AR2+,B ADD *AR2+,16,B STH B,AR2 · bss d,3 STM #x,AR5 x y z …… d e f STM #d,AR2 LD #0,ASM LD *AR5+,16,A ADD *AR5+,16,A ST A,*AR5 ||LD *AR2+,B ADD *AR2+,16,B STH B,AR2 2018年11月20日 DSP原理及应用
109
5.4.3 长字运算和并行运算 3. 64位加法和减法运算 可利用长字指令可完成64位数的加减运算。
第5章 TMS320C54x汇编语言程序设计 5.4.3 长字运算和并行运算 3. 64位加法和减法运算 可利用长字指令可完成64位数的加减运算。 【例5.4.9】编写完成Z64 = W64+X64-Y64的程序。 运算过程: W64: w3 w2 w1 w0 S64=s3s2s1s0 X64: x3 x2 x1 x0 + C s1s0=w1w0+x1x0 S64: s3 s2 s1 s0 s3s2=w3w2+x3x2+C Y64: y3 y2 y1 y0 - Z64=z3z2z1z0 O z1z0=s1s0-y1y0 Z64: z3 z2 z1 z0 z3z2=s3s2-y3y2-O 2018年11月20日 DSP原理及应用
110
3.64位加法和减法运算 DLD @w1,A 第5章 TMS320C54x汇编语言程序设计
第5章 TMS320C54x汇编语言程序设计 3.64位加法和减法运算 【例5.4.9】编写完成Z64 = W64+X64-Y64的程序。 程序: DLD @w1,A DADD @x1,A DLD @w3,B ADDC @x2,B ADD @x3,16,B DSUB @y1,A DST SUBB @y2,B SUB @y3,16,B DST ;A=w1w0 ;A=s1s0,产生C ;B=w3w2 ;B=w3w2+x2+C ;B=s3s2=w3w2+x3x2+C ;A=s1s0-y1y0,产生O ;z1z0=s1s0-y1y0 ;B=s3s2-y2-O ;B=z3z2 ;z3z2=s3s2-y3y2-O 2018年11月20日 DSP原理及应用
111
4. 32位乘法运算 乘法指令: x1 x0 运算过程: 乘法运算: y1 y0 MPYU Smem,dst w0=x0y0L U×U
第5章 TMS320C54x汇编语言程序设计 4. 32位乘法运算 【例5.4.10】编写完成W64 = X32×Y32的程序。 乘法指令: x1 x0 运算过程: 乘法运算: y1 y0 × MPYU Smem,dst w0=x0y0L U×U x0×y0 U×U ;dst=U(T)×U(Smem) x1×y0 S×U S×U w1=x0y0H+x1y0L+y1x0L MACSU Xmem,Ymem,src y1×x0 S×U S×S y1×x1 S×S ;src=U(Xmem)×S(Ymem)+src w2=x1y0H+y1x0H+y1x1L w3 w2 w1 w0 MAC Xmem,Ymem,src w3=y1x1H S U U U ;src=S(Xmem)×S(Ymem)+src 2018年11月20日 DSP原理及应用
112
STM #x0,AR2 第5章 TMS320C54x汇编语言程序设计 【例5.4.10】编写完成W64 = X32×Y32的程序。
第5章 TMS320C54x汇编语言程序设计 【例5.4.10】编写完成W64 = X32×Y32的程序。 STM #x0,AR2 STM #y0,AR3 LD *AR2,T MPYU *AR3+,A STL LD A,-16,A MACSU *AR2+,*AR3-,A MACSU *AR3+,*AR2,A STL MAC *AR2,*AR3,A STL STH ;AR2←x0 RAM x0 x1 y0 y1 w0 w1 w2 w3 ;AR3←y0 ;T=x0 AR2→ ;A=u(x0)×u(y0) AR2→ ;(w0)←A AR3→ AR3→ ;A=x0y0H AR3→ AR3→ ;A=y1x0+x0y0H ;A=x1y0+y1x0+x0y0H ;(w1)←A ;A=y1x0H+x1y0H ;A=y1x1+y1x0H+x1y0H ;(w2)←A ;(w3)←A 2018年11月20日 DSP原理及应用
113
5.5 重复操作程序 ’C54x的重复操作是使CPU重复执行一条指令或一段指令。可以分为单指令重复和块程序重复。 实现重复操作的指令:
第5章 TMS320C54x汇编语言程序设计 5.5 重复操作程序 ’C54x的重复操作是使CPU重复执行一条指令或一段指令。可以分为单指令重复和块程序重复。 实现重复操作的指令: RPT —— 重复下条指令; RPTZ—— 累加器清0,并重复下条指令; RPTB—— 块重复指令。 使用RPT、RPTZ能重复下一条指令;而RPTB用于重复代码块若干次。利用重复指令可实现比BANZ指令更快的循环程序。 2018年11月20日 DSP原理及应用
114
第5章 TMS320C54x汇编语言程序设计 5.5 重复操作程序 5.5.1 单指令重复操作 利用RPT和RPTZ可重复执行紧随其后的一条指令。重复次数由该指令的操作数决定,并且等于操作数加1。 若要重复执行N+1次,则重复指令中应规定重复次数为N。该数值保存在16位重复计数器RC中,可通过RPT或RPTZ指令加载。一条指令的最大重复次数为65536。 由于要重复的指令只需要取指一次,对于多周期指令,采用重复操作后,可使多周期指令变成单周期指令,提高运行速度。 2018年11月20日 DSP原理及应用
115
5.5.1 单指令重复操作 第5章 TMS320C54x汇编语言程序设计
第5章 TMS320C54x汇编语言程序设计 5.5.1 单指令重复操作 【例5.5.1】对数组进行初始化,使x[8]={0,0,0,0,0,0,0,0}。 .bss x, 8 STM #x, AR1 LD #0, A RPT #7 STL A,*AR1+ .bss x, 8 STM #x, AR1 RPTZ A, #7 STL A, *AR1+ 注意: ① 对x[8]中的8个元素置0,重复次数为7,即执行1次STL A,AR1+指令后,再重复执行7次; ② RPTZ指令设定重复次数后,再对累加器清零。 2018年11月20日 DSP原理及应用
116
5.5.1 单指令重复操作 在执行重复操作期间,除了RS外所有中断被禁止,直到重复循环完成。
第5章 TMS320C54x汇编语言程序设计 5.5.1 单指令重复操作 在执行重复操作期间,除了RS外所有中断被禁止,直到重复循环完成。 ’C54x能响应HOLD信号,若HM = 0,CPU继续执行重复操作,若HM = 1,则暂停重复操作。 2018年11月20日 DSP原理及应用
117
5.5 重复操作程序 5.5.2 块程序重复操作 对于整个程序块需要重复操作时,可采用程序块重复操作。
第5章 TMS320C54x汇编语言程序设计 5.5 重复操作程序 5.5.2 块程序重复操作 对于整个程序块需要重复操作时,可采用程序块重复操作。 用于块程序重复操作指令为RPTB和RPTBD。程序块的长度由块程序重复指令RPTB的操作数来确定,而重复次数由块重复计数器BRC来决定。 通常RPTB的操作数为程序块的结束地址,而重复次数可用STM指令对BRC进行设定。 2018年11月20日 DSP原理及应用
118
5.5.2 块程序重复操作 块重复操作的特点: ① 程序块的起始地址RSA是RPTB指令的下一行;
第5章 TMS320C54x汇编语言程序设计 5.5.2 块程序重复操作 块重复操作的特点: ① 程序块的起始地址RSA是RPTB指令的下一行; ② 块结束地址REA由RPTB指令的操作数规定; ③ 对程序块进行重复操作时,不论程序块多长,重复次数多大,所用的机器周期为0; ④ 与单指令重复操作不同,块重复操作可以响应中断。 2018年11月20日 DSP原理及应用
119
第5章 TMS320C54x汇编语言程序设计 5.5.2 块程序重复操作 块程序重复指令的特点是对任意长程序段的循环开销为0。循环由ST1状态寄存器的块重复标志位(BRAF)和紧跟在ST1状态寄存器后面的存储器映像寄存器控制。 循环过程: ① 将块重复标志位BRAF置1,激活块程序重复循环; ② 将一个取值在0~65535范围里的循环次数N加载到BRC; ③ 块重复指令把块重复的起始地址放在块重复开始地址寄存器RSA中; ④ 块重复指令把块重复的末地址放在块重复结束地址寄存器REA中。 2018年11月20日 DSP原理及应用
120
5.5.2 块程序重复操作 【例5.5.2】对数组x[8]中的每一元素加1。 注 意 第5章 TMS320C54x汇编语言程序设计
第5章 TMS320C54x汇编语言程序设计 5.5.2 块程序重复操作 【例5.5.2】对数组x[8]中的每一元素加1。 .bss x, 8 begin: LD #1,16,B STM #7,BRC STM #x,AR4 RPTB next-1 ADD *AR4,16,B,A STH A,*AR4+ next: LD #0,B … ;设置数组空间 ;立即数1送入BH ;设置重复次数,BRC=7,循环8次 ;数组首地址x送入AR4 ;设置循环结束地址 ;数组数据左移16位与BH相加 ;存入数组结果,并修改地址 ;B清0 注 意 ① 块结束地址REA通常取程序块最后一条指令的下一条指令地址-1; ② 重复次数为7次 ③ RPTB指令可以响应中断。 2018年11月20日 DSP原理及应用
121
5.5 重复操作程序 5.5.3 循环嵌套 循环嵌套是程序编制中常用的技巧,可以用来简化较为复杂的程序。
第5章 TMS320C54x汇编语言程序设计 5.5 重复操作程序 5.5.3 循环嵌套 循环嵌套是程序编制中常用的技巧,可以用来简化较为复杂的程序。 块程序重复指令RPTB所用的寄存器有: BRC——重复计数器; RSA——起始地址寄存器; REA——结束地址寄存器。 RPT重复操作可以和块重复操作RPTB以及循环操作BANZ进行嵌套,实现多重嵌套。 2018年11月20日 DSP原理及应用
122
第5章 TMS320C54x汇编语言程序设计 【例5.5.2】三重循环嵌套程序。 STM #L-1,AR7 ;2T 1st: 外部
第5章 TMS320C54x汇编语言程序设计 【例5.5.2】三重循环嵌套程序。 STM #L-1,AR7 ;2T 1st: 外部 STM #M-1,BRC ;2T RPTB 2nd ;4T 中间 RPT #N ;1T 内部 2nd: 外部 外部 BANZ 1st,*AR7- ;4T 外层 中层 内层 2018年11月20日 DSP原理及应用
123
5.5.3 循环嵌套 三重循环嵌套结构: 第5章 TMS320C54x汇编语言程序设计 内层 中层 —— 执行N次 —— RPT
第5章 TMS320C54x汇编语言程序设计 5.5.3 循环嵌套 三重循环嵌套结构: 内层 中层 外层 —— 执行N次 —— 执行M次 —— 执行L次 —— RPT —— RPTB —— BANZ 循环嵌套的开销 循环 操 作 指令 重复次数 机器周期 内层 单程序重复操作 RPT N 1 中层 块程序重复操作 RPTB M 4+2 外层 循环操作 BANZ L 4N+2 2018年11月20日 DSP原理及应用
124
第5章 TMS320C54x汇编语言程序设计 5.6 数据块传送程序 可以用于数据传送的指令有10条,分别可以实现数据存储器之间、数据存储器和MMR之间、程序存储器和数据存储器之间、程序存储器和数据存储器之间的数据块传送等。 这些指令传送速度比加载和存储指令快,传送数据不需要通过累加器,可以寻址程序存储器,与RPT指令相结合可以实现数据块传送。 2018年11月20日 DSP原理及应用
125
5.6 数据块传送程序 1. 数据传送指令 用于数据传送指令可分为四类: (1) 数据存储器之间的数据传送 MVDK Smem,dmad
第5章 TMS320C54x汇编语言程序设计 5.6 数据块传送程序 1. 数据传送指令 用于数据传送指令可分为四类: (1) 数据存储器之间的数据传送 MVDK Smem,dmad MVKD dmad,Smem MVDD Xmem,Ymem 2字 2周期 1字 1周期 2018年11月20日 DSP原理及应用
126
(3) 程序存储器和数据存储器之间的数据传送
第5章 TMS320C54x汇编语言程序设计 1. 数据传送指令 (2) 数据存储器与MMR之间的数据传送 MVDM dmad,MMR MVMD MMR,dmad MVMM MMRx,MMRy 2字 2周期 1字 2周期 (3) 程序存储器和数据存储器之间的数据传送 MVPD pmad,Smem MVDP Smem,pmad READA Smem WRITA Smem 2字 3周期 2字 4周期 1字 5周期 2018年11月20日 DSP原理及应用
127
1. 数据传送指令 (4) 从PA口读/写数据 PORTR PA,Smem 2字 2周期 PORTW Smem,PA 数据传送指令的特点
第5章 TMS320C54x汇编语言程序设计 1. 数据传送指令 (4) 从PA口读/写数据 PORTR PA,Smem PORTW Smem,PA 2字 2周期 数据传送指令的特点 ① 传送速度比加载和存储指令要快; ② 数据传送不通过累加器; ③ 可寻址程序存储器; ④ 与RPT结合,可实现数据块传送。 2018年11月20日 DSP原理及应用
128
重复执行MVPD指令,可以实现程序存储器至数据存储器的数据传送,在系统初始化过程中十分有用。
第5章 TMS320C54x汇编语言程序设计 2. 程序存储器至数据存储器的数据传送 重复执行MVPD指令,可以实现程序存储器至数据存储器的数据传送,在系统初始化过程中十分有用。 【例5.6.1】数组x[8]={0,1,2,3,4,5,6,7}初始化。 . bss x,8 . data TBL: . word 0,1,2,3,4,5,6,7 . text START:STM #x,AR5 RPT #7 MVPD TBL,*AR5+ …… 2018年11月20日 DSP原理及应用
129
在数字信号处理时,经常需要将数据存储器中的一批数据传送到数据存储器的另一个地址空间。
第5章 TMS320C54x汇编语言程序设计 3. 数据存储器之间的数据传送 在数字信号处理时,经常需要将数据存储器中的一批数据传送到数据存储器的另一个地址空间。 【例5.6.2】进行N点FFT运算时,为节约存储空间要用到原位计算,将数组X[16]赋到数组Y[16],计算一个蝶形后,所得输出数据可以立即存入原输入数据所占用的存储单元。 .bss x,16 .bss y,16 … STM #x,AR2 STM #y,AR3 RPT #15 MVDD AR2+,*AR3+ 2018年11月20日 DSP原理及应用
130
4. 数据存储器和MMR之间的数据传送 第5章 TMS320C54x汇编语言程序设计 【例5.6.4】 双操作数方式实现IIR高通滤波器:
第5章 TMS320C54x汇编语言程序设计 4. 数据存储器和MMR之间的数据传送 【例5.6.4】 双操作数方式实现IIR高通滤波器: table: .word 0 .word 0 .word 653*32768/10000 .word *32768/10000 .word *32768/10000 .word *32768/10000 .text start: SSBX FRCT STM #x2, AR1 RPT #1 MVPD #table,*AR1+ ;x(n-2) ;x(n-1) ;x(n-0) ;B2 ;B0 ;A2 ;A1/2 2018年11月20日 DSP原理及应用
131
4. 数据存储器和MMR之间的数据传送 第5章 TMS320C54x汇编语言程序设计 【例5.6.4】 双操作数方式实现IIR高通滤波器:
第5章 TMS320C54x汇编语言程序设计 4. 数据存储器和MMR之间的数据传送 【例5.6.4】 双操作数方式实现IIR高通滤波器: STM #COEF,AR1 RPT #4 MVPD #table+2,*AR1+ STM #x2,AR3 STM #COEF+4,AR4 MVMM AR4,AR1 STM #3, BK STM #-1,AR0 IIR1: PORTR PA1,*AR3 LD *AR3+0%,16,A MAC *AR3,*AR4,A MAC *AR3+0%,*AR4-,A ;AR4指向A1 ;保存地置值在AR1中 ;设置循环缓冲区长度 ;设置变址寻址步长 ;从PA1口输入数据x(n) ;计算反馈通道。A=x(n) ;A = x(n)+A1*x1 ;A = x(n)+A1*x1+A1*x1 2018年11月20日 DSP原理及应用
132
4. 数据存储器和MMR之间的数据传送 第5章 TMS320C54x汇编语言程序设计 【例5.6.4】 双操作数方式实现IIR高通滤波器:
第5章 TMS320C54x汇编语言程序设计 4. 数据存储器和MMR之间的数据传送 【例5.6.4】 双操作数方式实现IIR高通滤波器: MAC *AR3+0%,*AR4-,A STH A,*AR3 MPY *AR3+0%,*AR4-,A MAC *AR3,*AR4-,A MVMM AR1,AR4 BD IIR1 PORTW *AR3,PA0 .end ;A=x(n)+2*A1*x1+A2*x2=x0 ;保存x0 ;计算前向通道。A=B0*x0 ;A=B0*x0+B1*x1 ;A=B0*x0+B1*x1+B2*x2=y(n) ;保存y(n) ;AR4重新指向A1 ;循环 ;向PA0口输出数据 2018年11月20日 DSP原理及应用
133
第5章 TMS320C54x汇编语言程序设计 5.7 小数运算程序 在定点DSP芯片中,采用定点数进行数值运算时,若操作数采用整型数,则DSP芯片给定的字长(一般16位)决定了整型数的最大范围。 通常,定点DSP采用小数乘法。其原因: ① 乘法器为16位,对于大于16位的数据难以实现乘法递推,且乘积占用存储资源大; ② 小数乘法时,既可以存储32位乘积,也可以存储高16位乘积,可用较少的资源保存结果; ③ 小数乘法便于乘法递推。 2018年11月20日 DSP原理及应用
134
5.7 小数运算程序 1. 数的定标 采用小数运算时,设定小数点在16位中的位置称为定标。
第5章 TMS320C54x汇编语言程序设计 5.7 小数运算程序 1. 数的定标 采用小数运算时,设定小数点在16位中的位置称为定标。 小数点在16位数中的位置不同,可以表示不同大小和不同精度的小数。 数的定标通常有Q表示法,如Q0,Q1,…,Q15。Q越大,可以表示的数的范围越小,但精度越高。 在具体的定点程序中,必须根据具体情况适当选择合适的定标。 2018年11月20日 DSP原理及应用
135
第5章 TMS320C54x汇编语言程序设计 5.7 小数运算程序 2. 小数的表示方法 ’C54x采用基于2的补码小数表示形式。每个16位数用1个符号位(最高位)、i个整数位、15-i个小数位来表示。 采用2的补码小数(Q15格式),其位权值为: MSB …… …… LSB …… 2-15 例如: —— = 2.625 2018年11月20日 DSP原理及应用
136
将十进制小数乘以32 768,并将整数乘积转换成16进制数。
第5章 TMS320C54x汇编语言程序设计 2. 小数的表示方法 2的补码小数表示方法: 将十进制小数乘以32 768,并将整数乘积转换成16进制数。 正数:乘以32 768,整数转换成16进制数; 负数:其绝对值乘以32 768,整数取反加1。 2018年11月20日 DSP原理及应用
137
2. 小数的表示方法 1×32 768=7FFFH 如: 1 —— 7FFFH 0.5×32 768=4000H 0.5 —— 4000H
第5章 TMS320C54x汇编语言程序设计 2. 小数的表示方法 1×32 768=7FFFH 0.5×32 768=4000H 0.25×32 768=2000H 0×32 768=0000H (0.25×32 768)补=E000H (0.5×32 768)补=C000H (1×32 768)补=8000H 如: 1 —— 7FFFH 0.5 —— 4000H 0.25 —— 2000H 0 —— 0000H -0.25 —— E000H -0.5 —— C000H -1 —— 8000H 注意:汇编时,不能直接写成十进制小数。 如:0.907 —— .word *907/1000 2018年11月20日 DSP原理及应用
138
5.7 小数运算程序 3. 小数乘法与冗余符号位 小数乘法实例: 0.625(-0.125) = -0.078125
第5章 TMS320C54x汇编语言程序设计 5.7 小数运算程序 3. 小数乘法与冗余符号位 小数乘法实例: 0.625(-0.125) = (0.625) × (-0.125) (-0101) ( ) 2018年11月20日 DSP原理及应用
139
出错原因:两带符号数相乘,其结果带有2个符号位。
第5章 TMS320C54x汇编语言程序设计 3. 小数乘法与冗余符号位 乘 积: = 位二进制 扩展8位后,乘积: = 出错原因:两带符号数相乘,其结果带有2个符号位。 解决办法:运算结果左移一位,消去多余符号位。可通过对FRCT位置1,乘法器自动将乘积结果左移一位。 S x x x (Q3格式) 如: 左移1位: 结果: × S y y y (Q3格式) S S z z z z z z (Q6格式) 2018年11月20日 DSP原理及应用
140
在小数乘法编程时,应事先设置FRCT位, 如: SSBX FRCT MPY *AR2,*AR3,A STH A,@Z
第5章 TMS320C54x汇编语言程序设计 3. 小数乘法与冗余符号位 在小数乘法编程时,应事先设置FRCT位, 如: SSBX FRCT MPY *AR2,*AR3,A STH 完成了Q15*Q15=Q15的小数乘法。 2018年11月20日 DSP原理及应用
141
第5章 TMS320C54x汇编语言程序设计 【例5.7.1】 编制计算 的程序 a1=0.3 a2=0.2 a3=-0.4 a4=0.1
第5章 TMS320C54x汇编语言程序设计 【例5.7.1】 编制计算 的程序 a1=0.3 a2=0.2 a3=-0.4 a4=0.1 x1=0.6 x2=0.5 x3=-0.1 x4=-0.2 .bss a,4 .bss x,4 .bss y,1 .data table: .word 3*32768/10 .word 2*32768/10 .word -4*32768/10 .word 1*32768/10 .word 6*32768/10 .word 5*32768/10 .word -1*32768/10 .word -2*32768/10 a x y 2018年11月20日 DSP原理及应用
142
第5章 TMS320C54x汇编语言程序设计 【例5.7.1】 编制计算 的程序 a1=0.3 a2=0.2 a3=-0.4 a4=0.1
第5章 TMS320C54x汇编语言程序设计 【例5.7.1】 编制计算 的程序 a1=0.3 a2=0.2 a3=-0.4 a4=0.1 x1=0.6 x2=0.5 x3=-0.1 x4=-0.2 .text start: SSBX FRCT STM #x,AR1 RPT #7 MVPD table,*AR1+ a 0.3 0.2 -0.4 0.1 0.6 0.5 -0.1 -0.2 STM #x,AR2 STM #a,AR3 RPTZ A,#3 MAC *AR2+,*AR3+,A STH x y done: B done 0.3 2018年11月20日 DSP原理及应用
143
第5章 TMS320C54x汇编语言程序设计 5.8 浮点运算程序 在数字信号处理过程中,定点运算是将数据的整数和小数部分分开,小数点在一个固定位置,其优点是硬件实现比较容易,但动态范围受到限制。 为了扩大数据的范围和精度,需要采用浮点运算。虽然’C54x是个定点DSP器件,但它支持浮点运算。 在’C54x上实现浮点运算,操作数必须变成定点数,然后再返回浮点数。通过归格化输入数据,可以将定点值变换为浮点值。 2018年11月20日 DSP原理及应用
144
5.8 浮点运算程序 1. 浮点数的表示方法 浮点数是由尾数和指数两部分组成,它与定点数的关系: 尾数:可正可负,用补码表示。
第5章 TMS320C54x汇编语言程序设计 5.8 浮点运算程序 1. 浮点数的表示方法 浮点数是由尾数和指数两部分组成,它与定点数的关系: 定点数 = 尾数2-指数 尾数:可正可负,用补码表示。 指数:可正可负,用补码表示,其范围:-8~31。 如:定点数:0x2000 = 0.25 = 0.52-1 尾数= 0.5 = 0x4000,指数=1。 2018年11月20日 DSP原理及应用
145
5.8 浮点运算程序 2. 定点数转换成浮点数 ① EXP A 提取指数指令 ’C54x通过三条指令可将定点数转换成浮点数。
第5章 TMS320C54x汇编语言程序设计 5.8 浮点运算程序 2. 定点数转换成浮点数 ① EXP A 提取指数指令 ’C54x通过三条指令可将定点数转换成浮点数。 功能:若A=0,则T=0; 若A≠0,则T=(A的多余符号位数-8)。 即提取指数,A的内容不变,指数=多余符号位数-8。 又如:执行EXP B前,B= T=0007 B = …… 例如:执行EXP A前,A=FF FFFF FFCB T=0000 33 A=FF FFFF FFCB= …… 多余符号位数:4 指数:4-8=-4 T=FFFC 执行后,B= T=FFFC (-4) 多余符号位数:33 指数:33-8=25 T=0019 执行后, A=FF FFFF FFCB T=0019 (25) 2018年11月20日 DSP原理及应用
146
功能:将保存在T中的指数存放在数据存储器EXP单元中。
第5章 TMS320C54x汇编语言程序设计 2. 定点数转换成浮点数 ② ST T,EXPONENT 紧随EXP指令之后。 功能:将保存在T中的指数存放在数据存储器EXP单元中。 ③ NORM A 根据T对累加器进行格式化处理指令。 功能:根据T的内容,对累加器A进行移位。 T>0,A左移T位;T<0,A右移T位。 即A<<TSA。 2018年11月20日 DSP原理及应用
147
2. 定点数转换成浮点数 例如:NORM A 又如: NORM B,A 第5章 TMS320C54x汇编语言程序设计
第5章 TMS320C54x汇编语言程序设计 2. 定点数转换成浮点数 例如:NORM A 执行前: A=FF FFFF F001 T=0013 (19) A=1111…… 28 左移19位 …… 执行后: A=FF T=0013 (19) 又如: NORM B,A 执行前: A=FF FFFF F001 B=21 0A0A 0A0A T=FFF9(-7) B右移7位送入A A= 执行后: A= B=21 0A0A 0A0A T=FFF9(-7) 2018年11月20日 DSP原理及应用
148
5.8 浮点运算程序 3.浮点数转换成定点数 定点数→浮点数: 根据定点数,求其尾数和指数,然后将尾数按指数T进行移位。
第5章 TMS320C54x汇编语言程序设计 5.8 浮点运算程序 3.浮点数转换成定点数 定点数→浮点数: 根据定点数,求其尾数和指数,然后将尾数按指数T进行移位。 当T>0,A左移T位;当T<0,A右移T位。 浮点数→定点数: 根据指数T,将尾数进行移位。 当T>0,A右移T位;当T<0,A左移T位。 2018年11月20日 DSP原理及应用
149
5.8 浮点运算程序 4.浮点乘法运算实例 实现浮点乘法运算时,首先将定点数规格化成浮点数;然后完成浮点乘法运算;最后将浮点数转换成定点数。
第5章 TMS320C54x汇编语言程序设计 5.8 浮点运算程序 4.浮点乘法运算实例 实现浮点乘法运算时,首先将定点数规格化成浮点数;然后完成浮点乘法运算;最后将浮点数转换成定点数。 【例5.8.1】编写浮点乘法程序,完成a1×a2=0.4×(-0.9) 程序中保留10个数据存储单元: a1(被乘数) a2(乘数) b1(被乘数的指数) c1(被乘数的尾数) b2(乘数的指数) c2(乘数的尾数) ep(乘积的指数) mp(乘积的尾数) prod(乘积) temp(暂存单元) 2018年11月20日 DSP原理及应用
150
4.浮点乘法运算实例 第5章 TMS320C54x汇编语言程序设计 程序清单: .title “float.asm” .def start
第5章 TMS320C54x汇编语言程序设计 4.浮点乘法运算实例 程序清单: .title “float.asm” .def start STACK:.usect “STACK”,100 .title “float.asm” .def start STACK:.usect “STACK”,100 .bss a1,1 .bss a2,1 .bss b1,1 .bss c1,1 .bss b2,1 .bss c2,1 .bss ep,1 .bss mp,1 .bss prod,1 .bss temp,1 数据存储器 a1 被乘数 .bss a1,1 a2 乘数 .bss a2,1 b1 被乘数的指数 .bss b1,1 c1 被乘数的尾数 .bss c1,1 b2 乘数的指数 .bss b2,1 c2 乘数的尾数 .bss c2,1 ep .bss ep,1 乘积的指数 .bss mp,1 mp 乘积的尾数 .bss prod,1 prod 乘积 .bss temp,1 temp 暂存单元 2018年11月20日 DSP原理及应用
151
第5章 TMS320C54x汇编语言程序设计 .text start:STM #SATACK+100,SP
第5章 TMS320C54x汇编语言程序设计 AG AH AL 00 3333 0000 .text start:STM #SATACK+100,SP MVPD MVPD LD @a1,16,A EXP A ST NORM A STH LD @a2,16,A ST STH CALL MULT done: B done table: .word 4*32768/10 00 8CCD 0000 00 6666 0000 ;设堆栈指针 T 0001 .word -9*32768/10 ;将a1和a2送入RAM 0000 数据存储器 a1 被乘数 a2 乘数 b1 被乘数的指数 c1 被乘数的尾数 b2 乘数的指数 c2 乘数的尾数 ep 乘积的指数 mp 乘积的尾数 prod 乘积 temp 暂存单元 …… ;将a1送入AH 3333 ;将a1转换为浮点数 8CCD ;求a1的指数 0001 ;将a1的指数送b1 6666 ;求a1的尾数 0000 即A左移1位 ;将a1的尾数送c1 8CCD ;将a2送入AH ;将a2转换为浮点数 ;求a2的指数 ;将a2的指数送b2 ;求a2的尾数 ;将a2的尾数送c2 table 0.4 ;调浮点乘法子程序 -0.9 2018年11月20日 DSP原理及应用
152
第5章 TMS320C54x汇编语言程序设计 MULT: SSBX FRCT SSBX SXM LD @b1,A ADD @b2,A
第5章 TMS320C54x汇编语言程序设计 MULT: SSBX FRCT SSBX SXM LD @b1,A ADD @b2,A STL LD @c1,T MPY @c2,A EXP A ST NORM A STH LD @temp,A ADD @ep,A AG AH AL 00 8CCD 0000 00 0000 0001 00 0000 c1×c2=-0.72 FF A3D7 xxxx 00 0000 0001 00 0000 0001 ;取b1送入A T 0000 ;完成指数相加 ;b1+b2送入A 0000 6666 ;乘积指数送ep 数据存储器 a1 3333 a2 8CCD b1 0001 c1 6666 b2 0000 c2 ep 乘积的指数 mp 乘积的尾数 prod 乘积 temp 暂存单元 ;取a1的尾数 ;完成尾数相乘 ;求尾数的乘积 ;求尾数乘积的指数 即:乘积尾数=c1×c2 ;指数存入temp ;求乘积的尾数 ;存乘积的尾数 ;取尾数乘积的指数 0001 0001 ;修正乘积指数 ;(ep)+(temp)→A A3D7 ;保存乘积指数 0000 2018年11月20日 DSP原理及应用
153
第5章 TMS320C54x汇编语言程序设计 NEG A STL A,@temp LD @temp,T LD @mp,16,A NORM A
第5章 TMS320C54x汇编语言程序设计 AG AH AL 00 0000 0001 NEG A STL LD @temp,T LD @mp,16,A NORM A STH RET .END ;乘积指数反号 ;浮点乘积转换为定点数 FF FFFF FFFE FF D1EC 0000 FF 3AD7 0000 ;暂存A T 0000 ;取乘积指数 FFFE ;将(mp)→AH ;将A按T移位,得定点数 数据存储器 a1 3333 a2 8CCD b1 0001 c1 6666 b2 0000 c2 ep mp A3D7 prod 乘积 temp ;保存定点乘积 ;子程序返回 运行结果: 乘积尾数:0xA3D7 乘积指数:0x0001 乘积定点数:0xD1EC 十进制数: D1EC FFFE 2018年11月20日 DSP原理及应用
Similar presentations