运用TMS320C54x汇编语言编写定点数运算浮点数运算程Word格式.docx

上传人:b****5 文档编号:19420874 上传时间:2023-01-06 格式:DOCX 页数:15 大小:79.29KB
下载 相关 举报
运用TMS320C54x汇编语言编写定点数运算浮点数运算程Word格式.docx_第1页
第1页 / 共15页
运用TMS320C54x汇编语言编写定点数运算浮点数运算程Word格式.docx_第2页
第2页 / 共15页
运用TMS320C54x汇编语言编写定点数运算浮点数运算程Word格式.docx_第3页
第3页 / 共15页
运用TMS320C54x汇编语言编写定点数运算浮点数运算程Word格式.docx_第4页
第4页 / 共15页
运用TMS320C54x汇编语言编写定点数运算浮点数运算程Word格式.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

运用TMS320C54x汇编语言编写定点数运算浮点数运算程Word格式.docx

《运用TMS320C54x汇编语言编写定点数运算浮点数运算程Word格式.docx》由会员分享,可在线阅读,更多相关《运用TMS320C54x汇编语言编写定点数运算浮点数运算程Word格式.docx(15页珍藏版)》请在冰豆网上搜索。

运用TMS320C54x汇编语言编写定点数运算浮点数运算程Word格式.docx

不需要左移一位。

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

.mmregs

STACK:

.usect“STACK”,100h;

设置堆栈段

.bssX0,1

.bssX1,1

.bssY0,1

.bssY1,1

.bssW0,1

.bssW1,1

.bssW2,1

.bssW3,1

.defstart

.data

table1:

.word1

.word2

table2:

.word3

.word4

.text

start:

STM#X0,AR2;

将X0的首地址存入AR2

STM#Y0,AR3;

将Y0的首地址存入AR3

RPT#1;

设置重复执行两次下条指令

MVPDtable1,*AR2+;

将table1开始的两个值传给X0

MVPDtable2,*AR3+;

将table2开始的两个值传给Y0

STM#X0,AR2;

LD*AR2,T;

T=X0

MPYU*AR3+,A;

A=无符号数X0⨯无符号数Y0

STLA,@W0;

将A送入W0

LDA,-16,A;

A值左移16位

MACSU*AR2+,*AR3-,A;

A+=Y1⨯无符号数X0

MACSU*AR3+,*AR2,A;

A+=X1⨯无符号数Y0

STLA,@W1;

将A送入W1

MAC*AR2,*AR3,A;

A+=11XY⨯

STLA,@W2;

W2=A的低16位

STHA,@W3;

W3=A的高16位

here:

Bhere

程序分析:

如原理图所示,32位整数乘法的计算过程是将两个32位的数X和Y各自分成X0、X1和Y0、Y1的16位数。

然后进行X0⨯Y0,A值左移16位,Y1⨯X0,X1⨯Y0,A值再左移16位,X1⨯Y1的操作。

需要注意的是在32位乘法运算中,实际上包括了三种乘法运算:

U⨯U、S⨯U和S⨯S。

U指无符号数,S指带符号数。

在编程时,要用到以下三条乘法指令:

MACSUXmem,Ymem,src;

无符号数与带符号数相乘并累加;

MPYUSmem,dst;

无符号数相乘;

MACXmem,Ymem,src;

两个带符号数数相乘并累加。

32位小数乘法参考程序:

;

ThisroutinemultipliestwoQ31signedintegers

resultinginaQ30product.Theoperandsarefetchedfromdatamemoryand;

theresultiswrittenbacktodatamemory

datastorege:

X1,X0Q31operand

Y1,Y0Q31operand

W1,W0Q30product

SXM=1,OVM=0;

.mmregs

.usect“STACK”,100h

将Y0的首地址存入AR2

将table1开始的两个值传给Y0

STM#Y1,AR3;

将Y1的首地址存入AR3

LD#0,A;

将A置0

A=X0⨯Y1

A+=X1⨯Y0

将A左移16位

A+=X1⨯Y1

将结果A的低16位送入W0

STHA,@W1;

将结果A的高16位送入W0

小数乘法与整数乘法的程序设计大致类似,不同在于小数乘法少了X与Y的低位相乘部分,即X0与Y0的相乘部分。

这是因为两个整数相乘时,乘积总是“向左增长”。

这意味着多次相乘后,乘积将会很快超出定点器件的控制范围。

但是,当两个小数相乘时,乘积总是“向右增长”。

这就意味着超出定点器件数据范围将是我们不感兴趣的部分,也就是指X0与Y0相乘得到的结果那部分,因此可不必计算这部分乘积。

有符号/无符号整数除法参考程序;

Description:

32bitby16bitUnsignedIntegerDivideAndModulus

32位除16位的无符号整数除法

.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

DivModUI32:

RSBXSXM;

signextentionmodeoff

LDd_NumH,A;

将分子高位移到累加器A

RPT#(16–1;

重复执行下一条指令15次

SUBCd_Den,A;

A减去分母的值

STLA,d_QuotH;

将A的值存到商的高位

XORd_QuotH,A;

将A的低16位清零

ORd_NumL,A;

AL=NumL

STLA,d_QuotL;

将A的值存到商的低位

STHA,d_Rem;

RET

STMd_NumL,AR2;

将分子低16位所在单元的地址传给AR2

STMd_Den,AR3;

将分母所在单元的地址传给AR2

重复执行两次下一条指令

将table1开始的两个值传给AR2

MVPDtable2,*AR3;

将table2开始的值传给AR3

CALLDivModUI32;

调用除法子程序

16bitby16bitUnsignedIntegerDivideAndModulus

16位除16位的无符号整数除法

.bssd_Num,1;

为分子分配单元

为分母分配单元

.bssd_Quot,1;

为商分配单元

.bssd_Rem,1

.defDivModUI16;

定义16位除法子程序

.word1000

.word5

DivModUI16:

LD@d_Num,A;

将分子移到累加器A

重复执行下面指令16次

SUBC@d_Den,A;

16次的减法循环,完成除法

STLA,@d_Quot;

将A的结果保存为商

STHA,@d_Rem

将分子低16位所在单元的首地址传给AR2

将分子低16位所在单元的首地址传给AR3

MVPDtable1,*AR2;

将table1开始的值传给AR2

CALLDivModUI16;

DSP做除法运算时,通过减法指令与重复循环指令实现无符号除法运算。

需要注意的是,当被除数的绝对值<

除数的绝对值时,商为小数;

当被除数的绝对值>

除数的绝对值时,商为整数。

32bitby16bitsignedIntegerDivideAndModulus

32位除16位有符号除法

为分子低16位分配单元

为分子高16位分配单元

为商低16位分配单元

为商高16位分配单元

.defDivModI32;

定义32位除法子程序

DivModI32:

SSBXSXM;

signextentionmodeon

LDd_Den,16,A;

将分母移到累加器

MPYAd_NumH;

Bhassignofquotient

ABSA;

分母取绝对值

STHA,d_Rem;

d_Rem=abs(Dentemporarily

LDd_NumH,16,A;

将分子高16位移到A

ADDSd_NumL,A;

A加上分子低16位

取A绝对值

STHA,d_QuotH;

d_QuotH=abs(NumHtemporarily

STLA,d_QuotL;

d_QuotL=abs(NumLtemporarily

LDd_QuotH,A;

将商的高位移到A

重复执行下条指令16次

SUBCd_Rem,A;

16次减法循环运算,完成除法

STLA,d_QuotH;

AH=abs(QuotH;

clearAL

ORd_QuotL,A;

AL=abs(NumL

AL=abs(QuotL

AH=Rem

BCDDivModI32Skip,BGEQ;

ifBneg,thenQuot=–abs(QuotLDd_QuotH,16,A;

将商的高16位移到A

ADDSd_QuotL,A;

A加上商的低16位

NEGA;

如果B<

0执行求反,否则跳过此指令

商的高位存回原处

商的低16位存回原处

DivModI32Skip:

RET;

定义32位除法返回子程序

将分子低16位首地址传给AR2

将分母首地址传给AR2

重复执行下条指令两次

将table1开始的两个值传给AR2MVPDtable2,*AR3;

将table2开始的值传给AR2

CALLDivModI32;

调用32位除法指令

16bitby16bitsignedIntegerDivideAndModulus

16位除16位有符号除法

.defDivModI16;

.word16

.word-2

DivModI16:

STM#d_Quot,AR2;

将商的值传给AR2

将分母移到A累加器

MPYAd_Num;

d_Rem=abs(Dentemporarily;

LDd_Num,A;

将分子移到A累加器

分子取绝对值

分子循环相减16次,完成除法

STLA,d_Quot;

将A的值保存到商

将A清零

SUBd_Quot,16,A;

AH=–abs(Quot

SACCDA,*AR2,BLT;

IfBneg,Quot=–abs(Quot

将分子低16位首地址传给AR2

将分母16位首地址传给AR2

CALLDivModI16;

有符号数除法与无符号数出发类似。

不同在于,有符号数除法得到的商的结果可能为正,也可能为负。

因此在用绝对值求出商后,不能直接存入quot段。

先要判断商值为正还是为负。

如果有符号数的商为负值时,需要变号,用到取反指令negA,然后才能将值存入quote段中。

二、浮点数的运算

在数字信号处理中,定点运算是将数据的整数和小数部分分开,小数点在一个固定位置,其优点是硬件实现比较容易,但动态范围受到限制。

为了扩大数据的范围和精度,需要采用浮点运算。

在C54X上实现浮点运算,操作数须先变成定点数,然后再返回浮点数。

通过规格化输入数据,可以将定点值变换为浮点值。

表示方法一个浮点数由尾数m、基数b和指数e三部分组成,即b

fN=me⨯

浮点数的加减法运算,计算过程是左移指数较小的操作数的尾数,使得两个操作数的指数一致,相差几位移几位,再把尾数相加(减,归一化后输出。

主要是要比较两个操作数指数的大小,这样才能决定到底是尾数直接相加(减还是移位以后再相加(减。

若e1e2>

则b1b2-b1b1x1+x2=m1e+m2ee⨯⨯⨯(

b2-b1b1=m1+m2ee⨯⨯(。

浮点数的乘法运算,要经过分离指数和尾数,进行算术运算,估计结果的符号位,以及最后的归一化存储这几个过程。

做乘法运算时要遵循乘法运算的规则把指数相加,尾数相乘。

即:

12x1x2=mmebb+⨯⨯⨯(12

需要注意的是,由于C54X的乘法器在一个指令周期内只能完成17bit*17bit的二进制补码运算,故相乘运算需要分步实现。

浮点数的除法运算与乘法运算浮点数的乘法运算类似,同样要经过分离指数和尾数,估计结果的符号位,对指数进行相减运算,对尾数进行相除运算,以及最后的归一化存储这几

个过程。

12x1x2=mmebb-÷

÷

⨯(12

不同的是,在执行除法运算的时候,需要将除数和被除数都由24bit左移成32bit的形式,以减少误差。

不管是浮点数的加减运算还是乘除运算,完成对操作数之间的计算后就需要对结果数进行归一化操作。

所谓归一化操作就是把数据格式转换为第一位为符号位,紧接着的一位是非零的数的格式。

归一化完后要再把归一化后的定点数转变为浮点数。

下面来以浮点数的乘法运算为例具体分析浮点数的运算过程:

设是对两个数x1和x2进行乘法运算。

将被乘数数x1的尾数分为Q,R和S三部分,Q表示尾数的高位的8bit,R和S表示尾数低位的两字节。

同样,乘数x2也被分为X,Y和Z三部分,X表示尾数的高位,Y和Z表示尾数低位的两字节。

于是有

需要注意的是,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 图表模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1