【文档说明】汇编语言程序设计课件.pptx,共(35)页,635.322 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44785.html
以下为本文档部分文字说明:
汇编语言程序设计C54x具有丰富的程序控制指令,以完成分支操作、条件操作及循环操作等。◆分支操作1.分支转移分类指令说明无条件分支转移B[D]用该指令指定的地址加载PCBACC[D]用累加器的低16位指定的地址加载PC条件分支转
移BC[D]若满足指令给定条件,用该指令指定的地址加载PC5.1程序的控制与转移2.子程调用分类指令说明无条件调用CALL[D]将返回的地址压入堆栈,并用该指令指定的地址加载PCCALA[D]将返回的地址压入堆栈,用累加器A或B
指定的地址加载PC条件调用CC[D]如果满足指令给定条件,将返回的地址压入堆栈,并用该指令指定的地址加载PC3.子程返回分类指令说明无条件返回RET[D]将堆栈顶部的返回地址加载到PC。条件返回RC[D]如果满足指令给定条件,将堆栈顶部的返回地址加载到PC。5.1程序的控制与转移4.
条件操作操作符号条件说明操作符号条件说明AEQA=0累加器A等于0AOVAOV=1累加器A溢出BEQB=0累加器B等于0BOVBOV=1累加器B溢出ANEQA≠0累加器A不等于0ANOVAOV=0累加器A不溢出BNEQB≠0累加器B不等于0BNOVBOV=0累加器B不溢出ALTA<0累
加器A小于0CC=1ALU进位位置1BLTB<0累加器B小于0NCC=0ALU进位位置0ALEQA≤0累加器A小于等于0TCTC=1测试/控制标志位置1BLEQB≤0累加器B小于等于0NTCTC=0测试/控制标志位置
0AGTA>0累加器A大于0BIO低信号电平为低BGTB>0累加器B大于0NBIO高信号电平为高AGEQA≥0累加器A大于等于0UNC无无条件操作BGEQB≥0累加器B大于等于0BIOBIOBIOBI
O5.1程序的控制与转移第1组第2组A类B类A类B类C类EQ,NEQ,LTLEQ,GT,GEQOVNOVTCNTCCNCBIONBIO•组间条件只能“或”•第一组两类条件可以“与”/“或”,但累加器必须是同一个•第二组三类条件可以各选一
个条件“与”/“或”•同组同类条件不能选择两个5.1程序的控制与转移例5-1条件分支转移RCTCCCsub,BNEQBCnew,AGT,AOV;TC=1返回,TC=0继续;B≠0,调用sub,B=0继续;A>0且溢出(“与”
的关系),转至new,否则继续5.1程序的控制与转移BCnew,AGTBCnew,AOV;A>0,转至new,否则继续;A溢出,转至new,否则继续若例1中两个条件相“或”怎么办?◆循环操作当条件满足时,重复执行某一段程序;可以通过BANZ
指令实现。指令格式:BANZ转移地址,辅助寄存器指令功能:当辅助寄存器不为0时,则转至转移地址;否则,顺序执行。循环操作5.1程序的控制与转移.bssx,5;为变量x分配5个存储单元.bssy,1;为变量y分配1个存
储单元STM#x,AR1;AR1指向x的首地址STM#4,AR2;将操作数#4赋给AR2LD#0,A;将累加器A清0loop:ADD*AR1+,A;执行加法运算,结果存入累加器A中BANZloop,*
AR2-;AR2不为0转移,重复执行5次STLA,@y;将结果(A的低16位)送往变量y存储单元.title"Ex534.asm";为汇编语言源文件取名.mmregs;定义存储器映像寄存器stack.u
sect"STACK",10h;为堆栈空间分配16个存储单元.bssx,5;为变量x分配5个存储单元.bssy,1;为变量y分配1个存储单元.defstart;定义标号start.data;定义数据代码table:.word1,2,3,
4,5;为标号table开始的5个存储单元赋值.text;定义文本代码段start:STM#0,SWWSR;SWWSR置0,不插等待周期STM#stack+10h,SP;设置堆栈指针CALLinit;调用子程序ini
tSTM#x,AR1;将变量x的首地址赋给AR1STM#4,AR2;将操作数#4赋给AR2LD#0,A;将累加器A清0loop:ADD*AR1+,A;执行加法运算,结果存入累加器A中BANZloop,*AR2-;AR2不为0转移,重复执行5次STLA,@y;将结果(A的低16位)送
往变量y存储单元init:STM#x,AR1;AR1指向x的首地址RPT#4;重复执行下条指令5次MVPDtable,*AR1+;重复传递共5个数据RET;子程序返回.end;源程序结束利用CMPR指令进行比较操作指定的ARx寄存器(x=1~7)与A
R0比较,测试条件成立TC置1。例:5-3比较操作后条件分支转移5.1程序的控制与转移STM#5,AR1;(AR1)=5STM#10,AR0;(AR0)=10loop:……MAR*AR1+;AR1=AR1+1……CMPRLT,AR1;若AR1-AR0<0,则TC=1,否则为0BCloop,
TC;若AR1-AR0<0,则循环若AR1=AR0,则顺序执行5.2堆栈的使用方法•特点:•16位堆栈指针SP•向堆栈中压入数据时,堆栈指针从高地址向低地址移动•压入堆栈时,先SP-1,再压入数据;弹出
操作数时,先弹出数据,后SP+1◆堆栈设置:size.set120stack.usect“STACK”,sizeSTM#stack+size,SP;在RAM区开辟堆栈;区,共120单元;;将堆栈空间的高地址送堆;栈指针SP设置好堆栈后,就可以使用堆栈了,如:CALLpmad;(SP)-
1→SP,(PC)+2→TOS,pmad→PCRET;(TOS)→PC,(SP)+1→SP5.3加、减法和乘法运算•例5-4计算z=x+y-w•使用:加法指令ADD,减法指令SUBLD@x,AADD@y,ASUB@w,ASTLA,@z;取x值,A=x;完成x+y运算,A=x+y
;完成x+y-w运算,A=x+y-w;计算结果(A的低16位)存入变量z中5.3加、减法和乘法运算•例5-5计算y=mx+b•使用:乘法指令MPY,加法指令ADDLD@m,TMPY@x,AADD@b,ASTLA,@
y;取系数m值,T=m;完成mx乘积,A=mx;完成mx+b运算,A=mx+b;计算结果B的低16位存入y中5.3加、减法和乘法运算•例5-6计算y=x1*a1+x2*a2•使用:乘法指令MPY,乘法累加指令MACLD
@x1,TMPY@a1,ALD@x2,TMAC@a2,ASTLA,@ySTHA,@y+1;取变量值x1,T=x1;完成乘法x1a1运算,A=x1a1;取变量值x2,T=x2;乘法累加,A=x1a1+x2a2;计算结果的低字AL存入y
中;计算结果的高字AH存入y+1中5.3加、减法和乘法运算•例5-7计算•使用:乘法累加指令MAC,重复执行下条指令RPT加法/减法.title"Ex_543.asm".mmregsstack.usect"STACK",10H.bssa,4
.bssx,4.bssy,1.defstart.datatable:.word1,2,3,4.word8,6,4,2.textstart:STM#0,SWWSRSTM#stack+10H,SPSTM#a,AR1RPT#7MVPDtable,*A
R1+CALLSUMend:BendSUM:STM#a,AR3STM#x,AR4RPTZA,#3MAC*AR3+,*AR4+,ASTLA,@yRET.end指定堆栈空间为变量预留空间初值序列初始化变量设置堆栈指针利用
MAC和RPT求乘累加和.title"Ex_543.asm“;为汇编语言源文件取名.mmregs;定义存储器映像寄存器stack.usect"STACK",10H;为堆栈空间分配16个存储单元.bssa,4;为系数a分配4个存
储单元.bssx,4;为变量x分配4个存储单元.bssy,1;为变量y分配1个存储单元.defstart;定义标号start.data;定义数据代码table:.word1,2,3,4;为标号table开始的.word8,6,4,2;8个存储单元赋值.text;定义文本代码段start:ST
M#0,SWWSR;SWWSR置0,不插等待周期STM#stack+10H,SP;设置堆栈指针STM#a,AR1;AR1指向a的首地址RPT#7;重复执行下条指令8次MVPDtable,*AR1+;从程序存储器向数据存储器,重复传递共8个数据CALLSUM;调用子程序SUMend:
Bend;循环等待SUM:STM#a,AR3;将系数a的首地址赋给AR3STM#x,AR4;将变量x的首地址赋给AR4RPTZA,#3;将累加器清0,重复执行下条指令4次MAC*AR3+,*AR4+,A;执行乘法累加运算,结果存入
累计器A中STLA,@y;将结果(A的低16位)送往变量y存储单元RET;子程序返回.end;源程序结束【例5-8】在例5-7的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-;系数a的首地址赋给AR1;变量x的首地址赋给AR2;设置计数器AR3=2;取系数T=a1,并修改AR1;乘法运算A=a1x1,并修改AR2;取系
数T=ai,并修改AR1;乘法运算B=aixi,并修改AR2;求A和B中的最大值,结果存入A;若AR3≠0,则循环,并修改AR3若AR3=0,则顺序执行5.3加、减法和乘法运算重复执行一条指令或一段指令(指令块),因此可以分为单指令重复和块重复。对应指
令:RPT、RPTZ、RPTB。※单指令重复RPT和RPTZ指令允许重复执行紧随其后的一条指令若干次;执行次数有指令的操作数决定,并且等于该操作数加1。优点:只需取指一次,重复执行若干次,效率高。特别是对于MAC操作和数据传送这样的多周期指令。5.4重复操作例5-9对一个数组进
行初始化X[5]={0,0,0,0,0}【例5-9】对数组进行初始化,使x[5]={0,0,0,0,0}。.bssx,5STM#x,AR1LD#0,ARPT#4STLA,*AR1+.bssx,5STM#x,A
R1RPTZA,#4STLA,*AR1+注意:①对x[5]中的5个元素置0,重复次数为4,即执行1次STLA,AR1+指令后,再重复执行4次;②RPTZ指令设定重复次数后,再对累加器清零。5.4重复操作※块重复操作RPTB指令允许重复执行代码块若干次,次数由
BRC决定。特点:对任意长的程序段的循环开销为0;其本身是一条2字4周期指令;循序开始地址(RSA)是RPTB指令的下一行,结束地址(REA)由RPTB指令的操作数规定。过程:①BRAF置1;②循环次数加载到BRC;③块重复起始地址加载至RSA;④块重复末地址
加载至REA;⑤循环更新PC→与REA比较→更新BRC→判断BRC→BRAF复位。块重复操作例5-10对数组X[5]中每个元素加1例5-10对数组x[5]中的每一元素加1。.bssx,5begin:LD#1,
BSTM#4,BRCSTM#x,AR4RPTBnext-1ADD*AR4,B,ASTLA,*AR4+next:LD#0,B…;设置数组空间;立即数1送入B;设置重复次数,BRC=4,循环5次;数组首地址x送入AR4;设置循环结束地址;数组数据与B相加,结果存入A中;存储数组结果,并修改地址;B清0
块重复操作C54X数据块传送指令有10条,可实现数据存储器之间,数据存储器与MMR之间,程序存储器与数据存储器之间,程序存储器(ACC)与数据存储器之间的数据块传送。5.5数据块传送数据传送指令的特点:①传送速度比加载和存储指令要快;②数据传送不通过累加器;③可寻址程序存储器;④与RPT结合,
可实现数据块传送。㈠程序存储器←→数据存储器MVPD和MVDP,一般用于复位时将数据表格传送到数据存储器。㈡数据存储器←→数据存储器MVDK,MVKD,MVDD,在数据存储器内部传送数据块。5.5数据块
传送㈣程序存储器(ACC)←→数据存储器READA和WRITA,利用A累加器的低16位(具有扩展程序存储器的为低23位)寻址程序存储器,实现与数据存储器之间的数据传送。㈡数据存储器←→MMRMVDM,MVMD,MVMM•例5-11数组X[5]={1,2,3,4,5}初始化(程序存储器和数据存储器之
间的数据传送).dataTBL:.word1,2,3,4,5.bssx,5.textSTART:STM#x,AR5RPT#4MVPDTBL,*AR5+…;定义数据代码段;为标号TBL开始的5个存储单元赋初值;为变量x分配5个存储单元;定义文本代码段;将变量x的首地址赋给AR5;将下条指令重复执
行5次;将数据送入X对应地址单元中5.5数据块传送•例5-12编写一段程序将数据存储器中的数组x[20]复制到数组y[20]。(数据存储器和数据存储器之间的数据传送).bssx,20.bssy,20.textLD#x,AR2LD#y,AR3RPT#19MVDD*AR2+,*AR3+…..;为变
量x分配20个存储单元;为变量y分配20个存储单元;定义文本代码段;将变量x的首地址赋给AR2;将变量y的首地址赋给AR3;将下条指令重复执行20次;将((AR2))((AR3))5.5数据块传送•用双操作数指令编程的特点:①单周期内通过C总线和D总线
寻址两个数据②用间接寻址方式获得操作数,且只能用AR2~AR5③占用的程序空间小④运行的速度快5.6双操作数乘法指令功能MPYXmem,Ymem,dstdst=Xmem*YmemMACXmem,Ymem,scr[dst]dst=scr
+Xmem*YmemMASXmem,Ymem,scr[dst]dst=scr-Xmem*YmemMACPSmem,Pmad,scr[dst]dst=scr+Smem*Pmad表5-3MAC型双操作数指令寻址方式:*ARn、*ARn+、*ARn-、*ARn+0%•编制求解的程序段。5.6双操作数乘法
单操作数指令方案双操作数指令方案LD#0,BLD#0,BSTM#a,AR2STM#a,AR2STM#x,AR3STM#x,AR3STM#19,BRCSTM#19,BRCRPTBdone-1RPTBdone-1LD*AR2+,TMPY*AR
2+,*AR3+,A3TMPY*AR3+,A2TADDA,BADDA,Bdone:STHB,@ydone:STHB,@ySTLB,@y+1STLB,@y+1节省的总机器周期数=1T*N(迭代次数)=NT。•进一步优化的程序段。•利用双操作数指令进行乘法累加运算,完成N项乘积求和需2N个机器周
期。如果将乘法累加器单元、多总线以及硬件循环操作结合在一起,可以形成一个优化的乘法累加程序。完成一个N项乘积求和的操作,只需要N+2个机器周期。程序如下:5.6双操作数乘法STM#x,AR2STM#a,AR3RPTZA,#19;2个机器周期MAC*AR2+,*AR3+,A;1
个机器周期STHA,@ySTLA,@y+1作业•1、编写的程序,并注释•2、编写对数组X[8]={1,2,3,4,5,6,7,8}的初始化程序,并注释•长字运算•C54x可以利用长操作数(32位)进行长字运算。5.7长字运算和并行运算长字指令DLDLmem,dstDSTsrc,LmemDADD
Lmem,src[,dst]DSUBLmem,src[,dst]DRSUBLmem,src[,dst];dst=Lmem单周期;Lmem=src双周期;dst=src+Lmem单周期;dst=src-Lmem单周期;dst=Lmem-src单周期•长操作
数在存储器的排列方法•偶地址排列法•指令中给出的地址为偶地址•存储器中低地址存放高16位•存储器中高地址存放底16位•奇地址排列法•指令中给出的地址为奇地址•存储器中低地址存放低16位•存储器中高地址存放高16位5.7长字运算和并行运算5.7长
字运算和并行运算偶地址排列法举例•DLD*AR3+,A执行前:执行后:A=0000000000A=006CACBD90AR3=0100AR3=0102(0100h)=6CAC(高字)(0100h)=6CAC(0101h)=BD90(低字)(0101h)=BD90奇地址排列
法举例•DLD*AR3+,A执行前:执行后:A=0000000000A=00BD906CACAR3=0101AR3=0103(0100h)=6CAC(低字)(0100h)=6CAC(0101h)=BD90(高字)(0101h)=BD905.7长字运算
和并行运算并行运算同时利用D总线和E总线4种并行运算指令:并行加载和乘法指令并行加载和存储指令并行存储和乘法指令并行存储和加/减法指令☆并行指令均为单字单周期指令;☆并行指令先存储,后加载或算术运算;
☆并行指令的操作均在累加器的高位中进行,并且大多数指令受ASM位的影响。5.7长字运算和并行运算•[例5-16]编写计算z=x+y和f=e+d程序段.bssx,3.bssd,3STM#x,AR5STM#d,AR2LD#0,ASMLD*
AR5+,16,AADD*AR5+,16,ASTA,*AR5||LD*AR2+,BADD*AR2+,16,BSTHB,*AR2本章总结★概述★程序的控制与转移(重点)★堆栈的使用方法★加、减法和乘法运算(重点)★重复操作(重点)★数据块传
送(重点)★双操作数乘法★长字运算和并行运算