部分汇编语言程序设计.ppt

上传人:牧羊曲112 文档编号:6146782 上传时间:2023-09-29 格式:PPT 页数:71 大小:704KB
返回 下载 相关 举报
部分汇编语言程序设计.ppt_第1页
第1页 / 共71页
部分汇编语言程序设计.ppt_第2页
第2页 / 共71页
部分汇编语言程序设计.ppt_第3页
第3页 / 共71页
部分汇编语言程序设计.ppt_第4页
第4页 / 共71页
部分汇编语言程序设计.ppt_第5页
第5页 / 共71页
点击查看更多>>
资源描述

《部分汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《部分汇编语言程序设计.ppt(71页珍藏版)》请在三一办公上搜索。

1、1,数字信号处理器 Digital Signal Processor第六部分 汇编语言程序设计,纪震博士Dr.Ji ZhenShenzhen Univ.-Texas Instruments DSPs Lab2003.01,Dr.JI ZHEN,2,C54x汇编语言程序设计的基本方法(1)程序的控制与转移(2)堆栈的使用方法(3)加、减法和乘法运算(4)重复操作(5)数据块传送(6)双操作数乘法(7)长字运算和并行运算(8)小数运算(9)除法运算(10)浮点运算,Dr.JI ZHEN,3,1 程序的控制与转换,基本的程序控制指令,Dr.JI ZHEN,4,1 程序的控制与转换,条件算符,组间条件

2、只能“或”第一组两类条件可以“与”/“或”,但累加器必须是同一个第二组三类条件可以各选一个条件“与”/“或”同组同类条件不能选择两个,Dr.JI ZHEN,5,1 程序的控制与转换,例1,RCTC;TC=1返回,TC=0继续CCsub,BNEQ;B0,调用sub,B=0继续BCnew,AGT,AOV;A0且溢出(“与”的关系),转new,否则继续,若例1中两个条件相“或”怎么办?,分写成两条指令:BC new,AGTBC new,AOV,Dr.JI ZHEN,6,1 程序的控制与转换,计算y=xi(i=1,2,5),主要程序如下:.bssx,5.bssy,1STM#x,AR1STM#4,AR2

3、LD#0,Aloop:ADD*AR1+,ABANZ loop,*AR2-STLA,y,利用BANZ指令进行循环操作,Dr.JI ZHEN,7,1 程序的控制与转换,指定的ARn寄存器(n=17)与AR0比较,测试条件成立TC置1 STM#5,AR1 STM#10,AR0 loop:MAR*AR1+CMPR LT,AR1 BC loop,TC,利用CMPR指令进行比较操作,Dr.JI ZHEN,8,2 堆栈的使用方法,堆栈的设置:size.set100stack.usectSTK,sizeSTM#stack+size,SP堆栈用法:CALLPC+1(N)放入堆栈,SP-1SPRET 弹出PC,S

4、P+1 SP注意:在链接命令文件中要为堆栈区定位,例如STK:DARAMPAGE1见EXAMPLE.ASM和EXAMPLE.CMD,Dr.JI ZHEN,9,链接命令文件 example.cmd,vectors.objexample.obj-o example.out-m example.map-e startMEMORY PAGE 0:EPROM:org=0E000h,len=100h VECS:org=0FF80h,len=80h PAGE 1:SPRAM:org=0060h,len=20h DARAM:org=0080h,len=100h,Dr.JI ZHEN,10,链接命令文件 exa

5、mple.cmd(续),SECTIONS.text:EPROM PAGE 0.bss:SPRAM PAGE 1.data:DARAM PAGE 1 STACK:DARAM PAGE 1 Vectors:VECS PAGE 0,Dr.JI ZHEN,11,example.asm程序清单,*example.asm y=a1*x1+a2*x2+a3*x3+a4*x4*.title example.asmSTACK usect STACK,10h;allocate space for stack.bss x,4;allocate 9 word for variables.bss a,4.bss y,1

6、.def start.data table:.word 1,2,3,4;data follows.word 8,6,4,2,Dr.JI ZHEN,12,example.asm程序清单(续),.text;code follows.start:STM#STACK+10h,SP;set stack pointer STM#table,AR1;AR1 point to table STM#x,AR2;AR2 point to x STM#7,AR0 LD#0,Aloop:LD*AR1+,A;move 8 values STL A,*AR2+;from program memory BANZ loop,

7、*AR0-;into data memory CALL SUM;call SUM subroutineend:B end,Dr.JI ZHEN,13,example.asm程序清单(续),.SUM:STM#a,AR3;The subroutine;implement STM#x,AR4;multiply-;accumulate RPTZ A,#3 MAC*AR3+,*AR4+,A STL A,y RET.end,Dr.JI ZHEN,14,3 加、减法和乘法运算,例:z=x+y-wLD x,AADD y,ASUB w,ASTL A,z例:y=mx+bLD m,TMPYx,AADD b,ASTL

8、 A,y,Dr.JI ZHEN,15,3 加、减法和乘法运算,例:y=x1*a1+x2*a2 LD x1,TMPYa1,BLD X2,TMACa2,BSTL B,ySTH B,y+1,Dr.JI ZHEN,16,3 加、减法和乘法运算,例:例8 在表31的4项乘积 aixi(i=1,2,3,4)中 找出最大值,并放在累加器A中 STM#a,AR1 STM#x,AR2 STM#2,AR3 LD*AR1+,T MPY*AR2+,A;第一个乘积在累加器A中loop1:LD*AR1+,T MPY*AR2+,B;其它乘积在累加器B中 MAX A;累加器A和B比较,选大的存在A中 BANZ loop1,*

9、AR3-;此循环中进行3次乘法和比较,Dr.JI ZHEN,17,4重复操作,C54x有3条重复操作指令:RPT(重复下一条指令)RPTZ(累加器清0并执行下一条指令)RPTB(程序块重复指令)利用这些指令进行循环,比BANZ指令快,Dr.JI ZHEN,18,4.1 重复执行单条指令,例:对一个数组进行初始化:x5=0,0,0,0,0.bss x,5STM#x,AR1LD#0,ARPT#4STLA,*AR1+或者.bssx,5STM#x,AR1RPTZA,#4STL A,*AR1+,Dr.JI ZHEN,19,4.1 关于重复单条指令,重复指令只需取指一次,进行循环比BANZ效率高重复执行n

10、次,指令中计数值设为n-1重复操作使多周期指令(MAC、MVDK和MVPD等)变成单周期指令重复操作期间,CPU不响应中断(RS除外),Dr.JI ZHEN,20,4.2 程序块重复操作,程序块重复操作指令RPTB将重复操作的范围扩大到任意长度的循环路,循环开销为0循环起始地址为下一行的地址块重复操作前,必须先将迭代次数加载到BRC(块重复计数器)RPTB指令可以响应中断,Dr.JI ZHEN,21,4.2 程序块重复操作举例,例:.bssx,5begin:LD#1,16,BSTM#4,BRC;BRC 4RPTB next-1;next-1为循环结束地址ADD*AR4,16,B,ASTHA,*

11、AR4+Next:LD#0,B,Dr.JI ZHEN,22,4.2 三重循环嵌套结构举例,Dr.JI ZHEN,23,4.2 三重循环的开销,Dr.JI ZHEN,24,5 数据块传送,C54x有10条数据传送指令(见下页中的表),这些指令的特点如下:传送速度比加载和存储指令要快;传送数据不需要通过累加器;可以寻址程序存储器;与RPT指令相结合(重复时,这些指令都变成单周期指令),可以实现数据块传送。,Dr.JI ZHEN,25,5.1 数据传送指令,Dr.JI ZHEN,26,5.2 程序存储器数据存储器,例:数组x5=1,2,3,4,5初始化。程序存储器.dataTBL:.word 1,2

12、,3,4,5.sect“.vectors”B START.bss x,5.textSTART:STM#x,AR5 RPT#4 MVPD TBL,*AR5+,dataPM bssDM,Dr.JI ZHEN,27,5.2 数据存储器数据存储器,例:编写一段程序将数据存储器中的数组x20复制到数组y20.bss x,20.bss y,20.text LD#x,AR2 LD#y,AR3 RPT#19 MVDD*AR2+,*AR3+,Dr.JI ZHEN,28,6 双操作数乘法,单周期内通过C总线和D总线寻址两个数据用间接寻址方式获得操作数,且只能用AR2AR5占用的程序空间小运行的速度快,Dr.JI

13、ZHEN,29,6.1 MAC型双操作数指令,Dr.JI ZHEN,30,6.2 单、双操作数乘法的区别,如果要求y=mx+b,单操作数方法和双操作数方法分别为:,如用双操作数指令编程的特点为:用间接寻址方式获得操作数,且只能用AR2AR5;占用的程序空间小;运行的速度快。,Dr.JI ZHEN,31,6.3 双操作数乘法(例),编制求乘法累加和的程序段,Dr.JI ZHEN,32,6.3 双操作数乘法(例),Dr.JI ZHEN,33,7.长字运算,c54x可以利用长操作数(32位)进行长字运算。长字指令如:DLD Lmem,dst;dst=LmemDST src,Lmem;Lmem=src

14、DADD Lmem,src,dst;dst=src+LmemDSUB Lmem,src,dst;dst=src-LmemDRSUB Lmem,src,dst;dst=Lmem-src,Dr.JI ZHEN,34,7.长字运算,长操作数在存储器的排列方法偶地址排列法奇地址排列法长操作数地址排列法指令中给出的地址为偶地址存储器中低地址存放高16位存储器中高地址存放底16位,Dr.JI ZHEN,35,偶地址排列法举例DLD*AR3+,A 执行前:执行后:A=00 0000 0000 A=00 6CAC BD90 AR3=0100 AR3=0102(0100h)=6CAC(高字)(0100h)=6C

15、AC(0101h)=BD90(低字)(0101h)=BD90,7.1 长操作数在存储器的排列方法,奇地址排列法举例DLD*AR3+,A 执行前:执行后:A=00 0000 0000 A=00 BD90 6CAC AR3=0101 AR3=0103(0100h)=6CAC(低字)(0100h)=6CAC(0101h)=BD90(高字)(0101h)=BD90,Dr.JI ZHEN,36,7.2 长字运算(例),例:计算 Z32=X32+Y32标准运算长字运算LDxhi,16,ADLDxhi,AADDSxlo,ADADD yhi,AADDyhi,16,ADST A,zhiADDSylo,A(3个字

16、,3个T)STHA,zhiSTLA,zlo(6个字,6个T),符号位不扩展的加法,Dr.JI ZHEN,37,8.并行运算(例),同时利用D总线和E总线4种并行运算指令:并行加载和乘法指令并行加载和存储指令并行存储和乘法指令并行存储和加/减法指令,Dr.JI ZHEN,38,8.1 并行运算(例),例:编写计算 z=x+y 和 f=e+d 程序段.bssx,3.bssd,3STM#x,AR5STM#d,AR2LD#0,ASMLD*AR5+,16,AADD*AR5+,16,AST A,*AR5|LD*AR2+,BADD*AR2+,16,BSTH B,*AR2,Dr.JI ZHEN,39,8.2

17、64位加/减法运算,例:编写计算 Z64=W64+X64-Y64 的程序段W,X,Y和结果Z都是64位数,它们都是由两个32位的长字组成。利用长字指令可以完成64位数的加/减法。DLD w1,A;A=w1w0DADD x1,A;A=w1w0+x1x0,产生进位CDLD w3,B;B=w3w2ADDC x2,B;B=w3w2+x2+CADD x3,16,B;B=w3w2+16x3DSUB y1,A;A=w1w0+x1x0-y1y0,产生借位CDST A,z1;z1z0=w1w0+x1x0-y1y0SUBB y2,B;B=w3w2+x3x2+C-y2-CSUB y3,16,B;B=w3w2+x3x

18、2+C-y3y2-CDST B,z3;z3z2=w3w2+x3x2+C-y3y2-C 由于没有长字带进(借)位加/减法指令,上述程序中只能用16位带进(借)位指令ADDC和SUBB。,Dr.JI ZHEN,40,8.3 32位乘法运算,Dr.JI ZHEN,41,8.3 32位乘法运算,例:编写计算 W32=X32*Y32 的程序段W,X,Y和结果Z都是64位数,它们都是由两个32位的长字组成。利用长字指令可以完成64位数的加/减法。STM#x0,AR2STM#y0,AR3LD*AR2,T;T=x0MPYU*AR3+,A;A=u(x0)*u(y0)STLA,w0;w0=u(x0)*u(y0)L

19、DA,-16,A;A=A16MACSU*AR2+,*AR3-,A;A+=s(y1)*u(x0)MACSU*AR3+,*AR2,A;A+=s(x1)*u(y0)STLA,w1;w1=ALDA,-16,A;A=A16MAC*AR2,*AR3,A;A+=s(x1)*s(y1)STLA,w2;w2=A的底16位STHA,w3;w3=A的高16位,Dr.JI ZHEN,42,8.3 32位乘法运算(续),程序中利用的两条乘法指令MACSUXmem,Ymem,src;带符号数与无符号数相乘并累加;src=S(Xmem)*U(Ymem)+srcMACXmem,Ymem,src;带符号数与带符号数相乘并累加;

20、src=S(Xmem)*S(Ymem)+srcMPYUSmem,dst;无符号数相乘;dst=U(T)*U(Smem),Dr.JI ZHEN,43,8 小数运算,整数相乘,“向左增长”的缺陷开销2个机器周期占用2个字的程序和RAM单元难以递推运算,小数相乘,“向右增长”保存高16位乘积,占用较少资源便于递推运算,Dr.JI ZHEN,44,8.1 小数的表示方法,C54x采用2的补码小数高位为符号位数值范围从-1到+1(1-2-15=0.999969482421875)16位2的补码小数(Q15格式)每个的权值为:MSB LSB-1(0).1/2 1/4 1/8 2-15,Dr.JI ZHEN

21、,45,8.2 十进制小数十六进制小数,1-2-15 7FFFh0.5 正数:乘以327684000h00000h-0.5 负数:其正数部分 乘以32768,再取反加1 C000h-1 8000h,Dr.JI ZHEN,46,8.3 汇编语言程序中小数的写法,不能直接写入十进制小数。举例:定义一个系数0.707.word32768*707/1000,Dr.JI ZHEN,47,8.4 小数乘法与冗余符号位,Dr.JI ZHEN,48,8.4 小数乘法与冗余符号位(续),T位乘积送累加器时,符号位扩展,得到11110100(-0.09375)结果错误,原因是出现了冗余符号位。,解决冗余符号位办法

22、 将ST1中FRCT(小数方式)位置1(乘积传送累加器时自动地左移一位),Dr.JI ZHEN,49,8.5 小数乘法编程,SSBX FRCTMPY*AR2,*AR3,ASTH A,z,Dr.JI ZHEN,50,8.5 小数乘法编程,编写计算的程序段。其中数据均为小数a1=0.1 a2=0.2 a3=-0.3 a4=0.4x1=0.8 x2=0.5 x3=-0.4 x4=-0.2.bssx,4.bss a,4.bssy,1.datatable:.word1*32768/10.word2*32768/10.word-3*32768/10.word4*32768/10.word8*32768/1

23、0.word5*32768/10.word-4*32768/10.word-2*32768/10,Dr.JI ZHEN,51,8.5 小数乘法编程(续),.textstart:SSBXFRCT STM#x,AR1 RPT#7 MVPDtable,*AR1+STM#x,AR2 STM#a,AR3 RPTZ A,#3 MAC*AR2+,*AR3+,A STH A,*(y)done:B done,Dr.JI ZHEN,52,9 除法运算,一般DSP芯片中,没有除法硬件C54x有一条SUBC指令支持16位除法 SUBCSmem,src;(src)-(Smem)15ALU输出端;如果ALU输出端0,则(

24、ALU输出端);1+1src,否则(src)1+0 srcSUBC指令加上重复指令,实现无符号除法运算,Dr.JI ZHEN,53,0.4/(-0.8)3333h/999Ah 0.4/0.8 3333h/6666h 3333h 16ACC,9.1 长除数法,Dr.JI ZHEN,54,编写0.4/(-0.8)的程序段.bssnum(分子、被除数),1.bss den(分母、除数),1.bssquot(商),1table:.word 4*32768/10;0.4.word 8*32768/10;-0.8.textstart:STM#num,AR1 RPT#1 MVPD table,*AR1+;传

25、送2个数据至分子,分母单元 LD den,16,A;将分母移到累加器A(31-16),9.1.1|被除数|除数|,商为小数,Dr.JI ZHEN,55,9.1.1|被除数|除数|,商为小数(续),.bssnum(分子、被除数),1MPY A num;(num)*(A(31-16)B,;获取商的符号(在累加器B中)ABS A;分母取绝对值STH A,den;分母绝对值存回原处LD num,16,A;分子A(31-16)ABS A;分子取绝对值RPT#14;15次减法循环,完成除法SUBC den,AXC 1,BLT;如果B0(商是负数),;则需要变号NEG ASTL A,quot;保留商,Dr.

26、JI ZHEN,56,9.1.1 除数结果,被除数 4*32768/(0.4)-128除数-8*32768/10(-0.8)1024商(十六进制)0 xc000 0 xf000商(十进制)-0.5-0.125,Dr.JI ZHEN,57,9.1.2|被除数|除数|,商为整数,例:编写16384/512的程序段。本程序段可在上个程序段的基础上修改。除输入数据外,仅有两处改动:LDnum,16,A改成LDnum,ARPT#14改成RPT#15其它不变。本程序运行结果如下:被除数 除数 商(十六进制)商(十进制)16384 512 0 x0020 3266*32768/100(0.66)33*327

27、68/100(-0.33)0 xfffe-2,Dr.JI ZHEN,58,9.1.3 关于除法操作的说明,SUBC指令仅对无符号数进行操作除法运算必须对被除数和除数取绝对值利用乘法操作,获取商的符号,最后通过条件执行给商加上适当的符号,Dr.JI ZHEN,59,10 浮点运算,浮点运算可以扩大数据的动态范围和运算精度C54x定点DSP支持浮点运算C54x中浮点数的表示方法定点数=尾数*2 指数 例如:定点数0 x2000(0.25)浮点数 尾数 0 x4000(0.25)指数 1浮点数的尾数可正可负。表示数的符号浮点数的指数范围:(831),指数表示定点数规格化的左移(负指数为右移)的位数。

28、,Dr.JI ZHEN,60,10.1 定点浮点数,54x通过3条指令就可以将一个定点数(假设定点数已在累加器A中)1.EXP A。这是一条提取指数的指令,指数保存在T寄存器中。如果(累加器A)=0,0T;否则,累加器A的冗余符号位数8T。累加器A中的内容不变。指数的数值范围:831。,Dr.JI ZHEN,61,10.1 定点浮点数(例),例:EXP A 执行前 执行后A=FF FFFF FFCB A=FF FFFF FFCBT=0000 T=0019(25),例:EXP B 执行前 执行后B=07 8543 2105 B=07 8543 2105T=0007 T=FFFC(-4),Dr.J

29、I ZHEN,62,10.1 定点浮点数,2.STT,EXPONENT;这条紧接在EXP后的指令是将保存在T寄存器中的指数存放到数据存储器的指定单元中。3.NORMA;这是一条按T寄存器中的内容对累加器A进行规格化处理(左移或右移),即(累加器A)TSA。,Dr.JI ZHEN,63,例:NORMA 执行前 执行后A=FF FFFF F001 A=FF 8008 0000T=0013 T=0013,例:NORM B,A;A=NORM(B,TS)执行前 执行后A=FF FFFF F001 A=00 4214 1414B=21 0A0A 0A0A B=21 0A0A 0A0AT=0FFF9 T=0

30、FFF9,10.1 定点浮点数(例),Dr.JI ZHEN,64,10.2 规格化注意事项,NORM指令不能紧跟EXP指令;因为NORM指令需要T的值时,EXP指令还没有取得T的值;若紧随其后执行只能按原来的T值移位。,Dr.JI ZHEN,65,10.3 浮点数定点数,浮点数的指令是规格化时左移(负指数时右移)的位数浮点数定点数,只要按指数数值将尾数右移(负指数是左移)就行了,例:编写浮点乘法程序,完成x1*x2=0.3*(-0.8)运算。程序中保留10个数据存储单元:x1(被乘数)m2(乘数的尾数)x2(乘数)ep(乘积的指数)e1(被乘数的指数)mp(乘积的尾数)m1(被乘数的尾数)pr

31、oduct(乘积)e2(乘数的指数)temp(暂存单元),Dr.JI ZHEN,66,10.3 浮点数定点数,例:程序清单.title“float.asm”.def startSTACK:.usect“STACK”,100.bss x1 1.bss x2,1.bss e1,1.bss m1,1.bss e2,1.bss m2,1.bss ep,1.bss mp,1.bss product,1.bss temp,1,Dr.JI ZHEN,67,10.3 浮点数定点数,程序清单(续).datatable:.word 3*32768/10.word-8*32768/10.textstart:STM#

32、STACK+100,SP;设置堆栈指针SP MVPD table,x1;将x1和x2传送至数据存储器 MVPD table+1,x2 LD x1,16,A;将x1规格化为浮点数 EXP A ST T,e1;保存x1的尾数 NORM A STH A,m1;保存x1的尾数,Dr.JI ZHEN,68,10.3 浮点数定点数,程序清单(续)LD x2,16,A;将x2规格化为浮点数 EXP A ST T,e2;保存x2的指数 NORM A STH A,m2;保存x2的尾数 CALL MULT;调用浮点乘法子程序done:B doneMULT:SSBX FRCT SSBX SXM LD e1,A;指数

33、相加 ADD e2,A STL A,ep,Dr.JI ZHEN,69,10.3 浮点数定点数,程序清单(续)LD m1,T;尾数相乘 MPY m2,A EXP A;对尾数乘积规格化 ST T,temp NORM ASTH A,mp;保存乘积尾数LD temp,A;修正乘积指数ADD ep,ASTL A,ep;保存乘积指数NEG A;将浮点乘积转换成定点数STL A,temp;能否将A直接送T?LD temp,T;MVMM A,T行吗?,Dr.JI ZHEN,70,10.3 浮点数定点数,程序清单(续)LD mp,16,ANORM ASTH A,product;保存定点乘积RET.END 最后得到0.3*(-0.8)乘积浮点数为:尾数0 x8520,指数0 x0002。乘积的定点数为:0 xE148。其十进制数都等于-0.23999。,Dr.JI ZHEN,71,Thanks for your time!,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号