您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 运用TMS320C54x汇编语言编写定点数运算浮点数运算程序
一、定点数的运算在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整数来表示。一个整数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位。显然,字长越长,所能表示的数的范围越大,精度也越高。在字长固定的前提下,所需要达到的精度越高,那么所能表示的浮点数的范围就会越小。DSP芯片的数以2的补码形式表示。每个16位数用一个符号位来表示数的正负,0表示数值为正,l则表示数值为负。其余15位表示数值的大小。如:二进制数0010000000000011b=8195二进制数1111111111111100b=-4为了使得无论是无符号数还是符号数,都可以使用同样的加法减法规则,符号数中的负数用正数的补码表示。对DSP芯片而言,参与数值运算的数就是16位的整数。但在许多情况下,数学运算过程中的数不一定都是整数。那么,DSP芯片是如何处理小数的呢?这其中的关键就是数的定标,由程序员来确定一个数的小数点处于16位中的哪一位。通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度的小数了。数的定标有Q表示法和S表示法两种。定点数的加减法运算较为简单,只需遵循二进制数加减法运算规则相加减即可。如:两个8位数具有相同的Qn格式,保证隐含的小数点对齐。下图中两个8位数相加,有溢出。溢出是由于字长有限运算结果超出数值的表示范围引起的。定点数的乘法运算DSP处理器都有硬件乘法器和乘法指令,可实现单周期乘法运算,二进制乘法运算包含一系列的移位和加法运算。定点数乘法运算不要求相乘数有相同的Qn格式。两个相乘数分别为Qn和Qm格式,字长为N,结果为Q(n+m)格式,字长为2N。如:以下两个相乘数分别为Q7和Q6格式,8位字长。两个定点小数作乘法运算,结果左移一位,保存高位得到运算结果,结果为Qm(mnm)格式。小数乘小数,整数乘小数都要求对乘积结果左移一位后,保存高位。整数与整数相乘,须查询标志位确定保存的位数,结果不需要左移一位。DSP处理器带有可选的自动左移一位的功能,消除移位操作的时间开销。定点数的除法运算除法是乘法的逆运算,包括一系列移位和条件减法运算,需要用除法子程序实现。大多数DSP处理器不提供单周期除法指令。如果除法运算中包含负数,应将负数变换为等值的正数,然后作除法运算,最后加上正确的符号。下面详细分析32位整数乘法,32位小数乘法以及有符号/无符号整数除法的程序指令。32位定点数乘法运算示意图32位整数乘法参考程序:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Thisroutinemultipliestwo32-bitsignedintegersresulting;;ina64-bitproduct.Theoperandsarefetchedfromdatamemoryand;theresultiswrittenbacktodatamemory.;DataStorage:;X1,X032-bitoperand;Y1,Y032-bitoperand;W3,W2,W1,W064-bitproduct;EntryConditions:;SXM=1,OVM=0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;.mmregsSTACK:.usect“STACK”,100h;设置堆栈段.bssX0,1.bssX1,1.bssY0,1.bssY1,1.bssW0,1.bssW1,1.bssW2,1.bssW3,1.defstart.datatable1:.word1.word2table2:.word3.word4.textstart:STM#X0,AR2;将X0的首地址存入AR2STM#Y0,AR3;将Y0的首地址存入AR3RPT#1;设置重复执行两次下条指令MVPDtable1,*AR2+;将table1开始的两个值传给X0RPT#1;设置重复执行两次下条指令MVPDtable2,*AR3+;将table2开始的两个值传给Y0STM#X0,AR2;将X0的首地址存入AR2STM#Y0,AR3;将Y0的首地址存入AR3LD*AR2,T;T=X0MPYU*AR3+,A;A=无符号数X0无符号数Y0STLA,@W0;将A送入W0LDA,-16,A;A值左移16位MACSU*AR2+,*AR3-,A;A+=Y1无符号数X0MACSU*AR3+,*AR2,A;A+=X1无符号数Y0STLA,@W1;将A送入W1LDA,-16,A;A值左移16位MAC*AR2,*AR3,A;A+=11XYSTLA,@W2;W2=A的低16位STHA,@W3;W3=A的高16位here:Bhere程序分析:如原理图所示,32位整数乘法的计算过程是将两个32位的数X和Y各自分成X0、X1和Y0、Y1的16位数。然后进行X0Y0,A值左移16位,Y1X0,X1Y0,A值再左移16位,X1Y1的操作。需要注意的是在32位乘法运算中,实际上包括了三种乘法运算:UU、SU和SS。U指无符号数,S指带符号数。在编程时,要用到以下三条乘法指令:MACSUXmem,Ymem,src;无符号数与带符号数相乘并累加;MPYUSmem,dst;无符号数相乘;MACXmem,Ymem,src;两个带符号数数相乘并累加。32位小数乘法参考程序:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ThisroutinemultipliestwoQ31signedintegers;resultinginaQ30product.Theoperandsarefetchedfromdatamemoryand;theresultiswrittenbacktodatamemory;datastorege:;X1,X0Q31operand;Y1,Y0Q31operand;W1,W0Q30product;EntryConditions:;SXM=1,OVM=0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;.mmregsSTACK:.usect“STACK”,100h.bssX0,1.bssX1,1.bssY0,1.bssY1,1.bssW0,1.bssW1,1.defstart.datatable1:.word1.word2table2:.word3.word4.textstart:STM#X0,AR2;将X0的首地址存入AR2STM#Y0,AR3;将Y0的首地址存入AR2RPT#1;设置重复执行两次下条指令MVPDtable1,*AR2+;将table1开始的两个值传给X0RPT#1;设置重复执行两次下条指令MVPDtable2,*AR3+;将table1开始的两个值传给Y0STM#X0,AR2;将X0的首地址存入AR2STM#Y1,AR3;将Y1的首地址存入AR3LD#0,A;将A置0MACSU*AR2+,*AR3-,A;A=X0Y1MACSU*AR3+,*AR2,A;A+=X1Y0LDA,-16,A;将A左移16位MAC*AR2,*AR3,A;A+=X1Y1STLA,@W0;将结果A的低16位送入W0STHA,@W1;;将结果A的高16位送入W0here:Bhere程序分析:小数乘法与整数乘法的程序设计大致类似,不同在于小数乘法少了X与Y的低位相乘部分,即X0与Y0的相乘部分。这是因为两个整数相乘时,乘积总是“向左增长”。这意味着多次相乘后,乘积将会很快超出定点器件的控制范围。但是,当两个小数相乘时,乘积总是“向右增长”。这就意味着超出定点器件数据范围将是我们不感兴趣的部分,也就是指X0与Y0相乘得到的结果那部分,因此可不必计算这部分乘积。有符号/无符号整数除法参考程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Description:32bitby16bitUnsignedIntegerDivideAndModulus;32位除16位的无符号整数除法.mmregsSTACK:.usect“STACK”,100h.bssd_NumL,1;为分子低16位分配1个单元.bssd_NumH,1;为分子高16位分配1个单元.bssd_Den,1;为分母分配1个单元.bssd_QuotL,1;为商的低16位分配1个单元.bssd_QuotH,1;为商的高16位分配1个单元.bssd_Rem,1;.defDivModUI32.defstart.datatable1:.word1.word2table2:.word3.textDivModUI32:RSBXSXM;signextentionmodeoffLDd_NumH,A;将分子高位移到累加器ARPT#(16–1);重复执行下一条指令15次SUBCd_Den,A;A减去分母的值STLA,d_QuotH;将A的值存到商的高位XORd_QuotH,A;将A的低16位清零ORd_NumL,A;AL=NumLRPT#(16–1);重复执行下一条指令15次SUBCd_Den,A;A减去分母的值STLA,d_QuotL;将A的值存到商的低位STHA,d_Rem;RETstart:STMd_NumL,AR2;将分子低16位所在单元的地址传给AR2STMd_Den,AR3;将分母所在单元的地址传给AR2RPT#1;重复执行两次下一条指令MVPDtable1,*AR2+;将table1开始的两个值传给AR2MVPDtable2,*AR3;将table2开始的值传给AR3CALLDivModUI32;调用除法子程序here:Bhere;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Description:16bitby16bitUnsignedIntegerDivideAndModulus;16位除16位的无符号整数除法.mmregsSTACK:.usect“STACK”,100h.bssd_Num,1;为分子分配单元.bssd_Den,1;为分母分配单元.bssd_Quot,1;为商分配单元.bssd_Rem,1.defDivModUI16;定义16位除法子程序.defstart.datatable1:.word1000table2:.word5.textDivModUI16:RSBXSXM;signextentionmodeoffLD@d_Num,A;将分子移到累加器ARPT#(16–1);重复执行下面指令16次SUBC@d_Den,A;16次的减法循环,完成除法STLA,@d_Quot;将A的结果保存为商STHA,@d_RemRETstart:STMd_NumL,AR2;将分子低16位所在单元的首地址传给AR2STMd_Den,AR3;将分子低16位所在单元的首地址传给AR3MVPDtable1,*AR2;将table1开始的值传给AR2MVP
本文标题:运用TMS320C54x汇编语言编写定点数运算浮点数运算程序
链接地址:https://www.777doc.com/doc-1999432 .html