资源描述
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 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、表明存储器地址相关与不相关的伪指令 .mdepsymbol1,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;icount;i+) product = mi * ni ; 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 = mi * ni ; 改写 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;icount;i+) pro_l = _mpy( data_ai, data_xi) ; pro_h = _mpyh( data_ai, data_xi) ; 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,
展开阅读全文