運用TMS320C54x匯編語言編寫定點數(shù)運算浮點數(shù)運算程_第1頁
運用TMS320C54x匯編語言編寫定點數(shù)運算浮點數(shù)運算程_第2頁
運用TMS320C54x匯編語言編寫定點數(shù)運算浮點數(shù)運算程_第3頁
運用TMS320C54x匯編語言編寫定點數(shù)運算浮點數(shù)運算程_第4頁
運用TMS320C54x匯編語言編寫定點數(shù)運算浮點數(shù)運算程_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、一、定點數(shù)的運算在定點DSP芯片中,采用定點數(shù)進行數(shù)值運算,其操作數(shù)一般采用整數(shù)來表示。一個整數(shù)的最大表示范圍取決于DSP芯片所給定的字長,一般為16位或24位。顯然,字長越長,所能表示的數(shù)的范圍越大,精度也越高。在字長固定的前提下,所需要達到的精度越高,那么所能表示的浮點數(shù)的范圍就會越小。DSP芯片的數(shù)以2的補碼形式表示。每個16位數(shù)用一個符號位來表示數(shù)的正負,0表示數(shù)值為正,l則表示數(shù)值為負。其余15位表示數(shù)值的大小。如:二進制數(shù)二進制數(shù)-4為了使得無論是無符號數(shù)還是符號數(shù),都能夠使用同樣的加法減法規(guī)則,符號數(shù)中的負數(shù)用正數(shù)的補碼表示。對DSP芯片而言,參加數(shù)值運算的數(shù)就是16位的整數(shù)。但

2、在好多情況下,數(shù)學運算過程中的數(shù)不用然都是整數(shù)。那么,DSP芯片是如何辦理小數(shù)的呢?這其中的要點就是數(shù)的定標,由程序員來確定一個數(shù)的小數(shù)點處于16位中的哪一位。經(jīng)過設(shè)定小數(shù)點在16位數(shù)中的不同樣地址,就可以表示不同樣大小和不同樣精度的小數(shù)了。數(shù)的定標有Q表示法和S表示法兩種。定點數(shù)的加減法運算較為簡單,只需依據(jù)二進制數(shù)加減法運算規(guī)則相加減即可。如:兩個8位數(shù)擁有同樣的Qn格式,保證隱含的小數(shù)點對齊。以下圖中兩個8位數(shù)相加,有溢出。溢出是由于字長有限運算結(jié)果超出數(shù)值的表示范圍引起的。定點數(shù)的乘法運算DSP辦理器都有硬件乘法器和乘法指令,可實現(xiàn)單周期乘法運算,二進制乘法運算包括一系列的移位和加法運

3、算。定點數(shù)乘法運算不要求相乘數(shù)有同樣的Qn格式。兩個相乘數(shù)分別為Qn和Qm格式,字長為N,結(jié)果為Q(n+m格式,字長為2N。如:以下兩個相乘數(shù)分別為Q7和Q6格式,8位字長。兩個定點小數(shù)作乘法運算,結(jié)果左移一位,保存高位獲取運算結(jié)果,結(jié)果為Qm(mnm格式。小數(shù)乘小數(shù),整數(shù)乘小數(shù)都要求對乘積結(jié)果左移一位后,保存高位。整數(shù)與整數(shù)相乘,須盤問標志位確定保存的位數(shù),結(jié)果不需要左移一位。DSP辦理器帶有可選的自動左移一位的功能,除掉移位操作的時間開銷。定點數(shù)的除法運算除法是乘法的逆運算,包括一系列移位和條件減法運算,需要用除方法程序?qū)崿F(xiàn)。大多數(shù)DSP辦理器不供應(yīng)單周期除法指令。若是除法運算中包括負數(shù),

4、應(yīng)將負數(shù)變換為等值的正數(shù),爾后作除法運算,最后加上正確的符號。下面詳細解析32位整數(shù)乘法,32位小數(shù)乘法以及有符號/無符號整數(shù)除法的程序指令。位定點數(shù)乘法運算表示圖32位整數(shù)乘法參照程序:;Thisroutinemultipliestwo32-bitsignedintegersresulting;ina64-bitproduct.Theoperandsarefetchedfromdatamemoryandtheresultiswrittenbacktodatamemory.DataStorage:X1,X032-bitoperandY1,Y032-bitoperandW3,W2,W1,W064

5、-bitproductEntryConditions:SXM=1,OVM=0;.mmregsSTACK:.usect“STACK”,100h設(shè)置;貨倉段.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;設(shè)置重復(fù)執(zhí)行兩次下條指令MVPDtable1,*AR2+;將table1開始的兩個值傳給X

6、0RPT#1;設(shè)置重復(fù)執(zhí)行兩次下條指令MVPDtable2,*AR3+;將table2開始的兩個值傳給Y0STM#X0,AR2;將X0的首地址存入AR2STM#Y0,AR3;將Y0的首地址存入AR3LD*AR2,T;T=X0MPYU*AR3+,A;A=無符號數(shù)X0?無符號數(shù)Y0STLA,W0;將A送入W0LDA,-16,A;A值左移16位MACSU*AR2+,*AR3-,A;A+=Y1?無符號數(shù)X0MACSU*AR3+,*AR2,A;A+=X1?無符號數(shù)Y0STLA,W1;將A送入W1LDA,-16,A;A值左移16位MAC*AR2,*AR3,A;A+=11XY?STLA,W2;W2=A的低1

7、6位STHA,W3;W3=A的高16位here:Bhere程序解析:如原理圖所示,32位整數(shù)乘法的計算過程是將兩個32位的數(shù)X和Y各自分成X0、X1和Y0、Y1的16位數(shù)。爾后進行X0?Y0,A值左移16位,Y1?X0,X1?Y0,A值再左移16位,X1?Y1的操作。需要注意的是在32位乘法運算中,實質(zhì)上包括了三種乘法運算:U?U、S?U和S?S。U指無符號數(shù),S指帶符號數(shù)。在編程時,要用到以下三條乘法指令:MACSUXmem,Ymem,src;無符號數(shù)與帶符號數(shù)相乘并累加;MPYUSmem,dst;無符號數(shù)相乘;MACXmem,Ymem,src;兩個帶符號數(shù)數(shù)相乘并累加。位小數(shù)乘法參照程序:

8、;ThisroutinemultipliestwoQ31signedintegersresultinginaQ30product.Theoperandsarefetchedfromdatamemoryand;theresultiswrittenbacktodatamemorydatastorege:X1,X0Q31operandY1,Y0Q31operandW1,W0Q30productEntryConditions:SXM=1,OVM=0;.mmregsSTACK:.usect“STACK”,100h.bssX0,1.bssX1,1.bssY0,1.bssY1,1.bssW0,1.bssW1

9、,1.defstart.datatable1:.word1.word2table2:.word3.word4.textstart:STM#X0,AR2;將X0的首地址存入AR2STM#Y0,AR3;將Y0的首地址存入AR2RPT#1;設(shè)置重復(fù)執(zhí)行兩次下條指令MVPDtable1,*AR2+;將table1開始的兩個值傳給X0RPT#1;設(shè)置重復(fù)執(zhí)行兩次下條指令MVPDtable2,*AR3+;將table1開始的兩個值傳給Y0STM#X0,AR2;將X0的首地址存入AR2STM#Y1,AR3;將Y1的首地址存入AR3LD#0,A;將A置0MACSU*AR2+,*AR3-,A;A=X0?Y1MA

10、CSU*AR3+,*AR2,A;A+=X1?Y0LDA,-16,A;將A左移16位MAC*AR2,*AR3,A;A+=X1?Y1STLA,W0;將結(jié)果A的低16位送入W0STHA,W1;將結(jié)果A的高16位送入W0here:Bhere程序解析:小數(shù)乘法與整數(shù)乘法的程序設(shè)計大體近似,不同樣在于小數(shù)乘法少了X與Y的低位相乘部分,即X0與Y0的相乘部分。這是由于兩個整數(shù)相乘時,乘積總是“向左增添”。這意味著多次相乘后,乘積將會很快超出定點器件的控制范圍。但是,當兩個小數(shù)相乘時,乘積總是“向右增添”。這就意味著超出定點器件數(shù)據(jù)范圍將是我們不感興趣的部分,也就是指X0與Y0相乘獲取的結(jié)果那部分,因此可不用

11、計算這部分乘積。有符號/無符號整數(shù)除法參照程序;Description:32bitby16bitUnsignedIntegerDivideAndModulus32位除16位的無符號整數(shù)除法.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:.

12、word1.word2table2:.word3.textDivModUI32:RSBXSXM;signextentionmodeoffLDd_NumH,A;將分子高位移到累加器ARPT#(161;重復(fù)執(zhí)行下一條指令15次SUBCd_Den,A;A減去分母的值STLA,d_QuotH;將A的值存到商的高位XORd_QuotH,A;將A的低16位清零ORd_NumL,A;AL=NumLRPT#(161;重復(fù)執(zhí)行下一條指令15次SUBCd_Den,A;A減去分母的值STLA,d_QuotL;將A的值存到商的低位STHA,d_Rem;RETstart:STMd_NumL,AR2;將分子低16位所在單

13、元的地址傳給AR2STMd_Den,AR3;將分母所在單元的地址傳給AR2RPT#1;重復(fù)執(zhí)行兩次下一條指令MVPDtable1,*AR2+;將table1開始的兩個值傳給AR2MVPDtable2,*AR3;將table2開始的值傳給AR3CALLDivModUI32;調(diào)用除方法程序here:Bhere;Description:16bitby16bitUnsignedIntegerDivideAndModulus16位除16位的無符號整數(shù)除法.mmregsSTACK:.usect“STACK”,100h.bssd_Num,1;為分子分配單元.bssd_Den,1為;分母分配單元.bssd_Q

14、uot,1為;商分配單元.bssd_Rem,1.defDivModUI16;定義16位除方法程序.defstart.datatable1:.word1000table2:.word5.textDivModUI16:RSBXSXM;signextentionmodeoffLDd_Num,A;將分子移到累加器ARPT#(161;重復(fù)執(zhí)行下面指令16次SUBCd_Den,A;16次的減法循環(huán),完成除法STLA,d_Quot;將A的結(jié)果保存為商STHA,d_RemRETstart:STMd_NumL,AR2;將分子低16位所在單元的首地址傳給AR2STMd_Den,AR3;將分子低16位所在單元的首地

15、址傳給AR3MVPDtable1,*AR2;將table1開始的值傳給AR2MVPDtable2,*AR3;將table2開始的值傳給AR3CALLDivModUI16;調(diào)用除方法程序here:Bhere程序解析:DSP做除法運算時,經(jīng)過減法指令與重復(fù)循環(huán)指令實現(xiàn)無符號除法運算。需要注意的是,當被除數(shù)的絕對值除數(shù)的絕對值時,商為整數(shù)。;Description:32bitby16bitsignedIntegerDivideAndModulus32位除16位有符號除法.mmregsSTACK:.usect“STACK”,100h.bssd_NumL,1;為分子低16位分配單元.bssd_NumH,

16、1;為分子高16位分配單元.bssd_Den,1為;分母分配單元.bssd_QuotL,1;為商低16位分配單元.bssd_QuotH,1;為商高16位分配單元.bssd_Rem,1.defDivModI32;定義32位除方法程序.defstart.datatable1:.word1.word2table2:.word3.textDivModI32:SSBXSXM;signextentionmodeonLDd_Den,16,A;將分母移到累加器MPYAd_NumH;BhassignofquotientABSA;分母取絕對值STHA,d_Rem;d_Rem=abs(DentemporarilyL

17、Dd_NumH,16,A;將分子高16位移到AADDSd_NumL,A;A加上分子低16位ABSA;取A絕對值STHA,d_QuotH;d_QuotH=abs(NumHtemporarilySTLA,d_QuotL;d_QuotL=abs(NumLtemporarilyLDd_QuotH,A;將商的高位移到ARPT#(161;重復(fù)執(zhí)行下條指令16次SUBCd_Rem,A;16次減法循環(huán)運算,完成除法STLA,d_QuotH;AH=abs(QuotH;XORd_QuotH,A;clearALORd_QuotL,A;AL=abs(NumLRPT#(161;重復(fù)執(zhí)行下條指令16次SUBCd_Rem,

18、A;16次減法循環(huán)運算,完成除法STLA,d_QuotL;AL=abs(QuotLSTHA,d_Rem;AH=RemBCDDivModI32Skip,BGEQ;ifBneg,thenQuot=abs(QuotLDd_QuotH,16,A;將商的高16位移到AADDSd_QuotL,A;A加上商的低16位NEGA;若是B,則b1b2-b1b1x1+x2=m1e+m2ee?(b2-b1b1=m1+m2ee?(。浮點數(shù)的乘法運算,要經(jīng)過分別指數(shù)和尾數(shù),進行算術(shù)運算,估計結(jié)果的符號位,以及最后的歸一化儲藏這幾個過程。做乘法運算時要依據(jù)乘法運算的規(guī)則把指數(shù)相加,尾數(shù)相乘。即:12x1x2=mmebb+?

19、(12。需要注意的是,由于C54X的乘法器在一個指令周期內(nèi)只能完成17bit*17bit的二進制補碼運算,故相乘運算需要分步實現(xiàn)。浮點數(shù)的除法運算與乘法運算浮點數(shù)的乘法運算近似,同樣要經(jīng)過分別指數(shù)和尾數(shù),估計結(jié)果的符號位,對指數(shù)進行相減運算,對尾數(shù)進行相除運算,以及最后的歸一化儲藏這幾個過程。即:12x1x2=mmebb-?(12。不同樣的是,在執(zhí)行除法運算的時候,需要將除數(shù)和被除數(shù)都由24bit左移成32bit的形式,以減少誤差。無論是浮點數(shù)的加減運算還是乘除運算,完成對操作數(shù)之間的計算后就需要對結(jié)果數(shù)進行歸一化操作。所謂歸一化操作就是把數(shù)據(jù)格式變換為第一位為符號位,緊接著的一位是非零的數(shù)的

20、格式。歸一化完后要再把歸一化后的定點數(shù)轉(zhuǎn)變成浮點數(shù)。下面來以浮點數(shù)的乘法運算為例詳細解析浮點數(shù)的運算過程:設(shè)是對兩個數(shù)x1和x2進行乘法運算。將被乘數(shù)數(shù)x1的尾數(shù)分為Q,R和S三部分,Q表示尾數(shù)的高位的8bit,R和S表示尾數(shù)低位的兩字節(jié)。同樣,乘數(shù)x2也被分為X,Y和Z三部分,X表示尾數(shù)的高位,Y和Z表示尾數(shù)低位的兩字節(jié)。于是有需要注意的是,進行的這種32bit*32bit的運算是有精度損失的。如上圖所示,32位數(shù)0QRS0XYZ*RS*YZRS*0X0Q*YZ0Q*0Xresultop5的尾數(shù)op6的尾數(shù)只儲藏了結(jié)果的高16位高16位向來為0結(jié)果只表示了64bit中的32bit+0QRS乘

21、以32位數(shù)0XYZ所得的結(jié)果應(yīng)該是一個64bit的值。由于0Q*0X的高16bit向來為0,因此結(jié)果能夠用一個48位的值正確表示。但是用于儲藏結(jié)果的儲藏單元長度只有32bit,于是只有將最低的16bit省略掉,即把RS*YZ的低16bit略去,因此最后獲取的是一個有精度損失的32bit結(jié)果。浮點數(shù)乘法源程序以下:.title“float.asm”.defstartSTACK:.usect“STACK”,100.bssx1,1;x1是被乘數(shù).bssx2,1;x2是被乘數(shù).bsse1,1;e1是被乘數(shù)的指數(shù).bssm1,1;m1是被乘數(shù)的尾數(shù).bsse2,1;e2是乘數(shù)的指數(shù).bssm2,1;m2

22、是乘數(shù)的尾數(shù).bssep,1;ep是乘積的指數(shù).bssmp,1;mp是成績的尾數(shù).bssproduct,1;product是乘積.bsstemp,1;temp1暫存單元.datatable:.word3*32768/10;0.3.word-8*32768/10;-0.8.textstart:STM#STACK+100,SP;設(shè)貨倉指針MVPDtable,x1;將x1和x2送入RAMMVPDtable+1,x2LDx1,16,A;將x1送入AHEXPA;求x1的指數(shù)STT,e1;將x1的指數(shù)送e1NORMA;求x1的尾數(shù)STHA,m1;將x1的尾數(shù)送m1LDx2,16,A;將x2送入AHEXPA;求x2的指數(shù)STT,e2;將x2的指數(shù)送e2NORMA;求x2的尾數(shù)STHA,m2;將x2的尾數(shù)送c2CALLMULT;調(diào)浮點乘方法程序done:BdoneM

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論