1.22k likes | 1.46k Views
第五章 汇编语言程序设计. 第一节 程序的控制与转移 C54X 具有丰富的程序控制与转移指令,利用这些指令可以执行分支转移、循环控制以及子程序操作。. 1 、条件算符. 条件分支转移指令或条件调用、条件返回指令都用条件来限制操作。条件算符分成两组,每组又分为两类或三类:. 选用条件算符时应注意以下几点: 第一组:组内两类条件可以与 / 或,但不能在组内同一类中选择两个条件算符与 / 或。当选择两个条件时,累加器必须是同一个。 例如:可以同时选择 AGT 和 AOV ,但不能 AGT 和 BOV 。
E N D
第五章 汇编语言程序设计 第一节 程序的控制与转移 C54X具有丰富的程序控制与转移指令,利用这些指令可以执行分支转移、循环控制以及子程序操作。
1、条件算符 条件分支转移指令或条件调用、条件返回指令都用条件来限制操作。条件算符分成两组,每组又分为两类或三类:
选用条件算符时应注意以下几点: • 第一组:组内两类条件可以与/或,但不能在组内同一类中选择两个条件算符与/或。当选择两个条件时,累加器必须是同一个。 例如:可以同时选择AGT和AOV,但不能AGT和BOV。 • 第二组:可以组内3类算符中个选一个条件算符与/或,但不能在组内同一类中选择2个条件算符与/或。如:可以TC、C、BIO,不可NTC、TC • 组与组之间的条件只能“或”。
如: 条件返回:RC TC ;若TC=1,则返回。 条件调用:CC sub ,BNEQ ;B=1调。 条件转移:BC new,AGT,AOV ; ;A>0且溢出转 若要“或”,则: BC new,AGT BC new,AOV
二、循环操作 BANZ;当辅助寄存器不为0时转移;如: • 计算五项累加。 .bss x,5 .bss y,1 STM #x,AR1 STM #4,AR2 LD #0,A Loop: ADD *AR1+,A BANZ loop,*AR2- STL A,@y
三、比较操作CMPR 经常用到数据之间的比较,利用CMPR:
第二节 堆栈的使用 C54X提供了一个用16位堆栈指针SP寻址的软件堆栈。当向堆栈中压入数据时,堆栈从高地址向低地址增长。堆栈指针是减在前,加在后,即先SP-1,再压入数据,先弹出数据,后SP+1。 1、若程序中要用到堆栈,必须先进行设置: Size .set 100 Stack .usect “STACK”,size STM #Stack+size , sp
2、设置堆栈后,就可以使用堆栈了: CALL pmad ;(sp)-1->sp, (pc)+2->TOS ;pmad->pc RET ;(TOS)->PC, (SP)+1->SP
第三节 加、减法与乘法运算 计算: z=x+y-w .title “example.asm” .mmregs STACK: .usect “STACK”, 10H .bss x , 1 ;add =0060H .bss y, 1 .bss w, 1 .bss z , 1 .def start .data Table: .word 10 , 26 , 23 .text
Start: STM #0,SWWSR STM #STACK+10H,SP STM #X,AR1 RPT #2 MVPD table,*AR1+ CALL SUMB end: B end SUMB: LD @X,A ADD @Y,A SUB @W,A STL A,@Z RET .end
例:在4项乘积aixi中找出最大值。 .title “example.asm” .mmregs STACK: .usect “STACK”, 10H .bss a , 4 ;add =0060H .bss x, 4 .bss y, 1 .def start .data Table: .word 1 , 5 , 3, 4 .word 8 , 6 , 7, 2 .text
Start: STM #0,SWWSR STM #STACK+10H,SP STM #a,AR1 RPT #7 MVPD table,*AR1+ CALL MAX end: B end MAX: STM #a, AR1 STM #x, AR2 STM #2, AR3 LD *AR1+, T MPY *AR2+ , A Loop: LD *AR1+ , T MPY *AR2+, B MAX A BANZ loop, *AR3- RET .end
第四节 重复操作 重复操作指令: PRT(重复下条指令); RPTZ(累加器清零并重复下条指令); RPTB(块重复指令)。 一、重复执行单条指令 由于只需取指一次,比循环效率高。特别是对那些乘法累加和数据传送的多周期指令(如:MAC、MVDK、MVDP、MVPD等指令),在执行一次后就变成了单周期指令,大大提高了运行速度。
例、对一个数组进行初始化:X[5]={0,0,0,0,0}例、对一个数组进行初始化:X[5]={0,0,0,0,0} .bss x,5 STM #x,AR1 LD #0H,A RPT #4 STL A,*AR1+ 或: .bss x,5 STM #X,AR1 RPTZ #4 STL A,*AR1+ 注意: 在执行重复操作期间,CPU是不响应中断的(RS除外);当响应 HOLD信号时,若HM=0,CPU继续执行重复操作;若HM=1,则暂 停重复操作。
二、块程序重复操作 RPTB指令的特点: 对任意长度的程序段的循环开销为零,其本身是一条2字4周期 指令;循环开始地址(RSA)是RPTB指令的下一行,结束地址 (REA)由RPTB指令的操作数规定。 因而,使用时必须先用STM指令将所规定的迭代次数加载到块 重复计数器(BRC)中。 例、对数组x[5]中的每个元素加1。 .bss x,5 Start: LD #1,16,B STM #4,BRC STM #x,AR4 RPTB next-1 ADD *AR4,16,B,A STH A,*AR4+ Next: LD #0,B ….
注意: 1、循环的结束地址; 2、RPTB指令是可以响应中断的,与RPT,RPTZ不同。 ST1中的块循环有效标志
3、循环的嵌套 执行RPT指令时用到RPTC寄存器(重复计数器);执行 RPTB指令时用到BRC,RSA和REA寄存器。由于两者使用了不同 的寄存器,因此二者可以嵌套。当然,只要保存好有关寄存器, RPTB和RPTB也可嵌套,但效率不高。 Lst: STM #L-1, AR7 ;2T 外部 ;开销为4L+2T STM #M-1, BRC ;2T RPTB abc-1 ;4T 中间 ;开销为6T 中间 RPT #N-1 ;1T开销为1T 内部 中间 中间 Abc: 外部 外部 BANZ lst , *AR7- ; 4T
第五节 数据块传送 C54X有10条数据传送指令: 数据存储器~数据存储器: MVDK smem, dmad MVKD dmad, smem MVDD xmem, ymem 程序存储器~数据存储器: MVPD pmad, smem MVDP smem, pmad 数据存储器~MMR: MVDM dmad, MMR MVMD MMR, dmad MVMM mmr, mmr 程序存储器~数据存储器: READA smem WRITA smem
这些指令的特点: • 传送速度比加载和存储指令要快; • 传送数据不需要通过累加器; • 可以寻址程序存储器; • 与RPT指令相结合,可以实现数据块传送。
一、程序存储器~数据存储器 例、数组X[5]={1,2,3,4,5}初始化。 .title “example.asm” .mmregs STACK .usect “STACK”,10H .bss x, 5 .data Table .word 1,2,3,4,5 .def start .text Start: STM #x, AR1 RPT #4 MVPD table,*AR1+ End: B end .end
二、数据存储器~数据存储器 • 例、将数据存储器中的数组x[20]复制到数组y[20]。 .title “example.asm” .mmregs STACK .usect “STACK”,30H .bss x,20 .bss y,20 .data Table .word 1,2,3,4,5,6,7,8,9,10,11,12,13,14 .word 15,16,17,18,19,20 .def start .text Start: STM #X,AR1 RPT 19 MVPD table,*AR1+ STM #X,AR2 STM #Y,AR3 RPT 19 MVDD *AR2+,*AR3+ End: B end .end
vectors.obj shiyan1.obj -o shiyan1.out -m shiyan1.map -e start MEMORY { PAGE0: EPROM: org=0E000H, len=0100h VECS: org=0FF80H, len=0004H PAGE1: SPRAM: org=0060h, len = 0010H DARAM:org=0080H, len=0100H } SECTIONS: { .text :> EPROM PAGE0 .data :>EPROM PAGE0 .bss :>SPRAM PAGE1 STACK:>DARAM PAGE1 .vectors:>VECS PAGE0 }
第六节 双操作数乘法 TMS320C54X片内的多总线结构,允许在一个机器 周期内通过两个16位数据总线寻址两个数据和系数。 例、求y=mx+b(利用单操作数和双操作数两种方法)。 LD @m, T MPY *AR2,*AR3,A MPY @x, A ADD @b, A ADD @b, A STL A, @y STL A, @y 用双操作数指令编程的特点: • 用间接寻址方式获得操作数,且辅助寄存器为AR2~AR5; • 占用的程序空间小; • 运行速度快。
注: • 双操作数指令有四种: MPY Xmem , Ymem ,dst ;dst=Xmem*Ymem MAC Xmem, Ymem ,src[,dst] MAS Xmem, Ymem, src[,dst] MACP Smem, Pmad ,src[,dst] ** Smem数据存储器地址; Xmem , Ymem双操作数数据 存储器地址; Pmad为16位立即数程序存储器地址。 • 对Xmem , Ymem,只能用以下辅助存储器及寻址方式: 辅助寄存器:AR2 寻址方式:*ARn AR3 *ARn+ AR4 *ARn- AR5 *ARn+0%