算术运算程序_第1页
算术运算程序_第2页
算术运算程序_第3页
算术运算程序_第4页
算术运算程序_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

算术运算程序2026/7/919:442基本算术运算包括:

加减法和乘法运算除法运算长字和并行运算

2026/7/919:443

算术运算程序

1

加、减法和乘法运算在数字信号处理中,加法和乘法运算是最常见的算术运算。【例1】计算y=a

x+b程序:

LD@a,T

;取a值,T=aMPY@x,B

;完成ax乘积,B=axADD@b,B

;完成ax+b运算,B=ax+bSTLB,@y

;计算结果存入y中2026/7/919:4441

加、减法和乘法运算【例2】计算y=xl

al+x2

a2

程序:

LD@x1,TMPY@a1,BLD@x2,TMAC@a2,BSTLB,@ySTHB,@y+1;T=x1;B=x1a1;T=x2;乘法累加,B=x1a1+x2a2;计算结果的低字BL存入y中;计算结果的高字BH存入y+1中2026/7/919:4451

加、减法和乘法运算【例3】计算y=

程序:

*********************************************example.asm*********************************************

.title“example.asm”

.mmregs

stack.usect“STACK”,10h

.bssa,4

.bssx,4.bssy,1.defstart.data

;为堆栈指定空间

;为变量分配9个字的空间2026/7/919:4461

加、减法和乘法运算【例3】计算y=

程序:

table:

.word1,2,3,4

.word8,6,4,2.text

start:STM#0,SWWSR

STM#STACK+10h,SP

STM#a,AR1RPT#7

MVPDtable,*AR1+

CALLSUMend:Bend

;变量初始化;插入0个等待状态;设置堆栈指针;

AR1指向a;移动8个数据;从程序存储器到数据存储器;调用SUM子程序

2026/7/919:4471

加、减法和乘法运算【例3】计算y=

程序:

SUM:STM#a,AR3STM#x,AR4RPTZA,#3MAC*AR3+,*AR4+,ASTLA,@yRET.end

;子程序执行2026/7/919:4481

加、减法和乘法运算【例4】求4项乘积aixi(i=1,2,3,4)中的最大值,并存放累加器A中。

程序:

STM#a,AR1STM#x,AR2STM#2,AR3LD*AR1+,TMPY*AR2+,Aloop1:LD*AR1+,TMPY*AR2+,BMAXABANZloop1,*AR3-;ai首地址a给AR1;xi首地址x给AR2;设置计数器AR3=2;取系数T=ai,并修改AR1;乘法运算A=aixi,并修改AR2

;取系数T=ai,并修改AR1;乘法运算B=aixi,并修改AR2

;求A和B中的最大值

;若AR3≠0,则循环,并修改AR3

若AR3=0,则不循环

2026/7/919:449

算术运算程序

2

除法运算在’C54x中没有除法器硬件,也没有专门的除法指令。但是,利用条件减法指令(SUBC)和重复指令(RPT)可实现两个无符号数的除法运算。条件减法指令:

SUBCSmem,src

功能:(src)-(Smem)<<15→ALU输出端若ALU输出0,则(ALU输出)<<1+1→src

否则(src)<<1→src重复指令:

RPT#K

功能:RC=#K,重复执行下条指令K+1次。2026/7/919:44102

除法运算1.

|被除数|<|除数|例:编写0.4÷(-0.8)的程序数据存储器

.bssnum,1num分子

.bssden,1den分母

.bssquot,1quot商::

.data

table

.word4*32768/10;0.4.word-8*32768/10;-0.8

table0.4-0.8

.textstart:STM#num,AR1

AR1num

RPT#1MVPDtable,*AR1+0.4-0.8quot2026/7/919:44112

除法运算1.

|被除数|<|除数|例:编写0.4÷(-0.8)的程序0.4::-0.8商-0.80.4数据存储器numdenquottableAR1quot

LD@den,16,A;分母送AH

MPYA@num;商符号送B(num)×AH→B,即分子×分母→B,取符号。

ABSA;取分母绝对值

STHA,@den0.8

LD@num,16,A;分子送AH

ABSA;取分子绝对值

RPT#14SUBC@den,A

;15次减法循环完成除法

XC1,BLT

;若B<0,则变号

NEGA

STLA,@quot

;保存商-0.52026/7/919:44122

除法运算1.

|被除数|<|除数|例:编写0.4÷(-0.8)的程序运行结果:被除数

除数

商(十六进制)

商(十进制)

4*32

768/10(0.4)-8*32

768/10(-0.8)0xC000-0.5-1281

0240xF000-0.1252026/7/919:44132

除法运算2.

|被除数|>|除数|例:编写16384÷512的程序

.bssnum,1.bssden,1.bssquot,1.datatable

.word16

384.word512.textstart:STM#num,AR1RPT#1MVPDtable,*AR1+

;16

384

;512

;传送2个数据至分子、分母单元2026/7/919:44142

除法运算2.

|被除数|>|除数|例:编写16384÷512的程序

LD@den,16,AMPYA@numABSASTHA,@denLD@num,AABSARPT#15SUBC@den,AXC1,BLTNEGASTLA,@quot

;将分母移到累加器A(31~16)

;(num)*A(32~16)→B,获取商的符号

;分母取绝对值

;分母绝对值存回原处

;分子→A(32~16)

;分子取绝对值

;16次减法重复操作,完成除法

;如果B<0(商是负数),则需要变号

;保存商

2026/7/919:44152

除法运算2.

|被除数|>|除数|例:编写16384÷512的程序运行结果:被除数

除数

商(十六进制)

商(十进制)

16

3845120xC0203266*32

768/100(0.66)-33*32

768/100(-0.33)0xFFFE-2注意:SUBC指令仅对无符号数进行操作,因此先对被除数和除数取绝对值,然后利用乘法操作获取商的符号,最后通过条件操作指令给商加上适当的符号。2026/7/919:4416

算术运算程序

3

长字运算和并行运算长字指令:

DLDLmem,dstDSTsrc,LmemDADDLmem,src[,dst]DSUBLmem,src[,dst]

DRSUBLmem,src[,dst]1.长字运算

;dst=Lmem单周期

;Lmem=src双周期

;dst=src+Lmem单周期

;dst=src-Lmem单周期

;dst=Lmem-src单周期

’C54x可以利用32位长操作数进行长字运算。

2026/7/919:44171.长字运算

长字的排列方式偶地址排列奇地址排列(1)

偶地址排列如:

DLD*AR3+,A

执行前:A

0000000000

AR3

0100数据存储器0100h6

C

A

C0101hB

D

9

0高字低字执行后:A

0000000000

AR3

01006CAC0101BD900102

指令中给出的地址为偶地址,则存储器低地址存放高16位操作数。

2026/7/919:44181.长字运算

(1)

偶地址排列【例5】偶地址排列法举例。

.bssa,2.bssy,2.datatable:.word06CACH,0BD90H.text

…STM#a,AR1RPT#1MVPDtable,*AR1+STM#a,AR3DLD*AR3+,A执行前:

A=00

0000

0000h

AR3=0100h

(0100h)=6CACh(高字)

(0101h)=BD90h(低字)执行后:

A=00

6CAC

BD90h

AR3=0102h(0100h)=6CACh(0101h)=BD90h

2026/7/919:44191.长字运算

(2)

奇地址排列

如:

DLD*AR3+,A

执行前:A

0000000000

AR3

0101数据存储器0100h6

C

A

C0101hB

D

9

0低字高字执行后:A

0000000000BD906CAC

AR3

010101020103

指令中给出的地址为奇地址,则存储器低地址存放低16位操作数。

2026/7/919:44201.长字运算

(2)

奇地址排列【例6】奇地址排列法举例。

.bssa,2.bssy,2.datatable:.word06CACH,0BD90H.text

…STM#a,AR1RPT#1MVPDtable,*AR1-STM#a,AR3DLD*AR3+,A执行前:

A=00

0000

0000h

AR3=0101h

(0100h)=6CACh(低字)

(0101h)=BD90h(高字)执行后:

A=00

BD90

6CAC

h

AR3=0103h(0100h)=6CACh(0101h)=BD90h

2026/7/919:4421【例7】计算Z32

=X32+Y32。

标准运算

.bssxhi,1

.bssxlo,1

.bssyhi,1

.bssylo,1

.bsszhi,1

.bsszlo,1

…数据存储器xhiX31~X16xloX15~X0……yhiY31~Y16yloY15~Y0……zhizlo

LD@xhi,16,AADDS@xlo,AADD@yhi,16,AADDS@ylo,ASTHA,@zhiSTLA,@zloAGAHAL

LD@xhi,16,AX31~X160

0

0

0X31~X160

0

0

0

ADDS@xlo,A+X15~X0

X31~X16X15~X0

X15~X0

ADD@yhi,16,A+Y31~Y160

0

0

0

Z31~Z16X15~X0

Z31~Z16X15~X0

ADDS@ylo,A+Y15~Y0

Z31~Z16Z15~Z0

Z15~Z0

STHA,@zhiZ31~Z16

STLA,@zlo

Z15~Z0

6字,6T2026/7/919:4422【例7】计算Z32

=X32+Y32。

标准运算数据存储器xhiX31~X16X15~X0……yhiY31~Y16Y15~Y0……zhi

LD@xhi,16,AADDS@xlo,AADD@yhi,16,AADDS@ylo,ASTHA,@zhiSTLA,@zlo

6字,6T长字运算

.bssxhi,2,1,1

.bssyhi,2,1,1.bsszhi,2,1,1

DLD@xhi,ADADD@yhi,ADSTA,@zhi

AGAHAL

DLD@xhi,A

X31~X16X15~X0X31~X16X15~X0

DADD@yhi,A+Y31~Y16Y15~Y0

Z31~Z16Z15~Z0Z31~Z16Z15~Z0

DSTA,@zhi

Z31~Z16Z15~Z0

3字,3T2026/7/919:44233

长字运算和并行运算2.并行运算

并行运算就是同时利用D总线和E总线,通过并行指令来实现数据的加载和算术运算。

D总线用来执行加载或算术运算。E总线用来存放先前的结果。

并行指令:并行加载和乘法指令并行加载和存储指令并行存储和乘法指令并行存储和加/减指令2026/7/919:44242.并行运算

LD||MAC[R]LD||MAS[R]

例如:

LDXmem,dst1||MAC[R]Ymem,[,dst2]

功能:dst1=Xmem<<16;dst2=dst2+T*Ymem。并行加载和乘法指令:2026/7/919:44252.并行运算

ST||LD

例如:

STsrc,Ymem||LDXmem,dst

功能:Ymem=src>>(16-ASM);dst=Xmem<<16。并行加载和存储指令:2026/7/919:44262.并行运算

ST||MPYST||MAC[R]ST||MAS[R]

例如:

STsrc,Ymem||MAC[R]Xmem,dst

功能:Ymem=src>>(16-ASM);dst=dst+T*Xmem。并行存储和乘法指令:2026/7/919:44272.并行运算

ST||ADDST||SUB

例如:

STsrc,Ymem||ADDXmem,dst

功能:Ymem=src>>(16-ASM);dst=dst+Xmem。并行存储和加/减指令:2026/7/919:44282.并行运算

并行指令均为单字单周期指令;并行指令先存储,后加载或算术运算;并行指令的操作均在累加器的高位中进行,并且大多数指令受ASM位的影响。2026/7/919:44292.并行运算

【例8】编写计算z=x+y和f=e+d的程序xyz……def

·

bssx,3

·

bssd,3STM#x,AR5STM#d,AR2LD#0,ASMLD*AR5+,16,AADD*AR5+,16,ASTA,*AR5||LD*AR2+,BADD*AR2+,16,BSTHB,AR2

·

bssx,3

·

bssd,3

STM#x,AR5

LD#0,ASM

LD*AR5+,16,A

ADD*AR5+,16,A

STA,*AR5

||LD*AR2+,B

ADD*AR2+,16,B

STHB,AR2

STM#d,AR22026/7/919:44303

长字运算和并行运算3.

64位加法和减法运算

可利用长字指令可完成64位数的加减运算。【例9】编写完成Z64

=

W64+X64-Y64的程序。运算过程:W64:X64:w3w2w1w0

x3x2x1x0

+s1s0

Cs3s2

S64:S64=s3s2s1s0

s1s0=w1w0+x1x0

s3s2=w3w2+x3x2+CY64:y3y2y1y0

-z1z0

Oz3z2

Z64:Z64=z3z2z1z0

z1z0=s1s0-y1y0

z3z2=s3s2-y3y2-O2026/7/919:44313.64位加法和减法运算

【例9】编写完成Z64

=

W64+X64-Y64的程序。程序:

DLD@w1,ADADD@x1,ADLD@w3,BADDC@x2,BADD@x3,16,BDSUB@y1,ADSTA,@z1SUBB@y2,BSUB@y3,16,BDSTB,@z3;A=w1w0;A=s1s0,产生C;B=w3w2;B=w3w

温馨提示

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

最新文档

评论

0/150

提交评论