运用TMS320C54x汇编语言编写定点数运算、浮点数运算程序_第1页
运用TMS320C54x汇编语言编写定点数运算、浮点数运算程序_第2页
运用TMS320C54x汇编语言编写定点数运算、浮点数运算程序_第3页
运用TMS320C54x汇编语言编写定点数运算、浮点数运算程序_第4页
运用TMS320C54x汇编语言编写定点数运算、浮点数运算程序_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一、 定点数的运算在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整数来表示。一个整数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位。显然,字长越长,所能表示的数的范围越大,精度也越高。在字长固定的前提下,所需要达到的精度越高,那么所能表示的浮点数的范围就会越小。DSP芯片的数以2的补码形式表示。每个16位数用一个符号位来表示数的正负,0表示数值为正,l则表示数值为负。其余15位表示数值的大小。如:二进制数0010000000000011b=8195二进制数1111111111111100b= -4为了使得无论是无符号数还是符号数,都可以使用同样的加法减法规则,符

2、号数中的负数用正数的补码表示。对DSP芯片而言,参与数值运算的数就是16位的整数。但在许多情况下,数学运算过程中的数不一定都是整数。那么,DSP芯片是如何处理小数的呢?这其中的关键就是数的定标,由程序员来确定一个数的小数点处于16位中的哪一位。 通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度的小数了。数的定标有Q表示法和S表示法两种。定点数的加减法运算较为简单,只需遵循二进制数加减法运算规则相加减即可。如:两个8位数具有相同的Qn格式,保证隐含的小数点对齐。下图中两个8位数相加,有溢出。溢出是由于字长有限运算结果超出数值的表示范围引起的。定点数的乘法运算DSP处理器都有硬件

3、乘法器和乘法指令,可实现单周期乘法运算,二进制乘法运算包含一系列的移位和加法运算。定点数乘法运算不要求相乘数有相同的Qn格式。两个相乘数分别为Qn和Qm格式,字长为N,结果为Q(n+m)格式,字长为2N。如:以下两个相乘数分别为Q7和Q6格式,8位字长。两个定点小数作乘法运算,结果左移一位,保存高位得到运算结果,结果为Qm(m)格式。小数乘小数,整数乘小数都要求对乘积结果左移一位后,保存高位。整数与整数相乘,须查询标志位确定保存的位数,结果不需要左移一位。DSP处理器带有可选的自动左移一位的功能,消除移位操作的时间开销。定点数的除法运算除法是乘法的逆运算,包括一系列移位和条件减法运算,需要用除

4、法子程序实现。大多数DSP处理器不提供单周期除法指令。如果除法运算中包含负数,应将负数变换为等值的正数,然后作除法运算,最后加上正确的符号。下面详细分析32位整数乘法,32位小数乘法以及有符号/无符号整数除法的程序指令。32位定点数乘法运算示意图32位整数乘法参考程序:; ; This routine multiplies two 32-bit signed integers resulting; ; in a 64-bit product. The operands are fetched from data memory and ; the result is written back t

5、o data memory. ; Data Storage: ; X1,X0 32-bit operand ; Y1,Y0 32-bit operand ; W3,W2,W1,W0 64-bit product ; Entry Conditions: ; SXM = 1 , OVM = 0 ; .mmregs STACK: .usect “STACK”,100h ;设置堆栈段.bss X0,1 .bss X1,1 .bss Y0,1 .bss Y1,1 .bss W0,1 .bss W1,1 .bss W2,1 .bss W3,1 .def start .data table1: .word

6、1 .word 2 table2: .word 3 .word 4.textstart: STM #X0,AR2 ;将X0的首地址存入AR2STM #Y0,AR3 ;将Y0的首地址存入AR3RPT #1 ;设置重复执行两次下条指令MVPD table1,*AR2+ ;将table1开始的两个值传给X0RPT #1 ;设置重复执行两次下条指令MVPD table2,*AR3+ ;将table2开始的两个值传给Y0STM #X0,AR2 ;将X0的首地址存入AR2STM #Y0,AR3 ;将Y0的首地址存入AR3LD *AR2,T ;T=X0MPYU *AR3+,A ; A=无符号数X0无符号数Y

7、0STL A,W0 ;将A送入W0LD A,-16,A ;A值左移16位MACSU *AR2+,*AR3-,A ; A+= Y1无符号数X0MACSU *AR3+,*AR2,A ;A+= X1无符号数Y0STL A,W1 ;将A送入W1LD A,-16,A ;A值左移16位MAC *AR2,*AR3,A ;A+=STL A,W2 ;W2=A的低16位STH A,W3 ;W3=A的高16位here: B here 程序分析:如原理图所示,32位整数乘法的计算过程是将两个32位的数X和Y各自分成X0、X1和Y0、Y1的16位数。然后进行X0Y0,A值左移16位,Y1X0,X1Y0,A值再左移16位

8、,X1Y1的操作。需要注意的是在32位乘法运算中,实际上包括了三种乘法运算:UU、SU和SS。U指无符号数,S指带符号数。在编程时,要用到以下三条乘法指令: MACSU Xmem,Ymem,src ;无符号数与带符号数相乘并累加 ; MPYU Smem,dst ;无符号数相乘; MAC Xmem,Ymem,src ;两个带符号数数相乘并累加。32位小数乘法参考程序:; ; This routine multiplies two Q31 signed integers ; resulting in a Q30 product. The operands are fetched from data

9、 memory and ; the result is written back to data memory ; data storege: ; X1,X0 Q31 operand ; Y1,Y0 Q31 operand ; W1,W0 Q30 product ; Entry Conditions: ; SXM = 1 , OVM = 0 ; .mmregs STACK: .usect “STACK”,100h .bss X0,1 .bss X1,1 .bss Y0,1 .bss Y1,1 .bss W0,1 .bss W1,1 .def start .data table1: .word

10、1 .word 2 table2: .word 3 .word 4 .text start: STM #X0,AR2 ;将X0的首地址存入AR2STM #Y0,AR3 ;将Y0的首地址存入AR2 RPT #1 ;设置重复执行两次下条指令MVPD table1,*AR2+ ;将table1开始的两个值传给X0RPT #1 ;设置重复执行两次下条指令MVPD table2,*AR3+ ;将table1开始的两个值传给Y0STM #X0,AR2 ;将X0的首地址存入AR2STM #Y1,AR3 ;将Y1的首地址存入AR3LD #0,A ;将A置0MACSU *AR2+,*AR3-,A ;A=X0Y1

11、 MACSU *AR3+,*AR2,A ;A+=X1Y0 LD A,-16,A ;将A左移16位MAC *AR2,*AR3,A ;A+=X1Y1STL A,W0 ;将结果A的低16位送入W0STH A,W1 ;将结果A的高16位送入W0here: B here 程序分析:小数乘法与整数乘法的程序设计大致类似,不同在于小数乘法少了X与Y的低位相乘部分,即X0与Y0的相乘部分。这是因为两个整数相乘时,乘积总是“向左增长”。这意味着多次相乘后,乘积将会很快超出定点器件的控制范围。但是,当两个小数相乘时,乘积总是“向右增长”。这就意味着超出定点器件数据范围将是我们不感兴趣的部分,也就是指X0与Y0相乘

12、得到的结果那部分,因此可不必计算这部分乘积。有符号/无符号整数除法参考程序; ; Description: 32 bit by 16 bit Unsigned Integer Divide And Modulus ; 32位除16位的无符号整数除法.mmregs STACK: .usect “STACK”,100h .bss d_NumL,1 ;为分子低16位分配1个单元.bss d_NumH,1 ;为分子高16位分配1个单元.bss d_Den,1 ;为分母分配1个单元.bss d_QuotL,1 ;为商的低16位分配1个单元.bss d_QuotH,1 ;为商的高16位分配1个单元.bss

13、 d_Rem,1 ;.def DivModUI32 .def start .data table1: .word 1 .word 2 table2: .word 3 .text DivModUI32: RSBX SXM ; sign extention mode off LD d_NumH,A ;将分子高位移到累加器ARPT #(161) ;重复执行下一条指令15次SUBC d_Den,A ;A减去分母的值STL A, d_QuotH ;将A的值存到商的高位XOR d_QuotH,A ; 将A的低16位清零 OR d_NumL,A ; AL = NumL RPT #(161) ;重复执行下一条

14、指令15次SUBC d_Den,A ;A减去分母的值STL A, d_QuotL ;将A的值存到商的低位STH A,d_Rem ;RET start: STM d_NumL,AR2 ;将分子低16位所在单元的地址传给AR2STM d_Den,AR3 ;将分母所在单元的地址传给AR2RPT #1 ;重复执行两次下一条指令MVPD table1,*AR2+ ;将table1开始的两个值传给AR2MVPD table2,*AR3 ;将table2开始的值传给AR3CALL DivModUI32 ;调用除法子程序here: B here; ; Description: 16 bit by 16 bit

15、 Unsigned Integer Divide And Modulus ; 16位除16位的无符号整数除法.mmregs STACK: .usect “STACK”,100h .bss d_Num,1 ;为分子分配单元.bss d_Den,1 ;为分母分配单元.bss d_Quot,1 ;为商分配单元.bss d_Rem,1 .def DivModUI16 ;定义16位除法子程序.def start .data table1: .word 1000 table2: .word 5 .text DivModUI16: RSBX SXM ; sign extention mode off LD

16、d_Num,A ;将分子移到累加器ARPT #(161) ;重复执行下面指令16次SUBC d_Den,A ;16次的减法循环,完成除法STL A,d_Quot ;将A的结果保存为商STH A,d_Rem RET start: STM d_NumL,AR2 ;将分子低16位所在单元的首地址传给AR2STM d_Den,AR3 ;将分子低16位所在单元的首地址传给AR3MVPD table1,*AR2 ;将table1开始的值传给AR2MVPD table2,*AR3 ;将table2开始的值传给AR3CALL DivModUI16 ;调用除法子程序here: B here 程序分析:DSP做除

17、法运算时,通过减法指令与重复循环指令实现无符号除法运算。需要注意的是,当被除数的绝对值<除数的绝对值时,商为小数;当被除数的绝对值>除数的绝对值时,商为整数。; ; Description: 32 bit by 16 bit signed Integer Divide And Modulus ; 32位除16位有符号除法.mmregs STACK: .usect “STACK”,100h .bss d_NumL,1 ;为分子低16位分配单元.bss d_NumH,1 ;为分子高16位分配单元.bss d_Den,1 ;为分母分配单元.bss d_QuotL,1 ;为商低16位分配单

18、元.bss d_QuotH,1 ;为商高16位分配单元.bss d_Rem,1 .def DivModI32 ;定义32位除法子程序.def start .data table1: .word 1 .word 2 table2: .word 3 .text DivModI32: SSBX SXM ; sign extention mode on LD d_Den,16,A ;将分母移到累加器MPYA d_NumH ; B has sign of quotient ABS A ;分母取绝对值STH A ,d_Rem ;d_Rem = abs(Den) temporarily LD d_NumH,

19、16,A ;将分子高16位移到AADDS d_NumL,A ;A加上分子低16位ABS A ;取A绝对值STH A,d_QuotH ; d_QuotH = abs(NumH) temporarily STL A,d_QuotL ; d_QuotL = abs(NumL)temporarily LD d_QuotH,A ;将商的高位移到ARPT #(161) ;重复执行下条指令16次SUBC d_Rem,A ;16次减法循环运算,完成除法STL A,d_QuotH ;AH = abs(QuotH) ;XOR d_QuotH,A ;clear AL OR d_QuotL,A ;AL = abs(N

20、umL) RPT #(161) ;重复执行下条指令16次SUBC d_Rem,A ;16次减法循环运算,完成除法STL A,d_QuotL ;AL = abs(QuotL) STH A,d_Rem ;AH = Rem BCD DivModI32Skip,BGEQ ;if B neg, then Quot =abs(Quot) LD d_QuotH,16,A ;将商的高16位移到AADDS d_QuotL,A ;A加上商的低16位NEG A ;如果B<0执行求反,否则跳过此指令STH A,d_QuotH ;商的高位存回原处STL A,d_QuotL ;商的低16位存回原处DivModI32

21、Skip: RET ;定义32位除法返回子程序start: STM d_NumL,AR2 ;将分子低16位首地址传给AR2STM d_Den,AR3 ;将分母首地址传给AR2RPT #1 ;重复执行下条指令两次MVPD table1,*AR2+ ;将table1开始的两个值传给AR2MVPD table2,*AR3 ;将table2开始的值传给AR2CALL DivModI32 ;调用32位除法指令here: B here ; ; Description: 16 bit by 16 bit signed Integer Divide And Modulus ; 16位除16位有符号除法.mmr

22、egs STACK: .usect “STACK”,100h .bss d_Num,1 ;为分子分配单元.bss d_Den,1 ;为分母分配单元.bss d_Quot,1 ;为商分配单元.bss d_Rem,1 .def DivModI16 ;定义16位除法子程序.def start .data table1: .word 16 table2: .word -2 .text DivModI16: SSBX SXM ; sign extention mode on STM #d_Quot,AR2 ;将商的值传给AR2LD d_Den,16,A ;将分母移到A累加器MPYA d_Num ;B h

23、as sign of quotient ABS A ;分母取绝对值STH A,d_Rem ; d_Rem = abs(Den) temporarily ;LD d_Num,A ;将分子移到A累加器ABS A ;分子取绝对值RPT #(161) ;重复执行下条指令16次SUBC d_Rem,A ;分子循环相减16次,完成除法STL A,d_Quot ;将A的值保存到商STH A,d_Rem ;AH = Rem LD #0,A ;将A清零SUB d_Quot,16,A ;AH = abs(Quot) SACCD A,*AR2,BLT ; If B neg, Quot = abs(Quot) RET

24、 start: STM d_NumL,AR2 ;将分子低16位首地址传给AR2STM d_Den,AR3 ;将分母16位首地址传给AR2MVPD table1,*AR2 ;将table1开始的值传给AR2MVPD table2,*AR3 ;将table1开始的值传给AR2CALL DivModI16 ;调用除法子程序here: B here程序分析:有符号数除法与无符号数出发类似。不同在于,有符号数除法得到的商的结果可能为正,也可能为负。因此在用绝对值求出商后,不能直接存入quot段。先要判断商值为正还是为负。如果有符号数的商为负值时,需要变号,用到取反指令neg A,然后才能将值存入quot

25、e段中。二、浮点数的运算在数字信号处理中,定点运算是将数据的整数和小数部分分开,小数点在一个固定位置,其优点是硬件实现比较容易,但动态范围受到限制。为了扩大数据的范围和精度,需要采用浮点运算。在C54X上实现浮点运算,操作数须先变成定点数,然后再返回浮点数。通过规格化输入数据,可以将定点值变换为浮点值。表示方法一个浮点数由尾数m、基数b和指数e三部分组成,即浮点数的加减法运算,计算过程是左移指数较小的操作数的尾数,使得两个操作数的指数一致,相差几位移几位,再把尾数相加(减),归一化后输出。主要是要比较两个操作数指数的大小,这样才能决定到底是尾数直接相加(减)还是移位以后再相加(减)。如:若,则

26、。浮点数的乘法运算,要经过分离指数和尾数,进行算术运算,估计结果的符号位,以及最后的归一化存储这几个过程。做乘法运算时要遵循乘法运算的规则把指数相加,尾数相乘。即:。需要注意的是,由于C54X的乘法器在一个指令周期内只能完成17bit*17bit的二进制补码运算,故相乘运算需要分步实现。浮点数的除法运算与乘法运算浮点数的乘法运算类似,同样要经过分离指数和尾数,估计结果的符号位,对指数进行相减运算,对尾数进行相除运算,以及最后的归一化存储这几个过程。即:。不同的是,在执行除法运算的时候,需要将除数和被除数都由24bit左移成32bit的形式,以减少误差。不管是浮点数的加减运算还是乘除运算,完成对

27、操作数之间的计算后就需要对结果数进行归一化操作。所谓归一化操作就是把数据格式转换为第一位为符号位,紧接着的一位是非零的数的格式。归一化完后要再把归一化后的定点数转变为浮点数。下面来以浮点数的乘法运算为例具体分析浮点数的运算过程: 设是对两个数x1和x2进行乘法运算。将被乘数数x1的尾数分为Q,R和S三部分,Q表示尾数的高位的8bit,R和S表示尾数低位的两字节。同样,乘数x2也被分为X,Y和Z三部分,X表示尾数的高位,Y和Z表示尾数低位的两字节。于是有需要注意的是,进行的这种32bit*32bit的运算是有精度损失的。如上图所示,32位数0QRS乘以32位数0XYZ所得的结果应该是一个64bi

28、t的值。由于0Q*0X的高16bit始终为0,所以结果可以用一个48位的值准确表示。但是用于存储结果的存储单元长度只有32bit,于是只有将最低的16bit省略掉,即把RS*YZ的低16bit略去,因此最后得到的是一个有精度损失的32bit结果。浮点数乘法源程序如下:.title “float.asm” .def start STACK: .usect “STACK”,100 .bss x1,1 ;x1是被乘数.bss x2,1 ;x2是被乘数.bss e1,1 ;e1是被乘数的指数.bss m1,1 ;m1是被乘数的尾数.bss e2,1 ;e2是乘数的指数.bss m2,1 ;m2是乘数的尾数.bss ep,1 ;ep是乘积的指数.bss mp,1 ;mp是成绩的尾数.bss product,1 ;product是乘积.bss temp,1 ;temp1暂存单元.data table: .word 3*32768/10 ; 0.3 .word -8*32768/10 ; -0.8 .text start: STM #STACK+100,SP ;设堆栈指针MVPD table,x1 ;将x1和x2送入RAMMVPD table+1,x2 LD x1,16,A ;将x1送入AHEXP A ;求x1的指数ST T,e1 ;将x1的指数送e1NORM A

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论