《dsp戴明帧主编第5章汇编语言程序设计》由会员分享,可在线阅读,更多相关《dsp戴明帧主编第5章汇编语言程序设计(35页珍藏版)》请在金锄头文库上搜索。
1、第五章 汇编语言程序设计,概述 程序的控制与转移(重点) 堆栈的使用方法 加、减法和乘法运算(重点) 重复操作(重点) 数据块传送(重点) 双操作数乘法 长字运算和并行运算,2,概述,汇编语言源程序格式:,标号:,助记符,操作数,;注释,用空格或 T 隔开,书写格式规则详见P140,汇编语言程序以.asm为扩展名。一条语句占源程序的一行,汇编器每行最多读200个字符。因此,语句的执行部分必须限制在200个字符以内。,3,5.1程序的控制与转移,4,5.1程序的控制与转移,5,5.1程序的控制与转移,组间条件只能“或” 第一组两类条件可以“与”/“或”,但累加器必须是同一个 第二组三类条件可以各
2、选一个条件“与”/“或” 同组同类条件不能选择两个,5.1程序的控制与转移,例5-1 条件分支转移,RC TC CC sub, BNEQ BC new, AGT, AOV,;TC=1返回,TC=0继续 ;B0,调用sub,B=0继续 ;A0且溢出(“与”的关系),转至new,否则继续,5.1程序的控制与转移,BC new, AGT BC new, AOV,;A0,转至new,否则继续 ;A溢出,转至new,否则继续,若例1中两个条件相“或”怎么办?,8,循环操作,5.1程序的控制与转移,.bss x, 5 ;为变量x分配5个存储单元 .bss y,1 ;为变量y分配1个存储单元 STM #x,
3、 AR1 ; AR1指向x的首地址 STM #4,AR2 ;将操作数#4赋给AR2 LD #0,A ;将累加器A清0 loop: ADD *AR1+, A ;执行加法运算,结果存入累加器A中 BANZ loop, *AR2- ; AR2不为0转移,重复执行5次 STL A,y ;将结果(A的低16位)送往变量y存储单元,.title “Ex534.asm“ ;为汇编语言源文件取名 .mmregs ;定义存储器映像寄存器 stack .usect “STACK“, 10h ;为堆栈空间分配16个存储单元 .bss x, 5 ;为变量x分配5个存储单元 .bss y,1 ;为变量y分配1个存储单元
4、 .def start ;定义标号start .data ;定义数据代码 table: .word 1,2,3,4,5 ;为标号table开始的5个存储单元赋值 .text ;定义文本代码段 start: STM #0, SWWSR ; SWWSR置0,不插等待周期 STM #stack+10h, SP ;设置堆栈指针 CALL init ;调用子程序init STM #x, AR1 ;将变量x的首地址赋给AR1 STM #4,AR2 ;将操作数#4赋给AR2 LD #0,A ;将累加器A清0 loop: ADD *AR1+, A ;执行加法运算,结果存入累加器A中 BANZ loop, *A
5、R2- ; AR2不为0转移,重复执行5次 STL A,y ;将结果(A的低16位)送往变量y存储单元 init: STM #x, AR1 ; AR1指向x的首地址 RPT #4 ;重复执行下条指令5次 MVPD table, *AR1+ ;重复传递共5个数据 RET ;子程序返回 .end ;源程序结束,利用CMPR指令进行比较操作 指定的ARx寄存器(x=17)与AR0比较,测试条件成立TC置1。 例:5-3比较操作后条件分支转移,5.1程序的控制与转移,STM #5, AR1 ;(AR1)=5 STM #10, AR0 ; (AR0)=10 loop: MAR *AR1+ ; AR1=A
6、R1+1 CMPR LT, AR1 ;若AR1- AR0 0,则TC=1,否则为0 BC loop, TC ;若AR1- AR0 0,则循环 若AR1=AR0,则顺序执行,5.2堆栈的使用方法,特点: 16位堆栈指针SP 向堆栈中压入数据时,堆栈指针从高地址向低地址移动 压入堆栈时,先SP-1,再压入数据;弹出操作数时,先弹出数据,后SP+1,10,设置好堆栈后,就可以使用堆栈了,如: CALL pmad ;(SP)-1SP, (PC)+2TOS,pmadPC RET ;(TOS)PC,(SP)+1SP,5.3 加、减法和乘法运算,例5-4 计算z=x+y-w 使用:加法指令ADD,减法指令S
7、UB,11,LD x, A ADD y, A SUB w, A STL A, 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,加法指令ADD,12,LD m, T MPY x, A ADD b, A STL A, 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,乘法累加指令M
8、AC,13,LD x1, T MPY a1, A LD x2, T MAC a2, A STL A, y STH A, 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,14,15,加法/减法,16,.title “Ex_543.asm“ ;为汇编语言源文件取名 .mmregs ;定义存储器映像寄存器 stack .usect “STACK“, 10H
9、;为堆栈空间分配16个存储单元 .bss a,4 ;为系数a分配4个存储单元 .bss x,4 ;为变量x分配4个存储单元 .bss y,1 ;为变量y分配1个存储单元 .def start ;定义标号start .data ;定义数据代码 table: .word 1,2,3,4 ;为标号table开始的 .word 8,6,4,2 ; 8个存储单元赋值 .text ;定义文本代码段 start: STM #0, SWWSR ; SWWSR置0,不插等待周期 STM #stack+10H, SP ;设置堆栈指针 STM #a, AR1 ; AR1指向a的首地址 RPT #7 ;重复执行下条指
10、令8次 MVPD table, *AR1+ ;从程序存储器向数据存储器,重复传递共8个数据 CALL SUM ;调用子程序SUM end: B end ;循环等待 SUM: STM #a, AR3 ;将系数a的首地址赋给AR3 STM #x, AR4 ;将变量x的首地址赋给AR4 RPTZ A, #3 ;将累加器清0,重复执行下条指令4次 MAC *AR3+, *AR4+, A;执行乘法累加运算,结果存入累计器A中 STL A, y ;将结果(A的低16位)送往变量y存储单元 RET ;子程序返回 .end ;源程序结束,【例5-8】在例5-7的4项乘积ai xi(i=1,2,3,4)中找出最
11、大值,并存放累加器A中。,程序: STM #a, AR1 STM #x, AR2 STM #2, AR3 LD *AR1+,T MPY *AR2+,A loop1: LD *AR1+,T MPY *AR2+,B MAX A BANZ loop1,*AR3-,;系数a的首地址赋给AR1 ;变量x的首地址赋给AR2 ;设置计数器AR3=2 ;取系数T=a1,并修改AR1 ;乘法运算A=a1x1,并修改AR2 ;取系数T=ai,并修改AR1 ;乘法运算B=aixi,并修改AR2 ;求A和B中的最大值 ,结果存入A ;若AR30,则循环,并修改AR3 若AR3=0,则顺序执行,5.3 加、减法和乘法运
12、算,18,5.4 重复操作,例5-9 对一个数组进行初始化X5=0,0,0,0,0,【例5-9】对数组进行初始化,使x5=0,0,0,0,0。,.bss x, 5 STM #x, AR1 LD #0, A RPT #4 STL A,*AR1+,.bss x, 5 STM #x, AR1,RPTZ A, #4 STL A, *AR1+,注意:, 对x5中的5个元素置0,重复次数为4,即执行1次STL A,AR1+指令后,再重复执行4次;, RPTZ指令设定重复次数后,再对累加器清零。,5.4 重复操作,20,块重复操作,例5-10 对数组X5中每个元素加1,例5-10 对数组x5中的每一元素加1
13、。,.bss x, 5 begin: LD #1,B STM #4,BRC STM #x,AR4 RPTB next-1 ADD *AR4,B,A STL A,*AR4+ next: LD #0,B ,;设置数组空间 ;立即数1送入B ;设置重复次数,BRC=4,循环5次 ;数组首地址x送入AR4 ;设置循环结束地址 ;数组数据与B相加,结果存入A中 ;存储数组结果,并修改地址 ;B清0,块重复操作,22,5.5 数据块传送,数据传送指令的特点:, 传送速度比加载和存储指令要快; 数据传送不通过累加器; 可寻址程序存储器; 与RPT结合,可实现数据块传送。,23,5.5 数据块传送,例5-11
14、数组X5=1,2,3,4,5初始化(程序存储器和数据存储器之间的数据传送),24,.data TBL: .word 1,2,3,4,5 .bss x,5 .text START: STM #x,AR5 RPT #4 MVPD TBL,*AR5+ ,;定义数据代码段 ;为标号TBL开始的5个存储单元赋初值 ;为变量x分配5个存储单元 ;定义文本代码段 ;将变量x的首地址赋给AR5 ;将下条指令重复执行5次 ;将数据送入X对应地址单元中,5.5 数据块传送,例5-12编写一段程序将数据存储器中的数组x20复制到数组y20。(数据存储器和数据存储器之间的数据传送),25,.bss x,20 .bss y,20 .text LD #x,AR2 LD #y,AR3 RPT #19 MVDD *AR2+,*AR3+ ,;为变量x分配20个存储单元 ;为变量y分配20个存储单元 ;定义文本代码段 ;将变量x的首地址赋给AR2 ;将变量y的首地址赋给AR3 ;将下条指令重复执行