汇编语言编程举例.ppt
《汇编语言编程举例.ppt》由会员分享,可在线阅读,更多相关《汇编语言编程举例.ppt(115页珍藏版)》请在三一办公上搜索。
1、汇编语言编程举例,汇编语言编程的基本方法 DSP在信号发生器上的应用 用DSP实现FIR滤波器,汇编语言编程举例,汇编语言编程的基本方法,汇编语言编程的基本方法,1堆栈的使用,1.压入数据时,堆栈从高地址向低地址增长。2.压栈时指针先减,SP-1,再压入数据;3.出栈时,先弹出数据后,再SP+1。4.如要用堆栈,必须先设置,后使用。,要点,例 设计一存储空间为100个单元的堆栈。size.set 100;设置堆栈空间的;大小为100stack.usect“STK”,size;设置堆栈段的首地址;和堆栈空间 STM#stack+size,SP;将栈底地址指针送;SP,完成初始化,1堆栈的使用,汇
2、编语言编程的基本方法,例 编写求解加、减法的程序,计算z=x+y-w。SUM1:LD x,A;将x地址的内容送A ADD y,A;将y地址的内容与A中x值相加 SUB w,A;将A中的内容与w 相减,得z STL A,z;将A的的计算值存入z 地址中,2 加、减法和乘法运算,汇编语言编程的基本方法,例 写求解直线方程的程序,计算y=mx+b。SUM2:LD m,T;将m 地址的内容送T MPY x,A;将x 地址的内容与;T中的m相乘,结果送A ADD b,A;将A中的mx与b 地址的内容;相加,结果送A STL A,y;将A的的计算结果;存入y 地址中,2 加、减法和乘法运算,汇编语言编程的
3、基本方法,传送速度比加载和存储指令要快;传送数据不需要通过累加器;可以寻址程序存储器;与RPT指令相结合(重复时,这些指令都变成单周期指令),可以实现数据块传送。,3 数据块传送,特点,汇编语言编程的基本方法,(1)数据存储器数据存储器 这类指令有:MVDK Smem,dmad 指令的字数/执行周期 2/2MVKD dmad,Smem;Smem=dmad 2/2MVDD Xmem,Ymem;Ymem=Xmem 1/1(2)程序存储器数据存储器 这类指令有:MVPD pmad,Smem;Smem=pmad 2/3MVDP Smem,pmad;pmad=Smem 2/4pmad为16位立即数程序存
4、储器地址;dmad为16位立即数数据存储器地址;Smem为数据存储器地址;Xmem、Ymem为双操作数数据存储器地址,Xmem从DB数据总线上读出。Ymem从CB数据总线上读出。,3 数据块传送,汇编语言编程的基本方法,(3)数据存储器MMR 这类指令有:MVDM dmad,MMR;指令的字数/执行周期 2/2MVMD MMR,dmad;dmad=MMR 2/2MVMM mmrx,mmry;mmry=mmrx 1/1(4)程序存储器(Acc)数据存储器 包括:READA Smem;Smem=prog(A)1/5WRITA Smem;prog(A)=Smem 1/5 mmrx,mmry为AR0A
5、R7或SP;MMR为任何一个存储器映象寄存器;,3 数据块传送,汇编语言编程的基本方法,例 将数组x5 初始化为1,2,3,4,5。.data;定义初始化数据段起始地址TBL:.word 1,2,3,4,5;为标号地址TBL;开始的5个单元赋初值.sect“.vectors”;定义自定义段,并获;得该段起始地址 B START;无条件转移到标号为START的地址.bss x,5;为数组x分配5个存储单元.text;定义代码段起始地址START:STM#x,AR5;将x的首地址存入AR5 RPT#4;设置重复执行5次下条指令 MVPD TBL,*AR5+;将TBL开始的5个值传给x,(1)程序存
6、储器数据存储器,3 数据块传送,汇编语言编程的基本方法,例 将数据存储器中的数组x10复制到数组y10。.title“cjy1.asm”;为汇编源程序取名.mmregs;定义存储器映象寄存器STACK.usect“STACK”,30H;设置堆栈.bss x,10;为数组x分配10个存储单元.bss y,10;为数组y分配10个存储单元.datatable:.word 1,2,3,4,5,6,7,8,9,10.def start;定义标号start.text,(2)数据存储器数据存储器,3 数据块传送,汇编语言编程的基本方法,start:STM#0,SWWSR;复位SWWSR STM#STACK
7、+30H,SP;初始化堆指针 STM#x,AR1;将目的地首地址赋给AR1 RPT#19;设定重复传送的次数为20次 MVPD table,*AR1+;程序存储器传送到数;据存储器 STM#x,AR2;将x的首地址存入AR2 STM#y,AR3;将y的首地址存入AR3 RPT#19;设置重复执行20次下条指令 MVDD*AR2+,*AR3+;将地址x开始的20个值;复制到地址y开始的20个单元end:B end.end,3 数据块传送,汇编语言编程的基本方法,用间接寻址方式获得操作数,且辅助寄存器只用AR2AR5;占用程序空间小;运行速度快。,4双操作数乘法,特点,汇编语言编程的基本方法,单操
8、作数指令方案 LD#0,B STM#a,AR2 STM#x,AR3 STM#19,BRC RPTB done-1 LD*AR2+,T;1T MPY*AR3+,A;1T ADD A,B;1Tdone:STH B,y STL B,y+1,双操作数指令方案 LD#0,B STM#a,AR2 STM#x,AR3 STM#19,BRC RPTB done-1 MPY*AR2+,*AR3+,A;1T ADD A,B;1Tdone:STH B,y STL B,y+1,4双操作数乘法,例 编制求解 的程序。,汇编语言编程的基本方法,4双操作数乘法,上例 编制求解 的程序。利用双操作数指令可以节省机器周期。迭代
9、次数越多,节省的机器周期数也越多。例子中,在每次循环中,双操作数指令都比单操作数指令少用一个周期,节省的总机器周期数=1T*N(迭代次数)=NT。,汇编语言编程的基本方法,在单个周期内同时利用C总线和D总线,得到32位操作数。,5长字运算,特点,使用长操作数指令时,按指令中给出的地址存取的总是高16位操作数。这样,有两种数据排列方法:(1)偶地址排列法 指令中给出的地址为偶地址,存储器中低地址存放高16位操作数。(2)奇地址排列法 指令中给出的地址为奇地址,存储器中低地址存放低16位操作数。,汇编语言编程的基本方法,5长字运算,(1)偶地址排列法 指令中给出的地址为偶地址,存储器中低地址存放高
10、16位操作数。如:DLD*AR3+,A执行前:A=00 0000 0000 执行后:A=00 6CAC BD90 AR3=0100 AR3=0102(0100h)=6CAC(高字)(0100h)=6CAC(0101h)=BD90(低字)(0101h)=BD90,汇编语言编程的基本方法,(2)奇地址排列法 指令中给出的地址为奇地址,存储器中低地址存放低16位操作数。如:DLD*AR3+,A 执行前:执行后:A=00 0000 0000 A=00 BD90 6CAC AR3=0101 AR3=0103(0100h)=6CAC(低字)(0100h)=6CAC(0101h)=BD90(高字)(0101
11、h)=BD90,5长字运算,汇编语言编程的基本方法,推荐采用偶地址排列法,将高16位操作数放在偶地址存储单元中。如:程序存储器.long 12345678 h;偶地址:1234;奇地址:5678 数据存储器.bss xhi,2,1,1;偶地址:xhi;奇地址:xlo 变量名称 字长 页邻接 偶地址排列法,5长字运算,汇编语言编程的基本方法,例 计算Z32=X32+Y32。标准运算 长字运算 LD xhi,16,A DLD xhi,A ADDS xlo,A DADD yhi,A ADD yhi,16,A DST A,zhi ADDS ylo,A(3个字,3个T)STH A,Zhi STL A,Z
12、lo(6个字,6个T),5长字运算,汇编语言编程的基本方法,(1)并行运算指同时利用D总线和E总线。其中,D总线用来执行加载或算术运算,E总线用来存放先前的结果。(2)并行指令都是单字单周期指令。(3)并行运算时所存储的是前面的运算结果,存储之后再进行加载或算术运算。(4)并行指令都工作在累加器的高位。(5)大多数并行运算指令都受累加器移位方式ASM位影响。,6并行运算(略),特点,汇编语言编程的基本方法,表 并行指令举例,汇编语言编程的基本方法,例 编写计算z=x+y和f=d+e的程序段。在此程序段中用到了并行存储/加载指令,即在同一机器周期内利用E总线存储和D总线加载。数据存储器分配如图5
13、-4所示。.title“cjy3.asm”.mmregsSTACK.usect“STACK”,10H.bss x,3;为第一组变量;分配3个存储单元.bss d,3;为第二组变量;分配3个存储单元.def start.datatable:.word 0123H,1027H,0,1020H,0345H,0,汇编语言编程的基本方法,.text start:STM#0,SWWSR STM#STACK+10H,SP STM#x,AR1 RPT#5 MVPD table,*AR1+STM#x,AR5;将第一组变量的首地址传给AR5 STM#d,AR2;将第二组变量的首地址传给AR2 LD#0,ASM;设
14、置ASM=0 LD*AR5+,16,A;将x的值左移16位放入A的高端字 ADD*AR5+,16,A;将y值左移16位与A的高端字x相加 ST A,*AR5;将A中的和值右移16位存入z中 LD*AR2+,B;将d的值左移16位放入B的高端字 ADD*AR2+,16,B;将e值左移16位与B的高端字d相加 STH B,*AR2;将B的高端字中的和值存入f中end:B end.end,汇编语言编程的基本方法,764位加法和减法运算(略),例 编写计算Z64=W64+X64-Y64的程序段。这里的W、X、Y和结果Z都是64位数,它们都由两个32位的长字组成。利用长字指令可以完成64位数的加/减法。
15、w3 w2 w1 w0(W64)+x3 x2 C x1 x0(X64)低32位相加产生进位C-y3 y2 C y1 y0(Y64)低32位相减产生借位C_ z3 z2 z1 z0(Z64),汇编语言编程的基本方法,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+x3x2+CDSUB y1,A;A=w1w0+x1x0-y1y0,产生借位CDST A,z1;z1z0=w1w0+x1x0-y1y0SUBB y2,B;B=w3w2+x3x2+C-y2-CSU
16、B y3,16,B;B=w3w2+x3x2+C-y3y2-CDST B,z3;z3z2=w3w2+x3x2+C-y3y2-C由于没有长字带进(借)位加/减法指令,所以上述程序中只能用16位带进(借)位指令ADDC和SUBB。,汇编语言编程的基本方法,8.32位乘法运算(略),x1 x0 S U y1 y0 S U_ _ x0*y0 U*U y1*x0 S*U x1*y0 S*Uy1*x1 S*S_ _w3 w2 w1 w0 S U U U,例 编写计算W64=X32*Y32的程序段。32位乘法算式如下:,汇编语言编程的基本方法,其中,S为带符号数,U为无符号数。数据存储器分配如图所示。在32位
17、乘法运算中,实际上包括了三种乘法运算:U*U、S*U和S*S。一般的乘法运算指令都是两个带符号数相乘,即S*S。所以,在编程时,要用到以下三条乘法指令:MACSU Xmem,Ymem,src;无符号数与带符号数相乘并累加;src=U(Xmem)*S(Ymem)+src MPYU Smem,dst;无符号数相乘;dst=U()*U(Smem)MAC Xmem,Ymem,src;两个符号数数相乘并累加;src=S(Xmem)*S(Ymem)+src32位乘法的程序段如下:,汇编语言编程的基本方法,STM#x0,AR2;将x的首地址放入AR2 STM#y0,AR3;将y的首地址存入AR3 LD*AR
18、2,T;T=x0 MPYU*AR3+,A;A=ux0*uy0 STL A,w0;w0=ux0*uy0 LD A,-16,A;A=A16 MACSU*AR2+,*AR3-,A;A+=y1*ux0 MACSU*AR3+,*AR2,A;A+=x1*uy0 STL A,w1;w1=A LD A,-16,A;A=A16 MAC*AR2,*AR3,A;A+=x1*y1 STL A,w2;w2=A的低16位 STH A,W3;w3=A的高16位,汇编语言编程的基本方法,9小数运算(略),整数运算的问题(1)两个16位整数相乘,乘积总是“向左增长”。这意味着多次相乘后,乘积将会很快超出定点器件的数据范围。(2
19、)保存32位乘积到存储器,要开销2个机器周期以及2个字的存储器单元。(3)由于乘法器都是16位相乘,因此很难在后续的递推运算中,将32位乘积作为乘法器的输入。小数运算的优点(1)乘积总是“向右增长”。这就味着超出定点器件数据范围的将是不太感兴趣的部分。(2)既可以存储32位乘积,也可以存储高16位乘积,这就允许用较少的资源保存结果。(3)可以用于递推运算。,小数运算与整数运算的比较,汇编语言编程的基本方法,C54x采用2的补码表示小数,其最高位为符号位,数值范围从-11。一个16位2的补码小数(Q15格式)的每一位的权值为:MSB(最高位)LSB(最低位)-1.1/2 1/4 1/8 2-15
20、一个十进制小数乘以32768之后再将其十进制整数部分转换成十六进制数,就能得到这个十进制小数的2的补码表示了。1 7FFFh0.5正数:乘以32768 4000h0 0000h-0.5 负数:其绝对值部分乘以32768,再取反加1 C000h-1 8000h,(1)小数的表示方法,汇编语言编程的基本方法,在汇编语言中,是不能直接写入十进制小数的,可写为整数运算式。如果要定义一个系数0.707,可以写成:.word 32768*707/1000不能写成32768*0.707。,注意,Q格式表示法,在Q格式中,Q之后的数字(如Q15格式中的15)决定小数点右边有多少位二进制位,故Q15表示在小数点
21、后有15位小数。当用一个16位的字来表示Q15格式时,在MSB(最高位)的右边有一个小数点,而MSB表示符号位。所以Q15的表示数字可表示范围从+1(以+0.999997表示)到-1的值。,汇编语言编程的基本方法,通过合适的Q格式,可以把数值根据所需的精确度做适当地转换,以便定点数的DSP也可以处理高精度的浮点数。下面以Q15为例,说明转换的过程。1)先确定准备转换的十进制数值N,是在Q15格式的数值范围之间,即-1.000000N+0.999997。2)数值N乘以215,即N=N215=N327683)把步骤2)的结果加216,即N=N+216=N+65536。4)步骤3)的结果转换成十六进
22、制,并把第17位舍弃掉,得到的结果就是N的Q15转换值。,汇编语言编程的基本方法,下面通过把-0.2345及+0.2345转换成Q15格式来说明转换方法。-0.2345的转换为:-0.234532768=-7684.1-7684-7684+65536=5785257852转换成十六进制数值为0E1FCh,所以结果为E1FCh。+0.2345的转换为:0.234532768=7684.176847684+65536=7332073320转换成十六进制数值为11E04h,并把第17位舍弃掉,结果为1E04h。,汇编语言编程的基本方法,以字长为4位和8位累加器为例,先看一个小数乘法的例子。0 1 0
23、 0(0.5230.5=(4)10=(0100)2)1 1 0 1(-0.37523(-0.375)=(-3)10 0 1 0 0=(1101)补)0 0 0 0 0 1 0 01 1 0 0(-0100)1 1 1 0 1 0 0(-0.1875=-12/26-12=(1110100)补),(2)小数乘法与冗余符号位,汇编语言编程的基本方法,上述乘积是7位,当将其送到8位累加器时,为保持乘积的符号,必须进行符号位扩展,这样,累加器中的值为11110100(-0.09375=-12/27),出现了冗余符号位。原因是:S x x x(Q3)S y y y(Q3)S S z z z z z z(Q
24、6格式)即两个带符号数相乘,得到的乘积带有2个符号位,造成错误的结果。同样,对于两个十六位数相乘,乘积只有30位,在最高的两位也是符号位,同样会造成错误的结果。,汇编语言编程的基本方法,解决冗余符号的办法是:在程序中设定状态寄存器ST1中的FRCT(小数方式)位1,在乘法器将结果传送至累加器时就能自动地左移1位,累加器中的结果为:zzzzzz0(Q7格式),即11101000(-0.1875=-24/27-24=(11101000)补),自动地消去了两个带符号数相乘时产生的冗余符号位。所以在小数乘法编程时,应当事先设置FRCT位:SSBX FRCT MPY*AR2,*AR3,ASTH A,Z这
25、样,C54x就完成了Q15*Q15=Q15的小数乘法。,汇编语言编程的基本方法,例 编制计算 的程序段,其中数据均为小数:a1=0.1,a2=0.2,a3=-0.3,a4=0.4,x1=0.8,x2=0.6,x3=-0.4,x4=-0.2。.title“cjy4.asm”.mmregsSTACK.usect“STACK”,10H.bss a,4;为a分配4个存储单元.bss x,4;为x分配4个存储单元.bss y,1;为结果y分配1个存储单元.def start.data;定义数据代码段,汇编语言编程的基本方法,table:.word 1*32768/10;在table开始的8个.word
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 编程 举例
链接地址:https://www.31ppt.com/p-5993798.html