dsp线性汇编的一个课件

2019-07-13 17:20发布

转载的,不知道出处
DSP技术与应用—— 线性汇编语言简介
线性汇编语言简介
• 汇编代码结构
• 线性汇编语言简介

汇编代码结构
Label: parallel bars [condition] instruction unit
operands;comments
(1)Label标号
标号用来定义一行代码或一个变量,它代表一条指
令或数据的存储地址,标号后面的冒号是可选的。
a标号的第1个字符必须是字母或下划线”_”跟一个字
母;
b标号的第1个字符必须在文件的第1列;
c标号最多可包含32个字母字符;
d并行指令不能使用标号。
(2)Parallel bars 并行符号 ||
汇编代码结构
Label: parallel bars [condition] instruction
unit operands;comments
(3)[condition]条件
A 如果指令没有指出条件,指令总被执行;
B 如果给定条件,当条件为真,指令执行;
C 如果给定条件,当条件为假,指令不执行。
如[A1] A1!=0 A1=0
[!A1] A1=0 A1!=0

汇编代码结构
Label: parallel bars [condition] instruction unit
operands;comments
4 instruction指令
汇编代码指令包括伪指令和命令助记符
A 伪指令用来在汇编语言中控制汇编过程或定义数据结构。
所有伪指令都以圆点打头。
如:
.sect “name”
.double value
.float value
.byte value
B 命令助记符代表有效微处理器命令,它执行程序操作。

汇编代码结构
Label: parallel bars [condition] instruction
unit operands;comments
5 Uint 功能单元
C6000有8个功能单元,每个功能单元有
两种类型。功能单元以“.”开始,后面跟一
个功能单元分类符。
.S1 .S2 .L1 .L2 .M1 .M2 .D1 .D2
另有交叉通道 如.L1X

汇编代码结构
Label: parallel bars [condition] instruction
unit operands;comments
6 operands操作数
操作数由常数、符号以及常数与符号构成
的表达式组成。
操作数之间必须用逗号隔开。
7 comments注释
;注释可以再任何一列开始
* 注释必须在第一列开始

线性汇编语言简介
线性汇编语句的基本结构
线性汇编中的伪指令
线性汇编资源安排
C代码转换为线性汇编

线性汇编语句的基本结构
• 基本格式与汇编语言相同,必须是ASCII码
文件,扩展名必须是”.sa”,用作汇编优化
器的输入文件
• Label[[:]] [||] [[register]] mnemonic [unit
specifier] [operand list] [;commend]

线性汇编中的伪指令
1、调用一个函数
.call [ret_reg=]func_name(arg1,arg2)(仅在过程procedure)
内有效
2、定义一个可被汇编优化器优化,而且可被C/C++当做函数调
用的线性汇编代码段的伪指令。
label .cproc [vari1[,vari2,…]] 起始
.endproc 结束
3、定义一个可被汇编优化器优化的线性汇编代码段的伪指令。
label .proc [vari1[,vari2,…]] 起始
.endproc 结束

线性汇编中的伪指令
4、表明存储器地址相关与不相关的伪指令
.mdep[symbol1],[symbol2] 1,2相关
.no_mdep 其后定义的函数段内存储器
地址不相关
5、定义变量,或者说描述存入寄存器的数值变量的伪指令:
.reg variable1[,variable2,…]
6、过程的返回值
.return [argument]
7、指出循环迭代次数的伪指令
label .trip minimum value

线性汇编资源安排
读取指令(LDH)必须使用.D单元
乘法指令(MPY)必须使用.M单元
加法指令(ADD)必须使用.L单元
减法指令(SUB)必须使用.S单元
跳转指令(B)必须使用.S单元

C代码转换为线性汇编
• short DP(short *m, short *n, short count)
• {
• short i ;
• short product ;
• short sum = 0 ;
• for(i=0;i • {
• product = m[i] * n[i] ;
• sum += product ;
• }
• return(sum) ;
• }

C代码转换为线性汇编
• 第一步:定义函数名称、实现参数传递
short DP(short *m, short *n, short count)
.def _DP
_DP .cproc cptr0,cptr1,vptr
1).def为definition的缩写
2).cproc表示本函数是C可调用函数,其后为
所传递的参数

C代码转换为线性汇编
• 第二步:暂时存放临时数据的寄存器定
名,由.reg ( register)完成
.reg addr_a,addr_x
.reg m,n
.reg product,sum
C代码转换为线性汇编
• 第三步,数据初始化
MV cptr0,addr_a
MV cptr1,addr_x
ZERO sum
前两句将数组a[ ]和x[ ]的首地址存入名为addr_a
和addr_x的寄存器变量,以便其后实现对数组
的访问;最后一句是累加寄存器清零。

C代码转换为线性汇编
• 第四步处理程序的循环体部分
定义一个标号loop:作为循环返回的标志;然后
按照原C程序语句顺序改写成汇编语句(不必指
定指令执行的功能单元):
product = m[i] * n[i] ;
改写
LDH *addr_a++,m
LDH *addr_x++,n
MPY m,n,product
sum += product ;
改写为
ADD sum,product,sum

C代码转换为线性汇编
• 将循环变量vptr(即count)减一;利用C6x指
令的条件执行功能通过对vptr是否为零的判
断条件执行跳转指令:
if ( vptr!=0) then B loop
• 最后,.return实现数据的返回。
• 一切工作完成后,使用.endproc作为函数结
束的标志。

C代码转换为线性汇编
• .def _DP
• _DP .cproc cptr0,cptr1,vptr
• . reg addr_a,addr_x
• . reg m,n
• . reg product,sum
• MV cptr0,addr_a
• MV cptr1,addr_x
• ZERO sum
• loop:
• LDH *addr_a++,m
• LDH *addr_x++,n
• MPY m,n,product
• ADD sum,product,sum
• SUB vptr,1,vptr
• [vptr] B loop
• .return sum
• . endproc

C代码转换为线性汇编
• short DP(short *m, short *n, short count)
• {
• short i ;
• int pro_h, pro_l ;
• int sum_h = 0 ;
• int sum_l = 0 ;
• int sum = 0 ;
• int *data_a = ( int *) m ;
• int *data_x = ( int *) n ;
• count = count >> 1 ;
• for(i=0;i • {
• pro_l = _mpy( data_a[i], data_x[i]) ;
• pro_h = _mpyh( data_a[i], data_x[i]) ;
• sum_l += pro_l ;
• sum_h += pro_h ;
• }
• sum = sum_l + sum_h ;
• return( sum) ;
• }


• .def _DP
• _DP .cproc cptr0,cptr1,vptr
• .reg addr_a,addr_x
• .reg product0,product1,sum0,sum1
• .reg m,n
• MV cptr0,addr_a
• MV cptr1,addr_x
• ZERO sum0
• ZERO sum1
• SHR vptr,1,vptr
• loop:
• LDW *addr_a++,m
• LDW *addr_x++,n
• MPY m,n,product0
• MPYH m,n,product1
• ADD sum0,product0,sum0
• ADD sum1,product1,sum1
• SUB vptr,1,vptr
• [vptr] B loop
• ADD sum0,sum1,sum0
• .return sum0
• .endproc