《TMS320C3X系列-DSP原理與開(kāi)發(fā)技術(shù)》課件第3章_第1頁(yè)
《TMS320C3X系列-DSP原理與開(kāi)發(fā)技術(shù)》課件第3章_第2頁(yè)
《TMS320C3X系列-DSP原理與開(kāi)發(fā)技術(shù)》課件第3章_第3頁(yè)
《TMS320C3X系列-DSP原理與開(kāi)發(fā)技術(shù)》課件第3章_第4頁(yè)
《TMS320C3X系列-DSP原理與開(kāi)發(fā)技術(shù)》課件第3章_第5頁(yè)
已閱讀5頁(yè),還剩151頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第3章TMS320C3x的浮點(diǎn)數(shù)格式

與尋址類(lèi)型

3.1浮點(diǎn)數(shù)格式3.2尋址類(lèi)型3.3尋址方式

3.4系統(tǒng)堆棧和用戶(hù)堆棧管理本章小結(jié)

思考題與習(xí)題

TI公司的TMS320C3x系列浮點(diǎn)DSP芯片,支持三種數(shù)據(jù)格式:有符號(hào)整數(shù)、無(wú)符號(hào)整數(shù)和浮點(diǎn)數(shù),其中有符號(hào)整數(shù)和無(wú)符號(hào)整數(shù)可認(rèn)為是相同的。TMS320C3x支持的有符號(hào)整數(shù)和無(wú)符號(hào)整數(shù)包括短數(shù)據(jù)格式和單精度格式,支持的浮點(diǎn)數(shù)包括短浮點(diǎn)格式、單精度浮點(diǎn)格式和擴(kuò)展精度浮點(diǎn)格式,如圖3.1所示。需要特別說(shuō)明的是,TI公司的TMS320C3x系列浮點(diǎn)DSP芯片,支持的浮點(diǎn)數(shù)不是IEEE的浮點(diǎn)格式,而是TI公司自己定義的一種浮點(diǎn)格式。所以本章將詳細(xì)介紹TMS320C3x系列DSP支持的浮點(diǎn)數(shù)格式及數(shù)據(jù)間的轉(zhuǎn)換。圖3.1C3x支持的數(shù)據(jù)格式3.1浮

點(diǎn)

數(shù)

3.1.1IEEE浮點(diǎn)數(shù)格式

IEEE?754—1985標(biāo)準(zhǔn)定義了4種浮點(diǎn)數(shù)格式,即單精度浮點(diǎn)數(shù)格式、擴(kuò)展精度浮點(diǎn)數(shù)格式、雙精度浮點(diǎn)數(shù)格式和擴(kuò)展雙精度浮點(diǎn)數(shù)格式。浮點(diǎn)數(shù)格式由三個(gè)區(qū)組成:指數(shù)區(qū)(e)、一位符號(hào)區(qū)(s)和分?jǐn)?shù)區(qū)(f)。存放順序依次為e、s、f。指數(shù)區(qū)是一個(gè)二進(jìn)制的補(bǔ)碼,符號(hào)區(qū)和分?jǐn)?shù)區(qū)可以作為一個(gè)單元,稱(chēng)為尾數(shù)區(qū)。尾數(shù)用來(lái)表示一個(gè)歸一化的二進(jìn)制的補(bǔ)碼數(shù)。在歸一化表示中,最大非符號(hào)數(shù)有效位是隱含表示的,由此提供附加一位的精度。浮點(diǎn)數(shù)x作為e、s和f區(qū)的函數(shù)可寫(xiě)為:當(dāng)s=0時(shí),x=01.f×2e;當(dāng)s=1時(shí),x=10.f×2e;當(dāng)e取最大負(fù)數(shù)2的補(bǔ)碼值時(shí),x=0。在DSP中,單精度格式用的最多,因此主要介紹IEEE單精度浮點(diǎn)數(shù)格式的表示方法。單精度浮點(diǎn)數(shù)格式總長(zhǎng)度為32位,其中s是尾數(shù)m的符號(hào)位,僅1位,s?=?0表示正數(shù),s?=?1表示負(fù)數(shù);e是指數(shù),用無(wú)符號(hào)數(shù)表示,共8位,取值范圍為0~255;f為尾數(shù)的分?jǐn)?shù)部分,共23位。一個(gè)單精度浮點(diǎn)數(shù)x用e、s和f表示可分為以下5種情況。

(1)如果0<e<255,則x?=?(-1)s2e-127(1.f),式中s?=?0或1,而e和f均為十進(jìn)制數(shù)。

(2)如果e?=?0,且f≠0,則x是一個(gè)非歸一化的數(shù),且x?=?(-1)s2-126(0.f),s?=?0或1,f用十進(jìn)制數(shù)表示。

(3)如果e?=?0,且f?=?0,則x?=?0。

(4)如果e?=?255,且f?≠?0,則x是一個(gè)無(wú)效數(shù)。

(5)如果e?=?255,且f?=?0,則x為無(wú)窮大。3.1.2TMS320C3x的浮點(diǎn)數(shù)格式為了在硬件實(shí)現(xiàn)時(shí)獲得更高的效率,TMS320C3x采用了不同于IEEE標(biāo)準(zhǔn)的浮點(diǎn)數(shù)格式。TMS320C3x共定義了3種浮點(diǎn)數(shù)格式。與IEEE浮點(diǎn)數(shù)格式一樣,每種都可以分為3個(gè)區(qū)域,即指數(shù)區(qū)(e)、1位符號(hào)位(s)和分?jǐn)?shù)區(qū)(f)。指數(shù)區(qū)是二進(jìn)制的補(bǔ)碼數(shù),符號(hào)區(qū)和分?jǐn)?shù)區(qū)可以作為一個(gè)單元,稱(chēng)為尾數(shù)man(mantissa),其存放格式如圖3.2所示。圖3.2通用浮點(diǎn)數(shù)格式浮點(diǎn)數(shù)x用指數(shù)e、符號(hào)s和分?jǐn)?shù)f可以表示為

x=ss.f×2e(3.1)其中,s為符號(hào)位的數(shù)值;s為符號(hào)位取“非”后的數(shù)值;f為分?jǐn)?shù)區(qū)的二進(jìn)制數(shù)值;e為指數(shù)區(qū)的十進(jìn)制數(shù)值。

s是隱含的,由此可以提供附加一位的精度。采用上述符號(hào)后,尾數(shù)可表示為ss.f。當(dāng)符號(hào)位s為0時(shí),浮點(diǎn)數(shù)x為正數(shù),此時(shí)尾數(shù)為01.f;當(dāng)符號(hào)位s為1時(shí),浮點(diǎn)數(shù)x為負(fù)數(shù),此時(shí)尾數(shù)為10.f。指數(shù)e在存儲(chǔ)器中是以二進(jìn)制的補(bǔ)碼表示的,在式(3-1)中是以十進(jìn)制數(shù)表示的,以十進(jìn)制表示的數(shù)值即e就是尾數(shù)中小數(shù)點(diǎn)移動(dòng)的位數(shù)。例如,若尾數(shù)man?=?01.000000000012,指數(shù)e?=?1110,那么尾數(shù)的二進(jìn)制數(shù)的小數(shù)點(diǎn)將右移11位,此時(shí)結(jié)果為01000000000012,也即表示的十進(jìn)制數(shù)為2049。指數(shù)e是有符號(hào)的,若指數(shù)e為“正”,則表示尾數(shù)中的小數(shù)點(diǎn)右移;若指數(shù)e為“負(fù)”,則表示尾數(shù)中的小數(shù)點(diǎn)左移。

1.浮點(diǎn)數(shù)格式

TMS320C3x支持三種浮點(diǎn)數(shù)格式:短浮點(diǎn)數(shù)格式、單精度浮點(diǎn)數(shù)格式、擴(kuò)展精度浮點(diǎn)數(shù)格式。

1)短浮點(diǎn)數(shù)格式短浮點(diǎn)數(shù)格式的總長(zhǎng)度為16位,包括4位指數(shù)、1位符號(hào)和11位分?jǐn)?shù),隱含的二進(jìn)制小數(shù)點(diǎn)位于第11位和第10位之間,如圖3.3所示。短浮點(diǎn)數(shù)x的二進(jìn)制形式表示如下:若s?=?0,則x?=?01.f?×?2e;若s?=?1,則x?=?10.f?×?2e;若s?=?-8,則x?=?0。圖3.3短浮點(diǎn)數(shù)格式若用短浮點(diǎn)數(shù)格式表示零,那么必須滿(mǎn)足下面的條件:E=-8,s=0,f=?0下面的例子說(shuō)明了短浮點(diǎn)數(shù)格式的數(shù)的范圍。當(dāng)s=0,e=7,f的11位均為1時(shí),表示的浮點(diǎn)數(shù)為最大正數(shù):x?=?(2-2-11)?×?27?=?2.5594?×?102當(dāng)s=0,e=-7,f的11位均為0時(shí),表示的浮點(diǎn)數(shù)為最小正數(shù):x?=?1?×?2-7?=?7.8125?×?10-3當(dāng)s?=?1,e?=?-7,f的11位均為1時(shí),表示的浮點(diǎn)數(shù)為絕對(duì)值最小的負(fù)數(shù):x?=?(-2-2-11)?×?2-7?=?-708163?×?10-3當(dāng)s?=?1,e?=?7,f的11位均為0時(shí),表示的浮點(diǎn)數(shù)為絕對(duì)值最大的負(fù)數(shù):x?=?-2?×?27?=?-205600?×?102當(dāng)s=1,e=-7,f的11位均為1時(shí),表示的浮點(diǎn)數(shù)為絕對(duì)值最小的負(fù)數(shù):X=(-2-2-11)×2-7=-708163×10-3當(dāng)s=1,e=7,f的11位均為0時(shí),表示的浮點(diǎn)數(shù)為絕對(duì)值最大的負(fù)數(shù):x=?-2×?27?=?-205600×102

2)單精度浮點(diǎn)數(shù)格式單精度浮點(diǎn)數(shù)格式是最常用的浮點(diǎn)數(shù)格式,其總長(zhǎng)度為32位,包括8位指數(shù)、1位符號(hào)和23位分?jǐn)?shù)。隱含的二進(jìn)制小數(shù)點(diǎn)位于第23位和第22位之間,如圖3.4所示。單精度浮點(diǎn)數(shù)x的二進(jìn)制形式可表示如下:若s=0,則x=01.f×2e;若s=1,則x=10.f×2e;若s=-128,則x=0。圖3.4單精度浮點(diǎn)數(shù)格式若用單精度浮點(diǎn)數(shù)格式表示零,那么必須滿(mǎn)足下面的條件:e=-128,s=0,f=0下面的例子說(shuō)明了單精度浮點(diǎn)數(shù)格式的數(shù)的范圍。當(dāng)s=0,e=127,f的23位均為1時(shí),表示的浮點(diǎn)數(shù)為最大正數(shù):x=(2-2-23)×2127=3.4028234×1038當(dāng)s=0,e=-127,f的23位均為0時(shí),表示的浮點(diǎn)數(shù)為最小正數(shù):x=1×2-127=5.8774717×10-39當(dāng)s=1,e=-127,f的23位均為1時(shí),表示的浮點(diǎn)數(shù)為絕對(duì)值最小的負(fù)數(shù):x=(-1-2-23)×2-127=-5.8774724×10-39當(dāng)s=1,e=127,f的23位均為0時(shí),表示的浮點(diǎn)數(shù)為絕對(duì)值最大的負(fù)數(shù):x=-2×2127=-3.4028236×1038

3)擴(kuò)展精度浮點(diǎn)數(shù)格式擴(kuò)展精度浮點(diǎn)數(shù)格式的總長(zhǎng)度為40位,包括8位指數(shù)、1位符號(hào)和31位分?jǐn)?shù),隱含的二進(jìn)制小數(shù)點(diǎn)位于第31位和第30位之間,如圖3.5所示。擴(kuò)展精度浮點(diǎn)數(shù)x的二進(jìn)制形式可表示如下:若s=0,則x=01.f×2e;若s=1,則x=10.f×2e;若s=-128,則x=0。圖3.5擴(kuò)展精度浮點(diǎn)數(shù)格式若用擴(kuò)展精度浮點(diǎn)數(shù)格式表示零,那么必須滿(mǎn)足下面的條件:e=-128,s=0,f=0下面的例子說(shuō)明了擴(kuò)展精度浮點(diǎn)數(shù)格式的數(shù)的范圍。當(dāng)s=0,e=127,f的31位均為1時(shí),表示的浮點(diǎn)數(shù)為最大正數(shù):x=(2-2-23)×2127=3.4028234×1038當(dāng)s=0,e=-127,f的31位均為0時(shí),表示的浮點(diǎn)數(shù)為最小正數(shù):x=1×2-127=5.877471754?1×1038當(dāng)s=1,e=-127,f的31位均為1時(shí),表示的浮點(diǎn)數(shù)為絕對(duì)值最小的負(fù)數(shù):x=(-1-2-31)×2-127?=?-5.8774717569×10-39當(dāng)s=1,e=127,f的31位均為0時(shí),表示的浮點(diǎn)數(shù)為絕對(duì)值最大的負(fù)數(shù):x=-2×2127=-3.4028236691×1038

2.單精度浮點(diǎn)數(shù)格式的表示方法由于TMS320C3x中用的最多的是單精度浮點(diǎn)數(shù)格式,下面就以這種格式為例說(shuō)明浮點(diǎn)數(shù)的表示方法。在實(shí)際浮點(diǎn)數(shù)操作情況下,多用32位的十六進(jìn)制表示,高8位(第24~31位)為指數(shù)e,第23位為符號(hào)位s,其余的低23位(第0~22位)為分?jǐn)?shù)f。若需要換算成整數(shù),則分別寫(xiě)出指數(shù)e、符號(hào)位s、分?jǐn)?shù)f,根據(jù)單精度浮點(diǎn)數(shù)格式,轉(zhuǎn)換成相應(yīng)的整數(shù)。例如,設(shè)浮點(diǎn)數(shù)x的32位十六進(jìn)制數(shù)用F表示,即F?=?00000000h,則指數(shù)e?=?00(第24~31位),符號(hào)位s=0(第23位),分?jǐn)?shù)f=0(第0~22位),因?yàn)閟?=?0,故浮點(diǎn)數(shù)x的二進(jìn)制值為01.f?×?20?=?1,那么十進(jìn)制值也為1。

3.1.3數(shù)據(jù)格式間的轉(zhuǎn)換

1.整數(shù)和浮點(diǎn)數(shù)格式的轉(zhuǎn)換

1)浮點(diǎn)數(shù)到整數(shù)的轉(zhuǎn)換(fix指令)使用fix指令,可以在單精度內(nèi)把擴(kuò)展精度浮點(diǎn)數(shù)轉(zhuǎn)換為單精度整數(shù)。x值由浮點(diǎn)數(shù)轉(zhuǎn)換為整數(shù)用fix(x),如果待轉(zhuǎn)換值a在-231<a<231-1范圍內(nèi),則轉(zhuǎn)換時(shí)不會(huì)溢出。首先必須確定a(exp)≤31,若沒(méi)有在此范圍內(nèi),將會(huì)發(fā)生溢出。若溢出發(fā)生在正方向,則輸出是最大正整數(shù);若溢出發(fā)生在負(fù)方向,則輸出是最大負(fù)整數(shù)。如果a(exp)在有效范圍內(nèi),那么a包含于有效范圍內(nèi),是有符號(hào)擴(kuò)展數(shù),而且根據(jù)rs?=?31-a(exp)進(jìn)行右移。右移出的那些位與尾數(shù)的分?jǐn)?shù)部分相對(duì)應(yīng)。例如如果0≤x<1,那么fix(x)?=?0;如果-1≤x<0,那么fix(x)?=?-1。

2)整數(shù)到浮點(diǎn)數(shù)的轉(zhuǎn)換(float指令)使用float指令把整數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù),允許單精度整數(shù)轉(zhuǎn)換為擴(kuò)展精度浮點(diǎn)數(shù)。

2.單精度浮點(diǎn)數(shù)轉(zhuǎn)換為整數(shù)在數(shù)據(jù)處理中,經(jīng)常需要把浮點(diǎn)數(shù)轉(zhuǎn)換成整數(shù),轉(zhuǎn)換步驟如下:

(1)把二進(jìn)制形式的指數(shù)轉(zhuǎn)換成十進(jìn)制數(shù)。浮點(diǎn)數(shù)格式的指數(shù)是以二進(jìn)制的補(bǔ)碼形式出現(xiàn)的,把它轉(zhuǎn)換成十進(jìn)制數(shù)時(shí)要看它的最高位。若最高位為0,則可以直接把二進(jìn)制數(shù)轉(zhuǎn)換成十進(jìn)制數(shù);若最高位為1,則需要對(duì)指數(shù)的二進(jìn)制數(shù)求補(bǔ)碼,然后再把它轉(zhuǎn)換成十進(jìn)制數(shù)。

(2)把尾數(shù)轉(zhuǎn)換成滿(mǎn)足條件的二進(jìn)制形式。尾數(shù)是由一位符號(hào)位和分?jǐn)?shù)組成的,其中在符號(hào)位和分?jǐn)?shù)之間隱含了一個(gè)二進(jìn)制的小數(shù)點(diǎn)。若符號(hào)位s=0,則尾數(shù)被改寫(xiě)為01,同時(shí)加上二進(jìn)制的小數(shù)點(diǎn),然后在小數(shù)點(diǎn)后面附加上分?jǐn)?shù)f。例如,若f?=?101000000002,則尾數(shù)變?yōu)閙an?=?01.101000000002。若符號(hào)位s?=?1,則尾數(shù)被改寫(xiě)為10,同時(shí)加上二進(jìn)制的小數(shù)點(diǎn),然后在小數(shù)點(diǎn)后面附加上分?jǐn)?shù)f,例如f?=?101000000002,那么此時(shí)的尾數(shù)變?yōu)閙an?=?10.101000000002。

(3)根據(jù)指數(shù)的值移動(dòng)改寫(xiě)后尾數(shù)的小數(shù)點(diǎn)。若指數(shù)為正,則小數(shù)點(diǎn)向右移;若指數(shù)為負(fù),則小數(shù)點(diǎn)向左移。例如,如果e?=?210且man?=?01.110000000002,那么尾數(shù)的小數(shù)點(diǎn)右移兩位,得到的結(jié)果為0111.0000000002,也即十進(jìn)制值為7;如果e?=?-210且man?=?01.10000000002,那么尾數(shù)的小數(shù)點(diǎn)左移兩位,得到的結(jié)果為0.01100000000002,也即十進(jìn)制值為3/8。下面的例子說(shuō)明了如何由浮點(diǎn)數(shù)得到整數(shù)、分?jǐn)?shù)。例3.1浮點(diǎn)數(shù)轉(zhuǎn)換后為正整數(shù)。浮點(diǎn)數(shù)轉(zhuǎn)換后為正整數(shù)的例子如圖3.6所示。圖3.6浮點(diǎn)數(shù)轉(zhuǎn)換后為正整數(shù)例例3.2浮點(diǎn)數(shù)轉(zhuǎn)換后為負(fù)整數(shù)。浮點(diǎn)數(shù)轉(zhuǎn)換后為負(fù)整數(shù)的例子如圖3.7所示。圖3.7浮點(diǎn)數(shù)轉(zhuǎn)換后為負(fù)整數(shù)例例3.3浮點(diǎn)數(shù)轉(zhuǎn)換后用分?jǐn)?shù)表示。浮點(diǎn)數(shù)轉(zhuǎn)換后為分?jǐn)?shù)的例子如圖3.8所示。圖3.8浮點(diǎn)數(shù)轉(zhuǎn)換后為分?jǐn)?shù)例

3.浮點(diǎn)數(shù)格式間的轉(zhuǎn)換對(duì)于上面提到的幾種浮點(diǎn)數(shù)格式,在進(jìn)行浮點(diǎn)數(shù)操作時(shí),經(jīng)常要求從一種浮點(diǎn)數(shù)格式轉(zhuǎn)換為另一種浮點(diǎn)數(shù)格式,并且浮點(diǎn)數(shù)格式轉(zhuǎn)換也是浮點(diǎn)運(yùn)算的一部分,它不需要花費(fèi)額外的時(shí)間,而是自動(dòng)地在硬件中完成的。圖3.9~圖3.12為四種格式轉(zhuǎn)換的例子。在下面的例子中,s為指數(shù)的符號(hào)位,y為短浮點(diǎn)數(shù)格式中的尾數(shù),x為短浮點(diǎn)數(shù)格式中的指數(shù),z為擴(kuò)展精度的低8位。由圖3.9可看出,在轉(zhuǎn)換后的單精度浮點(diǎn)數(shù)格式中,指數(shù)區(qū)的符號(hào)得到擴(kuò)展,尾數(shù)區(qū)的低12位填充“0”。圖3.9短浮點(diǎn)數(shù)格式轉(zhuǎn)換為單精度浮點(diǎn)數(shù)格式由圖3.10可看出,在轉(zhuǎn)換后的擴(kuò)展精度格式中,指數(shù)區(qū)的符號(hào)得到擴(kuò)展,尾數(shù)區(qū)的低20位填充“0”。圖3.10短浮點(diǎn)數(shù)格式轉(zhuǎn)換為擴(kuò)展精度浮點(diǎn)數(shù)格式由圖3.11可看出,在轉(zhuǎn)換后的擴(kuò)展精度格式中,尾數(shù)區(qū)的低8位填充“0”。圖3.11單精度浮點(diǎn)格式轉(zhuǎn)換為擴(kuò)展精度浮點(diǎn)數(shù)格式由圖3.12可看出,轉(zhuǎn)換后的單精度格式是把原來(lái)的擴(kuò)展精度格式中的低8位截掉了。圖3.12擴(kuò)展精度浮點(diǎn)數(shù)格式轉(zhuǎn)換為單精度浮點(diǎn)數(shù)格式3.1.4浮點(diǎn)數(shù)的運(yùn)算

1.浮點(diǎn)數(shù)的乘法一個(gè)浮點(diǎn)數(shù)a可用下面公式表示:a=a(man)×2a(exp)(3.2)式中,a(man)為浮點(diǎn)數(shù)的尾數(shù);a(exp)為浮點(diǎn)數(shù)的指數(shù)。兩個(gè)浮點(diǎn)數(shù)a和b相乘,其乘積結(jié)果為c,則定義如下形式:c=a×b=a(man)×b(man)×2(a(exp)×?b(exp))(3.3)由式(3-3)可見(jiàn):c(man)=a(man)×b(man)(3.4)c(exp)=a(exp)+b(exp)?(3.5)浮點(diǎn)數(shù)在做乘法運(yùn)算時(shí),源操作數(shù)都假定為單精度浮點(diǎn)數(shù)格式。若源操作數(shù)是短浮點(diǎn)格式,則它必須先被轉(zhuǎn)換為單精度浮點(diǎn)數(shù)格式;若源操作數(shù)是擴(kuò)展精度浮點(diǎn)數(shù)格式,則也必須先被轉(zhuǎn)換為單精度浮點(diǎn)數(shù)格式。這些轉(zhuǎn)換都在硬件中自動(dòng)完成而毋須花費(fèi)更多時(shí)間。所有浮點(diǎn)數(shù)乘積的結(jié)果都為擴(kuò)展精度浮點(diǎn)數(shù)格式,并且整個(gè)乘法運(yùn)算是在單周期內(nèi)完成的。

2.浮點(diǎn)數(shù)的加法和減法在浮點(diǎn)數(shù)加法和減法中,若兩個(gè)浮點(diǎn)數(shù)a和b能定義為a=a(man)×2a(exp),b=b(man)×2b(exp)則a和b的和與差c可定義為

c=a±b

=(a(man)±(b(man))×2-(a(exp)-b(exp)))×2a(exp),若a(exp)≥b(exp)

=(a(man)×2-(b(exp)-a(exp)))±b(man)×2b(exp),若a<b(exp)

3.浮點(diǎn)數(shù)的除法浮點(diǎn)數(shù)DSP芯片一般不提供專(zhuān)門(mén)的除法指令,因?yàn)閷?shí)現(xiàn)浮點(diǎn)數(shù)除法必須用子程序來(lái)實(shí)現(xiàn)。實(shí)現(xiàn)浮點(diǎn)數(shù)除法可以采用近似迭代的方法來(lái)實(shí)現(xiàn)。設(shè)z=x/y,如果先求得y的倒數(shù)1/y,則將x乘以y的倒數(shù)即可求得x/y。求y的倒數(shù)的迭代方法為e[i]=e[i-1]×(2.0-ye[i-1])采用這個(gè)迭代公式需要一個(gè)初始估值e[0],設(shè)y=m×2e,則e[0]的一個(gè)較好估值為e[0]=1.0×2-e-1例3.4浮點(diǎn)數(shù)求倒數(shù)的TMS320C3x匯編程序。匯編程序如下:

INVF: LDF R0,R3 ;保存輸入數(shù) ABSFR0 ;求絕對(duì)值

PUSHFR0

POP R1

ASH-24,R1;R1的低8位包含指數(shù)部分

NEGIR1

SUBI1,R1

ASH24,R1

PUSH R1

POPF R1 ;R1=v[0]=1.0*2**(-e-1) MPYF R1,R0,R2 ;第一次迭代

SUBRF 2.0,R2 MPYF R2,R1 MPYF R1,R0,R2 ;第二次迭代 SUBRF 2.0,R2

MPYF R2,R1 MPYF R1,R0,R2 ;第三次迭代 SUBRF 2.0,R2MPYF R2,R1MPYF R1,R0,R2 ;第四次迭代SUBRF 2.0,R2MPYF R2,R1RND R1 ;最后一次迭代采用e[5]?=?(e[4]*(1.0-(v*e[4])))?+?e[4]MPYFR1,R0,R2SUBRF1.0,R2MPYFR1,R2ADDFR2,R1

RNDR1,R0 ;處理負(fù)數(shù)情況

NEGFR0,R2

LDFR3,R3

LDFNR2,R0 ;若v<0,R0=-R0

RETS該例是求浮點(diǎn)倒數(shù)的TMS320C3x的匯編程序,輸入數(shù)v及其倒數(shù)均在寄存器R0中,這個(gè)程序采用5次迭代。要想獲得更高的精度,增加迭代次數(shù)即可。3.2尋址類(lèi)型

TMS320C3x系列的DSP共有七種尋址類(lèi)型,通過(guò)這些尋址操作可以完成從存儲(chǔ)器、寄存器以及指令字中存取數(shù)據(jù)。這七種尋址類(lèi)型分別是立即尋址、直接尋址、寄存器尋址、間接尋址、PC相對(duì)尋址、循環(huán)尋址和位反轉(zhuǎn)尋址。3.2.1立即數(shù)尋址立即數(shù)尋址就是尋找的對(duì)象(操作數(shù))直接在指令中出現(xiàn),指令在被匯編器編譯成機(jī)器代碼時(shí),所需要的數(shù)據(jù)可以直接拿出來(lái)使用,不需要到寄存器或存儲(chǔ)器中去取操作數(shù)。在這種尋址方式中,立即數(shù)的大小受到指令字最低有效位數(shù)的限制,一般有16位和32位兩種情況,據(jù)此立即數(shù)尋址可以劃分為短立即數(shù)尋址和長(zhǎng)立即數(shù)尋址。

1.短立即數(shù)尋址短立即數(shù)尋址的操作數(shù)是包含在指令字中低16位有效位中的立即數(shù)。根據(jù)指令字的數(shù)據(jù)類(lèi)型,短立即數(shù)表現(xiàn)形式可以是負(fù)數(shù)(以二進(jìn)制的補(bǔ)碼形式表示)、無(wú)符號(hào)整數(shù)或浮點(diǎn)數(shù)。涉及到短立即數(shù)尋址的常見(jiàn)指令有ADDI、AND、CMPI、SUBI、MPYI等。例3.5短立即數(shù)尋址。如:SUBI1,R0指令執(zhí)行前

指令執(zhí)行后

R0

=

0000000000h R0

=

00FFFFFFFFh說(shuō)明:在例3.5中指令SUBI的源操作數(shù)為1,源操作數(shù)在指令中是以短立即數(shù)尋址的方式出現(xiàn)的,而目的操作數(shù)R0則是以寄存器尋址的方式出現(xiàn)的,所以指令的尋址是對(duì)具體的操作數(shù)而言的,不同的操作數(shù)類(lèi)型對(duì)應(yīng)的尋址方式會(huì)出現(xiàn)差異。

2.長(zhǎng)立即數(shù)尋址長(zhǎng)立即數(shù)尋址的操作數(shù)是包含在指令字中的低24位有效位中的立即數(shù)。長(zhǎng)立即數(shù)的數(shù)據(jù)形式主要是無(wú)符號(hào)整數(shù)。涉及到長(zhǎng)立即數(shù)尋址的常見(jiàn)指令有BR、BRD等。例3.6長(zhǎng)立即數(shù)尋址。如:BR80000h指令執(zhí)行前

指令執(zhí)行后

PC?=?0h PC?=?80000h在立即數(shù)尋址中,由于尋找對(duì)象(操作數(shù))就在計(jì)算機(jī)指令中,讀到指令就找到了操作數(shù),因此尋址花費(fèi)的時(shí)間較少,尋址速度較快。但同時(shí)也存在一些不足之處:首先程序指令的設(shè)計(jì)不靈活,由于操作數(shù)固化在指令中,要想對(duì)數(shù)據(jù)進(jìn)行修改就必須修改指令,變動(dòng)程序。其次由于尋址的對(duì)象是立即數(shù),最大位數(shù)為24位,操作數(shù)的取值范圍受到了限制。為了擴(kuò)大尋址空間,可以將操作數(shù)的地址放在指令中,于是出現(xiàn)了直接尋址。3.2.2直接尋址對(duì)于直接尋址來(lái)說(shuō),尋找的對(duì)象(操作數(shù))不在計(jì)算機(jī)指令中,而在內(nèi)部存儲(chǔ)器中,該存儲(chǔ)器的單元地址由計(jì)算機(jī)指令直接給出。在直接尋址的過(guò)程中,數(shù)據(jù)地址由數(shù)據(jù)頁(yè)指針寄存器(DP)的低8位和指令字的低16位連接而成,使程序在256頁(yè)(每頁(yè)64K字)中不需改變頁(yè)指針就有一個(gè)很大的尋址空間。數(shù)據(jù)地址格式如圖3.13所示,圖中expr是表示地址的數(shù)值或符號(hào)。圖3.13直接尋址例3.7直接尋址。如:ADDI@0BCDEh,R7

例3.8直接尋址。如:SIZE.word123456h

.text

LDI@SIZE,R0

直接尋址中由于計(jì)算機(jī)指令直接給出的單元地址往往超過(guò)了16位,尋址空間可以達(dá)到64K個(gè)單元,尋址空間的范圍擴(kuò)大了。但是直接尋址在確定數(shù)據(jù)的地址之后還需要對(duì)內(nèi)存進(jìn)行訪(fǎng)問(wèn),才能找到操作數(shù),因此直接尋址與立即數(shù)尋址方式相比,其尋址速度明顯降低。3.2.3寄存器尋址為了進(jìn)一步提高尋址速度,可以將操作數(shù)直接存放在CPU寄存器中,通過(guò)對(duì)寄存器的操作實(shí)現(xiàn)對(duì)數(shù)據(jù)的存取處理,這種尋址方式稱(chēng)為寄存器尋址。例3.9寄存器尋址。如:PUSHR1;

TMS320VC33中可用作寄存器尋址的寄存器共有28個(gè),分別是擴(kuò)展精度寄存器R0~R7,輔助寄存器AR0~AR7,數(shù)據(jù)頁(yè)指針DP,索引寄存器IR0、IR1,塊寄存器BK,堆棧指針寄存器SP,狀態(tài)寄存器ST,中斷控制寄存器IE,中斷標(biāo)志寄存器IF,I/O控制寄存器IOF,塊重復(fù)計(jì)數(shù)器RC,塊重復(fù)起始地址RS,塊重復(fù)結(jié)束地址RE。有關(guān)CPU寄存器的詳細(xì)資料見(jiàn)第2章。寄存器尋址是通過(guò)指令字中寄存器的機(jī)器代碼找到操作數(shù)的,整個(gè)尋址過(guò)程在CPU內(nèi)部完成,不需要訪(fǎng)問(wèn)寄存器,因此尋址速度非???。不足的是,在寄存器尋址中用于存放數(shù)據(jù)的CPU寄存器太少,為了提高寄存器的利用率,擴(kuò)大尋址空間,可采用間接尋址。3.2.4間接尋址與寄存器尋址不同的是,間接尋址在CPU寄存器中放入的不是操作數(shù),而是該操作數(shù)存儲(chǔ)單元的地址,該地址是由輔助寄存器、偏移量和索引寄存器來(lái)確定的,其中輔助寄存器和索引寄存器僅使用低24位有效位,這24位對(duì)應(yīng)的無(wú)符號(hào)數(shù)在輔助寄存器運(yùn)算單元(ARAU)中進(jìn)行運(yùn)算,高8位保持不變。在所有的尋址類(lèi)型中間接尋址的形式變化最多,尋址方式最靈活,應(yīng)用范圍最廣。表3.1~3.3列出了各種間接尋址指令的句法、操作及其功能。其中表3.1是帶有偏移量disp的間接尋址指令,表3.2是通過(guò)索引寄存器IRm(IRm為IR0或IR1)調(diào)整偏移量的間接尋址指令,表3.3是特殊的間接尋址指令。表3.1帶有偏移量的間接尋址表3.2通過(guò)索引寄存器IRm調(diào)整偏移量的間接尋址表3.3間接尋址的特殊情況

1.直接給出偏移量的間接尋址這類(lèi)尋址方式的指令如表3.1所示,所取操作數(shù)的地址是由輔助寄存器ARn的內(nèi)容與偏移量disp確定的,其中偏移量可以是默認(rèn)值1,也可以是包含在指令字中的8位無(wú)符號(hào)整數(shù),能夠表示的數(shù)值范圍為0~255。應(yīng)該注意的是,在三操作數(shù)的指令中偏移量disp只能取0,1。下面例3.10~3.17對(duì)這些指令進(jìn)行逐條詳解。例3.10預(yù)加偏移量的間接尋址。所取操作數(shù)的地址是輔助寄存器ARn的內(nèi)容與偏移量disp之和。

句法:*+ARn(disp)操作:操作數(shù)地址=ARn+disp如:LDI*+AR0(1),R0指令執(zhí)行前

指令執(zhí)行后

AR0?=?800000h AR0

=

800000h

R0?=?0h R0

=

123456h

800001中數(shù)據(jù)?=?123456h 800001中數(shù)據(jù)?=?123456h例3.11預(yù)減偏移量的間接尋址。

所取操作數(shù)的地址是輔助寄存器ARn的內(nèi)容減去偏移量disp。句法:*-ARn(disp)操作:操作數(shù)地址=ARn-disp如:LDI*-AR0(253),R0指令執(zhí)行前

指令執(zhí)行后

AR0?=?800253h AR0

=

800253h

R0?=?0h R0

=

123456h

800000中數(shù)據(jù)?=?123456h800000中數(shù)據(jù)?=?123456h例3.12預(yù)加偏移量和修改輔助寄存器的間接尋址。操作數(shù)的地址是輔助寄存器ARn的內(nèi)容與偏移量disp之和。取數(shù)據(jù)后,輔助寄存器內(nèi)容變?yōu)楦潞蟮牡刂?。句法?++ARn(disp)操作:操作數(shù)地址?=?ARn+dispARn?=?ARn+disp

如:LDI*++AR0(2),R0指令執(zhí)行前

指令執(zhí)行后

AR0?=?800000h AR0

=

800002h

R0?=?0h R0

=

123456h

800002中數(shù)據(jù)?=?123456h800002中數(shù)據(jù)?=?123456h例3.13預(yù)減偏移量和修改輔助寄存器的間接尋址。所取操作數(shù)的地址是輔助寄存器ARn的內(nèi)容減去偏移量disp,取數(shù)據(jù)后,輔助寄存器內(nèi)容變?yōu)楦潞蟮牡刂?。句法?--ARn(disp)操作:操作數(shù)地址=ARn-disp

ARn=ARn-disp如:LDI*--AR0(2),R0指令執(zhí)行前

指令執(zhí)行后AR0?=?800002h AR0

=

800000hR0?=?0h R0

=

123456h800000中數(shù)據(jù)?=?123456h

800000中數(shù)據(jù)?=?123456h例3.14后加偏移量和修改輔助寄存器的間接尋址。所取操作數(shù)的地址是輔助寄存器ARn的內(nèi)容。取操作數(shù)后,偏移量disp加到輔助寄存器中。句法:*ARn++(disp)操作:操作數(shù)地址?=?ARnARn?=?ARn+disp如:LDI*AR0++(2),R0指令執(zhí)行前

指令執(zhí)行后AR0?=?800000h AR0

=

800002hR0?=?0h R0

=

123456h800000中數(shù)據(jù)?=?123456h 800000中數(shù)據(jù)?=?123456h例3.15后減偏移量和修改輔助寄存器的間接尋址。所取操作數(shù)的地址是輔助寄存器ARn的內(nèi)容。取操作數(shù)后,輔助寄存器內(nèi)容減去偏移量disp。句法:*ARn--(disp)操作:操作數(shù)地址?=?ARnARn?=?ARn-disp

如:LDI*AR0--(2),R0指令執(zhí)行前

指令執(zhí)行后AR0?=?800002h AR0?=?800000hR0?=?0h R0?=?123456h800002中數(shù)據(jù)?=?123456h 800002中數(shù)據(jù)?=?123456h例3.16后加偏移量和循環(huán)修改輔助寄存器的間接尋址。所取操作數(shù)的地址是輔助寄存器ARn的內(nèi)容。取操作數(shù)后,偏移量disp用循環(huán)尋址方式加到輔助寄存器中,結(jié)果用來(lái)更新輔助寄存器內(nèi)容。句法:*ARn++(disp)%操作:操作數(shù)地址?=?ARnARn?=?循環(huán)(ARn+disp)如:設(shè)循環(huán)緩沖器的大小R?=?6,該緩沖器的首地址為800000h。LDI*AR0++(4)%,R0指令執(zhí)行前

指令執(zhí)行后AR0?=?800003h AR0?=?800001hR0?=?0h R0?=?123456h800003中數(shù)據(jù)=123456h 800003中數(shù)據(jù)?=?123456h例3.17后減偏移量和循環(huán)修改輔助寄存器的間接尋址。所取操作數(shù)的地址是輔助寄存器ARn的內(nèi)容。取操作數(shù)后,偏移量disp以循環(huán)尋址方式從輔助寄存器內(nèi)容中減去,結(jié)果用來(lái)更新輔助寄存器內(nèi)容。句法:*ARn--(disp)%操作:操作數(shù)地址?=?ARnARn?=?循環(huán)(ARn-disp)如:設(shè)循環(huán)緩沖器的大小為6,該緩沖器的首地址為800000h。LDI*AR0--(2)%,R0指令執(zhí)行前

指令執(zhí)行后AR0?=?800005hAR0?=?800003hR0?=?0h R0?=?123456h800005中數(shù)據(jù)?=?123456h800005中數(shù)據(jù)?=?123456h

2.通過(guò)索引寄存器調(diào)整偏移量的間接尋址在帶有偏移量的間接尋址中,對(duì)于輔助寄存器的調(diào)整往往受到偏移量取值范圍的限制,為了擴(kuò)大基址的調(diào)整幅度,引入索引寄存器。通過(guò)索引寄存器調(diào)整偏移量的間接尋址的指令如表3.2所示。所取操作數(shù)的地址是由輔助寄存器ARn的內(nèi)容與索引寄存器IRm(IR0或IR1)確定的。下面的例3.18~3.25對(duì)這些指令進(jìn)行逐條詳解。例3.18預(yù)加變址的間接尋址。

所取操作數(shù)的地址是輔助寄存器ARn和索引寄存器(IR0或IR1)內(nèi)容之和。指令執(zhí)行前輔助寄存器中的內(nèi)容不發(fā)生變化。句法:*+ARn(IRm)操作:操作數(shù)地址?=?ARn+IRm如:LDI10h,IR0

LDI*+AR0(IR0),R0指令執(zhí)行前

指令執(zhí)行后

IR0?=?0h IR0?=?10h

AR0?=?800000h

AR0?=?800000h

R0

=

0h

R0

=

123456h800010中數(shù)據(jù)

=

123456h 800010中數(shù)據(jù)

=

123456h例3.19預(yù)減變址的間接尋址。

所取操作數(shù)的地址是輔助寄存器ARn和索引寄存器(IR0或IR1)內(nèi)容之差。指令執(zhí)行前輔助寄存器中的內(nèi)容不發(fā)生變化。句法:*-ARn(IRm)操作:操作數(shù)地址=ARn-IRm如:LDI10h,IR0

LDI*-AR0(IR0),R0指令執(zhí)行前

指令執(zhí)行后IR0?=?0h IR0

=

10hAR0?=?800010h AR0?=?800010hR0?=?0h R0?=?123456h800000中數(shù)據(jù)?=?123456h 800000中數(shù)據(jù)

=

123456h例3.20預(yù)加變址和修改輔助寄存器的間接尋址。

所取操作數(shù)的地址是輔助寄存器ARn和索引寄存器(IR0或IR1)內(nèi)容之和。指令執(zhí)行后用產(chǎn)生的新地址對(duì)輔助寄存器中的內(nèi)容進(jìn)行更新。句法:*++ARn(IRm)操作:操作數(shù)地址?=?ARn+IRm

ARn?=?ARn+IRm如:LDI10h,IR0LDI*++AR0(IR0),R0指令執(zhí)行前

指令執(zhí)行后IR0?=?0h IR0?=?10hAR0?=?800000h AR0?=?800010hR0?=?0h R0?=?123456h800010中數(shù)據(jù)?=?123456h 800010中數(shù)據(jù)?=?123456h例3.21預(yù)減變址和修改輔助寄存器的間接尋址。

所取操作數(shù)的地址是輔助寄存器ARn和索引寄存器(IR0或IR1)內(nèi)容之差。指令執(zhí)行后用產(chǎn)生的新地址對(duì)輔助寄存器中的內(nèi)容進(jìn)行更新。句法:*--ARn(IRm)操作:操作數(shù)地址?=?ARn-IRm

ARn?=?ARn-IRm如:LDI10h,IR0

LDI*--AR0(IR0),R0指令執(zhí)行前

指令執(zhí)行后IR0?=?0h IR0?=?10hAR0?=?800010h

AR0?=?800000hR0?=?0h

R0?=?123456h800000中數(shù)據(jù)?=?123456h 800000中數(shù)據(jù)?=?123456h例3.22后加變址和修改輔助寄存器的間接尋址。

所取操作數(shù)的地址是輔助寄存器ARn的內(nèi)容。指令執(zhí)行后索引寄存器IRm(IR0或IR1)內(nèi)容加到輔助寄存器中去,對(duì)輔助寄存器進(jìn)行更新。句法:*ARn++(IRm)操作:操作數(shù)地址?=?ARn

ARn?=?ARn+IRm如:LDI10h,IR0

LDI*AR0++(IR0),R0指令執(zhí)行前

指令執(zhí)行后

IR0?=?0h IR0?=?10h

AR0?=?800000h

AR0?=?800010h

R0?=?0h

R0?=?123456h800000中數(shù)據(jù)?=?123456h 800000中數(shù)據(jù)?=?123456h例3.23后減變址和修改輔助寄存器的間接尋址。

所取操作數(shù)的地址是輔助寄存器ARn的內(nèi)容。指令執(zhí)行后,從輔助寄存器中減去索引寄存器IRm(IR0或IR1)內(nèi)容,并對(duì)輔助寄存器進(jìn)行更新。句法:*ARn--(IRm)操作:操作數(shù)地址?=?ARn

ARn?=?ARn-IRm如:LDI10h,IR0

LDI*AR0--(IR0),R0指令執(zhí)行前

指令執(zhí)行后IR0?=?0h IR0?=?10hAR0?=?800010h AR0?=?800000hR0=?0h R0?=?123456h800010中數(shù)據(jù)?=?123456h 800010中數(shù)據(jù)?=?123456h例3.24后加變址和循環(huán)修改輔助寄存器的間接尋址。

所取操作數(shù)的地址是輔助寄存器ARn的內(nèi)容。取操作數(shù)后,索引寄存器(IR0或IR1)的內(nèi)容加到輔助寄存器中,這個(gè)值用循環(huán)尋址方式計(jì)算并對(duì)輔助寄存器的內(nèi)容進(jìn)行更新。有關(guān)循環(huán)尋址的計(jì)算詳見(jiàn)本章3.2.6節(jié)的循環(huán)尋址。句法:*ARn++(IRm)%操作:操作數(shù)地址?=?ARn

ARn?=?循環(huán)(ARn+IRm)如:設(shè)循環(huán)緩沖器的大小R=6,該緩沖器的首地址為800000h。

LDI4h,IR0

LDI*AR0++(IR0)%,R0指令執(zhí)行前

指令執(zhí)行后

IR0?=?0h

IR0?=?4hAR0?=?800003h

AR0?=?800001hR0?=?0h R0?=?123456h800003中數(shù)據(jù)?=?123456h

800003中數(shù)據(jù)?=?123456h例3.25后減變址和循環(huán)修改輔助寄存器的間接尋址。

取操作數(shù)的地址是輔助寄存器ARn內(nèi)容。取操作數(shù)后,從輔助寄存器中減去索引寄存器(IR0或IR1)內(nèi)容,這個(gè)值用循環(huán)尋址方式計(jì)算并對(duì)輔助寄存器的內(nèi)容進(jìn)行更新。有關(guān)循環(huán)尋址的計(jì)算詳見(jiàn)本章4.1.6節(jié)的循環(huán)尋址。句法:*ARn--(IRm)%操作:操作數(shù)地址?=?ARn

ARn?=?循環(huán)(ARn-IRm)如:設(shè)循環(huán)緩沖器的大小R=6,該緩沖器的首地址為800000h。LDI2h,IR0LDI*AR0--(IR0)%,R0指令執(zhí)行前

指令執(zhí)行后IR0?=?0h IR0?=?2hAR0?=?800005h AR0?=?800003hR0

=

0h R0

=

123456h800005中數(shù)據(jù)?=?123456h 800005中數(shù)據(jù)?=?123456h

3.特殊的間接尋址特殊的間接尋址指令如表3.3所示。下面例3.26~4.27對(duì)這些指令中的情況進(jìn)行詳解。例3.26輔助寄存器的間接尋址。

LDI*AR0,R0指令執(zhí)行前

指令執(zhí)行后

AR0?=?800005h

AR0?=?800005h

R0?=?0h R0?=?120000h800005中數(shù)據(jù)?=?120000h

800005中數(shù)據(jù)?=?120000h例3.27后加變址和以位反轉(zhuǎn)方式修改輔助寄存器的間接尋址。

所取操作數(shù)的地址是輔助寄存器ARn的內(nèi)容。取操作數(shù)后,索引寄存器(IR0)內(nèi)容加到輔助寄存器中,采用反向進(jìn)位方式計(jì)算,得到位反轉(zhuǎn)(B)地址,用這個(gè)值替代輔助寄存器內(nèi)容。句法:*ARn++(IR0)B操作:操作數(shù)地址?=?ARn

ARn?=?B(ARn+IR0)假定一個(gè)8位的輔助寄存器AR2賦值01100000(60)是存儲(chǔ)器數(shù)據(jù)起始地址,若此存儲(chǔ)器有16條記錄,IR0被賦值00001000(8),則指令*AR2++(IR0)B被多次執(zhí)行后的結(jié)果見(jiàn)例3.27。3.2.5PC相對(duì)尋址

PC相對(duì)尋址主要用于控制程序跳轉(zhuǎn)。在一般的程序執(zhí)行過(guò)程中,指令逐條順序執(zhí)行,指令的地址由PC+1→PC控制,而在程序執(zhí)行跳轉(zhuǎn)指令,下一條指令的地址不再由程序計(jì)數(shù)器PC決定,而是由指令直接給出。在C3x系列的PC相對(duì)尋址中,通過(guò)把指令字中16位或者24位的最低有效位上的內(nèi)容和當(dāng)前的程序計(jì)數(shù)器PC相加,利用相加后的結(jié)果對(duì)當(dāng)前的PC進(jìn)行更新。例3.28PC相對(duì)尋址。如:BRNEWPC指令執(zhí)行前

指令執(zhí)行后

PC?=?1001h PC?=?1005h標(biāo)號(hào)NEWPC對(duì)應(yīng)的地址為1005h。

16位的PC相對(duì)尋址主要用于條件跳轉(zhuǎn)指令編碼(例如:Bcond、BcondD、CALLcond)。指令編碼的第25位表示源操作數(shù)的尋址方式,跳轉(zhuǎn)的偏移量以16位有符號(hào)數(shù)的形式存放在指令字的最低有效位上,指令編碼的第21位決定跳轉(zhuǎn)的類(lèi)型(D=0表示標(biāo)準(zhǔn)跳轉(zhuǎn),D=1表示延遲跳轉(zhuǎn))。對(duì)于標(biāo)準(zhǔn)跳轉(zhuǎn)來(lái)說(shuō),跳轉(zhuǎn)條件一旦滿(mǎn)足便立即跳轉(zhuǎn),新的PC值=偏移量+當(dāng)前PC值+1;而對(duì)于延遲跳轉(zhuǎn)來(lái)說(shuō),在條件滿(mǎn)足的前提下,需繼續(xù)執(zhí)行后面的三條指令后再進(jìn)行程序跳轉(zhuǎn),新的PC值=偏移量+當(dāng)前PC值+3,如圖3.14所示。圖3.1416位PC相對(duì)尋址方式編碼

24位的PC相對(duì)尋址涉及到的控制指令主要有BR、BRD、CALL、RPTB和RPTBD。在指令編碼中,指令字中的最低24位有效位上存放的是源操作數(shù)或者是標(biāo)號(hào)對(duì)應(yīng)的PC值,新的PC值直接由指令字中的最低24位有效位中的數(shù)據(jù)決定,第24位代表跳轉(zhuǎn)類(lèi)型(D?=?0表示標(biāo)準(zhǔn)跳轉(zhuǎn),D?=?1表示延遲跳轉(zhuǎn))。其中延遲跳轉(zhuǎn)與上面的16位的PC相對(duì)尋址情況相同,需延遲三條指令后再進(jìn)行程序跳轉(zhuǎn),圖3.15是24位PC相對(duì)尋址方式編碼。圖3.1524位PC相對(duì)尋址方式編碼3.2.6循環(huán)尋址循環(huán)尋址是DSP中經(jīng)常用到的一種尋址類(lèi)型,它可以實(shí)現(xiàn)對(duì)某一特定存儲(chǔ)區(qū)域進(jìn)行循環(huán)操作,這種尋址類(lèi)型對(duì)于數(shù)字信號(hào)處理中的FIR、卷積等運(yùn)算有著極其重要的意義。循環(huán)尋址的實(shí)質(zhì)是實(shí)現(xiàn)一個(gè)滑動(dòng)窗,窗內(nèi)包含要處理的最新數(shù)據(jù),每處理完當(dāng)前的數(shù)據(jù)緩沖寄存器中的數(shù)據(jù),指針會(huì)按一定步長(zhǎng)移動(dòng),使新的數(shù)據(jù)進(jìn)來(lái)覆蓋舊的數(shù)據(jù),然后對(duì)緩沖器中的數(shù)據(jù)再進(jìn)行處理,如此往復(fù),當(dāng)指針到達(dá)緩沖區(qū)的末端時(shí),重新設(shè)置指針指向緩沖器首地址。圖3.16(a)表示包含6個(gè)數(shù)值的循環(huán)緩沖器,圖3.16(b)表示這個(gè)緩沖器是如何在C3x的存儲(chǔ)空間內(nèi)實(shí)現(xiàn)的;圖3.17表示寫(xiě)入3個(gè)值后的緩沖器狀態(tài);圖3.18表示寫(xiě)入8個(gè)值后的緩沖器狀態(tài)。圖3.16循環(huán)緩沖器的邏輯和物理表示圖3.17寫(xiě)入3個(gè)值后的循環(huán)緩沖器的邏輯及物理表示圖3.18寫(xiě)入8個(gè)值后的循環(huán)緩沖器的邏輯及物理表示在TI的DSP中,循環(huán)尋址的基本語(yǔ)法:

*ARn++(step)%

*Arn--(step)%與循環(huán)尋址相關(guān)的概念包括以下幾個(gè)方面:

(1)輔助寄存器ARn。在循環(huán)尋址中,輔助寄存器ARn存放的是數(shù)據(jù)基址,數(shù)據(jù)地址的改變是在A(yíng)Rn的基礎(chǔ)上通過(guò)加上或者減去步長(zhǎng)step實(shí)現(xiàn)的,因此第一次對(duì)循環(huán)隊(duì)列尋址時(shí),輔助寄存器必須指向此循環(huán)隊(duì)列的某一個(gè)確定的單元。

(2)步長(zhǎng)step。步長(zhǎng)step是輔助寄存器加上或減去的值。在循環(huán)尋址中,使用的步長(zhǎng)必須小于等于塊的長(zhǎng)度,無(wú)論是用立即數(shù)還是用索引寄存器作為步長(zhǎng)的調(diào)整量,步長(zhǎng)step都被當(dāng)作無(wú)符號(hào)整型數(shù)對(duì)待。

(3)緩沖器的大小。緩沖區(qū)間一般是由塊寄存器BK中存儲(chǔ)的循環(huán)緩沖器長(zhǎng)度R來(lái)確定的,緩沖空間不大于64K(16bit)。

(4)緩沖器的起始地址。緩沖器的起始地址與緩沖器的長(zhǎng)度必須滿(mǎn)足公式:2K≥R,其中K為循環(huán)緩沖器的起始地址的最低有效位二進(jìn)制值中“0”的個(gè)數(shù),R為循環(huán)緩沖器長(zhǎng)度。表3.4說(shuō)明了公式2K≥R的含義。表3.4公式2K>R的含義循環(huán)尋址算法如下:若0<ARn+step<BK,則Arn=ARn+step否則,若ARn+step≥BK,則Arn=ARn+step-BK若ARn+step<0,則ARn=ARn+step+BK圖3.19說(shuō)明了如何實(shí)現(xiàn)循環(huán)緩沖的原理。圖3.19循環(huán)緩沖的實(shí)現(xiàn)例3.29循環(huán)尋址。寄存器R1、R2、R3、R4、R5內(nèi)存放的整型數(shù)分別為1、2、3、4、5,設(shè)AR0=30000h,循環(huán)尋址的空間為6(即塊寄存器BK=6),按照下面的程序運(yùn)行,運(yùn)行后的結(jié)果如表3.5所示,其中第一列為執(zhí)行的指令,第二列和第三列分別為各指令執(zhí)行后AR0所指向的地址及該地址中存放的數(shù)據(jù)。

.dataAddress .word30000;注意該地址的尾部零的個(gè)數(shù)不能少于由BK確定的值,

;此處BK=6,按照2K>R規(guī)則,K必須大于等于3,即;Addres二進(jìn)制的尾部至少應(yīng)該有3個(gè)0 .textLDP@Address ;裝載數(shù)據(jù)頁(yè)指針LDI6,BK ;設(shè)置循環(huán)空間LDI@Address,AR0 ;初始化AR0,確定第一次尋址時(shí)指針的位置LDI1,R1LDI2,R2LDI3,R3LDI4,R4LDI5,R5 ;裝載寄存器STIR1,*AR0++(4)%STIR2,*AR0--(6)%STIR3,*AR0++(3)%STIR4,*AR0++(5)%STIR5,*AR0++(1)% ;向存儲(chǔ)器中裝入數(shù)據(jù)end表3.5循環(huán)尋址的例子例3.30用循環(huán)尋址實(shí)現(xiàn)FIR濾波器。循環(huán)尋址對(duì)實(shí)現(xiàn)FIR濾波器特別有用。圖3.20是FIR濾波器一種可能的數(shù)據(jù)結(jié)構(gòu),AR0初值指向h(N-1),AR1初值指向x(0)。圖3.20FIR濾波器的數(shù)據(jù)結(jié)構(gòu)

*沖激響應(yīng)

.sect"Impulse_Resp"H .float1.0

.float0.99

.float0.95

.float0.1;輸入緩沖器X .usect"Input_Buf",128

.dataHADDR .wordHXADDR .wordXN .word128

*初始化

LDPHADDR

LDI@N,BK ;裝入塊大小

LDI@HADDR,AR0;裝入沖激響應(yīng)指針

LDI@XADDR,AR1 ;裝入輸入樣本緩沖器底部指針

TOP: LDF IN,R3;讀輸入樣本STF R3,*AR1++% ;存儲(chǔ)其它樣本,并使指針指向緩沖器頂部LDF 0,R0 ;初始化R0LDF 0,R2 ;初始化R2;濾波器RPTS N–1 ;重復(fù)下條指令MPYF3 *AR0++%,*AR1++%,R0||ADDF3 R0,R2,R2 ;相乘,相加ADDF R0,R2 ;最后乘積累加STF R2,Y ;保存結(jié)果BU TOP ;重復(fù)end3.2.7位反轉(zhuǎn)尋址

TMS320C3x的位反轉(zhuǎn)尋址方式可用于實(shí)現(xiàn)快速傅里葉變換(FFT)。當(dāng)數(shù)據(jù)按遞增序列的順序完成FFT變換后,其結(jié)果用位反轉(zhuǎn)次序表示。為了按正確次序恢復(fù)此數(shù)據(jù),必須交換某些存儲(chǔ)位置。若使用位反轉(zhuǎn)尋址方式,就不需要交換數(shù)據(jù)了。數(shù)據(jù)按位反轉(zhuǎn)次序進(jìn)入CPU,而不是順序進(jìn)入。為了達(dá)到正確的位反轉(zhuǎn)入口,其基地址必須定位在一個(gè)邊界上,這個(gè)邊界是由FFT表的大小決定的。和循環(huán)尋址類(lèi)似,位反轉(zhuǎn)尋址的基地址必須遵循以下標(biāo)準(zhǔn):

(1)緩沖器的大小必須小于等于64?KB;

(2)基地址需滿(mǎn)足以下公式:2K≥R,其中K為緩沖器起始地址的最低有效位二進(jìn)制值中“0”的個(gè)數(shù),R為緩沖器的長(zhǎng)度。以2n點(diǎn)的FFT來(lái)說(shuō)明CPU位反轉(zhuǎn)運(yùn)算。當(dāng)實(shí)部和虛部存儲(chǔ)在單獨(dú)的數(shù)組中時(shí),起始地址的最低有效位中必須有n位為0,并且IR0必須等于2n-1(FFT大小的一半)。當(dāng)實(shí)部和虛部存儲(chǔ)在連續(xù)的存儲(chǔ)區(qū)域時(shí)(存儲(chǔ)順序?yàn)椋簩?shí)部0、虛部0、實(shí)部1、虛部1、實(shí)部2、虛部2、……),起始地址的n+1位最低有效位必須為0,并且IR0必須等于2n。用一個(gè)輔助寄存器指向數(shù)據(jù)的物理地址,把IR0的內(nèi)容作為偏移量加到這個(gè)輔助寄存器中,并執(zhí)行高位向低位進(jìn)位的加法運(yùn)算,就可實(shí)現(xiàn)位反轉(zhuǎn)尋址,其中IR0為無(wú)符號(hào)整數(shù),且IR0?=?2n-1。例3.31位反轉(zhuǎn)尋址。假定一個(gè)8位的輔助寄存器AR2賦值01100000(96)是存儲(chǔ)器數(shù)據(jù)起始地址,若此存儲(chǔ)器有16條記錄,IR0被賦值00001000(8),下列指令順序執(zhí)行后的結(jié)果是:

*AR2++(IR0)B;AR2?=?01100000(第0個(gè)值)

*AR2++(IR0)B;AR2?=?01101000(第1個(gè)值)

*AR2++(IR0)B;AR2?=?01100100(第2個(gè)值)

*AR2++(IR0)B;AR2?=?01101100(第3個(gè)值)

*AR2++(IR0)B;AR2?=?01100010(第4個(gè)值)

*

AR2++(IR0)B;AR2?=?01101010(第5個(gè)值)

*AR2++(IR0)B;AR2?=?01100110(第6個(gè)值)

*AR2;AR2?=?01101110(第7個(gè)值)表3.6說(shuō)明了利用位反轉(zhuǎn)尋址對(duì)FFT數(shù)據(jù)進(jìn)行倒序的結(jié)果,表中左邊兩列為倒序前的序列,右邊兩列為倒序后的序列。表3.6變址步數(shù)和位反轉(zhuǎn)尋址3.3尋址方式

3.3.1普通尋址方式普通尋址方式涉及到的指令一般都是通用指令,如LDI、STI、ADDI、MPYI等。普通尋址方式的32位指令機(jī)器編碼如表3.7所示。其中第31~29位是尋址方式的標(biāo)識(shí)位,這三位為0表示普通尋址方式指令。第28~23位存放的是操作指令的機(jī)器代碼。第20~16位存放的是目的操作數(shù)的機(jī)器編碼。第22~21位(G)確定了源操作數(shù)的尋址類(lèi)型,當(dāng)G?=?00時(shí),表示源操作數(shù)的尋址類(lèi)型為寄存器尋址,在第7~0位存放寄存器的代碼;當(dāng)G=01時(shí),表示源操作數(shù)的尋址類(lèi)型為直接尋址,在第15~0位存放源操作數(shù)的機(jī)器編碼;當(dāng)G?=?10時(shí),表示源操作數(shù)的尋址類(lèi)型為間接尋址,第15~11位(modn)表示間接尋址的方式,第10~8位存放輔助寄存器ARn(AR0~AR7)的機(jī)器代碼,第7~0位顯示的是偏移量(disp)的機(jī)器編碼;當(dāng)G?=?11時(shí),表示源操作數(shù)的尋址類(lèi)型為立即數(shù)尋址,第15~0位用于存放源操作數(shù)。表3.7普通尋址方式的編碼3.3.2三操作數(shù)尋址方式三操作數(shù)尋址方式針對(duì)的是三操作數(shù)指令,如ADDI3、CMPF3、XOR3等。三操作數(shù)尋址方式的機(jī)器編碼如表3.8所示,其中機(jī)器碼的位31~29設(shè)置為001,表示三操作數(shù)尋址方式,位28~23用于存放操作指令的機(jī)器代碼,位15~8用于存放源操作數(shù)1(src1)的機(jī)器碼,位7~0用于存放源操作數(shù)2(src2)的機(jī)器碼。位22~21(T)確定了源操作數(shù)的尋址方式,當(dāng)T?=?00時(shí),src1、src2的尋址方式都為寄存器尋址;當(dāng)T?=?01時(shí),src1的尋址方式為間接尋址,src2的尋址方式為寄存器尋址;當(dāng)T?=?10時(shí),src1的尋址方式為寄存器尋址,src2的尋址方式為間接尋址;當(dāng)T?=?11時(shí),src1、src2的尋址方式都為間接尋址。在三操作數(shù)的間接尋址方式中,可以使用索引寄存器IR0或IR1,但偏移值只限0和1。表3.8三操作數(shù)尋址方式的編碼3.3.3并行尋址方式使用并行尋址方式可以利用并行指令最大程度地節(jié)省指令的執(zhí)行時(shí)間。在并行尋址方式中,位31~30為10,標(biāo)識(shí)并行尋址方式;位29~26存放操作的指令代碼;位25~24確定并行方式,對(duì)操作數(shù)的使用進(jìn)行解釋?zhuān)晃?3~22確定目的操作數(shù)(dst)的寄存器形式,位21~19用于存放源操作數(shù)1(src1),位18~16用于存放源操作數(shù)2(src2),位15~8用于決定源操作數(shù)3(src3),位7~0用于決定源操作數(shù)4(src4)。并行尋址中操作數(shù)的具體要求如下:

src1:R0~R7

溫馨提示

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

評(píng)論

0/150

提交評(píng)論