小命 第五章汇编语言编程举例 第一节汇编语言编程的基本方法 第二节DSP的浮点运算方法 第三节DSP在信号发生器上的应用 第四节用DSP实现FIR滤波器
2 第五章 汇编语言编程举例 第一节 汇编语言编程的基本方法 第二节 DSP的浮点运算方法 第三节 DSP在信号发生器上的应用 第四节 用DSP实现FIR滤波器
小命 第一节汇编语言编程的基本方法 1.堆栈的使用 压入数据时,堆栈从高地址向低地 要址增长。 点2压栈时指针先减,SP-1,再压入数 据 3出栈时,先弹出数据后,再SP+1。 4如要用堆栈,必须先设置,后使用
3 第一节 汇编语言编程的基本方法 1.堆栈的使用 1.压入数据时,堆栈从高地址向低地 址增长。 2.压栈时指针先减,SP-1,再压入数 据; 3.出栈时,先弹出数据后,再SP+1。 4.如要用堆栈,必须先设置,后使用。 要 点
小命 例5-1设计一存储空间为100个单元的堆栈 size set 100 ;设置堆栈空间的 ;大小为100 stack. sect“STK”,size;设置堆栈段的首地址 ;和堆栈空间 STM# stack+size,SP;将栈底地址指针送 数据存储器 SP,对其初始化 栈顶 stack 可用栈区 sP→[最后用的单元°TX 栈底 已用栈区 65535
4 例5-1 设计一存储空间为100个单元的堆栈。 size .set 100 ;设置堆栈空间的 ;大小为100 stack .usect “STK”,size ;设置堆栈段的首地址 ;和堆栈空间 STM #stack+size,SP ;将栈底地址指针送 ; SP,对其初始化
小命 2.加、减法和乘法运算 例5-2编写求解加、减法的程序,计算z=x+y-W。 SUM1:LD@x,A;将x地址的内容送A ADD@y,A;将y地址的内容与A中x值相加 SUB@w,A;将A中的内容与w相减,得z STLA,@z;将A的的计算值存入z地址中 例5-3写求解直线方程的程序,计算y=mx+b SUM2:LD@m,T;将皿地址的内容送T MPY國x,A;将x地址的内容与T中的m相乘, ;结果送A ADD@b,A;将A中的mx与b地址的内容相加, ;结果送A STLA,@y;将A的的计算结果存入y地址中
5 例5-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 地址中 例5-3 写求解直线方程的程序,计算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指令相结合(重复时,这些指 令都变成单周期指令),可以实现 数据块传送
6 传送速度比加载和存储指令要快; 传送数据不需要通过累加器; 可以寻址程序存储器; 与RPT指令相结合(重复时,这些指 令都变成单周期指令),可以实现 数据块传送。 3. 数据块传送 特 点
小命 (1)数据存储器←→数据存储器这类指令有: MVDK Smem,dmad指令的字数/执行周期2/2 MVKD dmad Smem Smem=dmad 2/2 MVDD Xmem Mem YI mem=xmem 1/1 (2)程序存储器←→数据存储器这类指令有: MVPD pmad, Smem Smem=pmad 2/3 MVDP Smem, pmad pmad=Smem 2/4 pmad为16位立即数程序存储器地址; A1将粉焊触要地
7 (1)数据存储器←→数据存储器 这类指令有: MVDK Smem,dmad 指令的字数/执行周期 2/2 MVKD dmad,Smem ; Smem=dmad 2/2 MVDD Xmem,Ymem ; Ymem=Xmem 1/1 (2)程序存储器←→数据存储器 这类指令有: MVPD pmad,Smem ; Smem=pmad 2/3 MVDP Smem,pmad ; pmad=Smem 2/4 pmad为16位立即数程序存储器地址; dmad为16位立即数数据存储器地址;
(3)数据存储器←→MMR这类指令有 MVdM dmad,MMR;指令的字数/执行周期2/2 MVMD MMR, dmad dmad=MMR 2/2 MVMM mmrx, mmry mmry=mmrx (4)程序存储器(Acc)←→数据存储器包括: READA Smem Smem=prog (a) WRITA Smem prog (a)= Smem 1/5 mmrx,mmry为ARO~AR7或SP; MMR为任何一个存储器映象寄存器
8 (3)数据存储器←→MMR 这类指令有: MVDM dmad,MMR ;指令的字数/执行周期 2/2 MVMD MMR,dmad ;dmad=MMR 2/2 MVMM mmrx,mmry ;mmry=mmrx 1/1 (4)程序存储器(Acc)←→数据存储器 包括: READA Smem ;Smem=prog(A) 1/5 WRITA Smem ;prog(A)= Smem 1/5 mmrx,mmry为AR0~AR7或SP; MMR为任何一个存储器映象寄存器;
小命 (1)程序存储器→数据存储器 例5-6将数组x[5]初始化为{1,2,3,4,5}。 data ;定义初始化数据段起始地址 TBL:.Word1,2,3,4,5;为标号地址TBL 开始的5个单元赋初值 sect“, ectors 定义自定义段,并获 得该段起始地址 B START;无条件转移到标号为 START的地址 b ;为数组x分配5个存储单元 text 定义代码段起始地址 START: STM #x AR5 将x的首地址存入AR5 RPT #4 设置重复执行5次下条指令 MVPD TBL,*AR5+;将TBL开始的5个值传给x
9 例5-6 将数组x[5] 初始化为{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)程序存储器→数据存储器
小命 (2)数据存储器→数据存储器 例5-7将数据存储器中的数组x[0]复制到数组y[10]。 title“cjy1.asm”;为汇编源程序取名 dregs ;定义存储器映象寄存器 STACK. sect“ STACK”,30H;设置堆栈 b Ss x,10;为数组x分配10个存储单元 y,10;为数组y分配10个存储单元 data table:word1,2,3,4,5,6,7,8,9,10 def start;定义标号 start text
10 例5-7 将数据存储器中的数组x[10]复制到数组y[10]。 .title “cjy1.asm” ;为汇编源程序取名 .mmregs ;定义存储器映象寄存器 STACK .usect “STACK” ,30H;设置堆栈 .bss x,10 ;为数组x分配10个存储单元 .bss y,10 ;为数组y分配10个存储单元 .data table:.word 1,2,3,4,5,6,7,8,9,10 .def start ;定义标号start .text (2)数据存储器→数据存储器
0,SWKs:复位sW 小命 start: stm STM# STACK+30H,SP;初始化堆指针 STM#x,AR1;将目的地首地址赋给AR1 RPT#19;设定重复传送的次数为20次 MVPD tab1e,*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
11 start:STM #0,SWWSR ;复位SWWSR STM #STACK+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