DSP汇编语言程序的编写 (1)汇编语言源程序以asm为其扩展名。 (2)汇编语言源程序的每一行都可以由4个部分组成,句法如下: 标号|:助记符操作数b;注释 其中可用空格或TAB键隔开 标号一一供本程序的其他部分或其他程序调用。标号是任选项,标号后面可以加也可以不加 冒号“:”。标号必须从第一列写起,标号最多可达到32个字符(A~Z,a~z,0~9,, 以及$),但第1个字符不能以数字开头。引用标号时,标号的大小写必须一致。标号的值就 是SPC(段程序计数器)的值。如果不用标号,则第一个字符必须为空格、分号或星号(*) 助记符——助记符指令、汇编指令、宏指令和宏调用。作为助记符指令,一般用大写:汇编 命令和宏指令,以英文句号“.”开始,且为小写。汇编命令可以形成常数和变量,当用它 控制汇编和连接过程时,可以不占用存储空间。指令和汇编命令都不能写在第1列。 操作数——指令中的操作数或汇编命令中定义的内容。操作数之间必须用逗号“,”分开。 有的指令操作无操作数,如NOP、 RESET 注释——注释从分号“;”开始,可以放在指令或汇编命令的后面,也可以放在单独的一行 或数行。注释是任选项。如果注释从第1列开始,也可以用“*”表示注释 (3) 常用的汇编命令如表所示 汇编命令 举例 titl 紧随其后的是汇编语言程序正文. title“ example.asm” d 结束汇编命令 放在汇编语言程序的最后 经汇编后,紧随.text后的是可执行程 紧随其后的是汇编语言程序正文 序代码 紧随其后的是己初始化数据 有两种数据形式:.int和.word int用来设置一个或多个16位无 nt ,1n 符号整型量常数 table word 6.8. 4 word用来设置一个或多个16位符 表示在程序存储器标号为 号整型量常数 tabe开始的8个单元中存放初始化数 据1,2, bssx,4表示在数据存储器中空出4 bs bss为未初始化变量保留存储空间 个存储单元存放变量x1,x2,x3和x4
1.DSP 汇编语言程序的编写 (1) 汇编语言源程序以.asm 为其扩展名。 (2) 汇编语言源程序的每一行都可以由 4 个部分组成,句法如下: [标号] [:] 助记符 [操作数] [;注释] 其中可用空格或 TAB 键隔开 标号——供本程序的其他部分或其他程序调用。标号是任选项,标号后面可以加也可以不加 冒号“:”。标号必须从第一列写起,标号最多可达到 32 个字符(A~Z ,a~z ,0~9 ,_ , 以及$),但第 1 个字符不能以数字开头。引用标号时,标号的大小写必须一致。标号的值就 是 SPC(段程序计数器)的值。如果不用标号,则第一个字符必须为空格、分号或星号(*)。 助记符——助记符指令、汇编指令、宏指令和宏调用。作为助记符指令,一般用大写;汇编 命令和宏指令,以英文句号“.”开始,且为小写。汇编命令可以形成常数和变量,当用它 控制汇编和连接过程时,可以不占用存储空间。指令和汇编命令都不能写在第 1 列。 操作数——指令中的操作数或汇编命令中定义的内容。操作数之间必须用逗号“,”分开。 有的指令操作无操作数,如 NOP、RESET。 注释——注释从分号“;”开始,可以放在指令或汇编命令的后面,也可以放在单独的一行 或数行。注释是任选项。如果注释从第 1 列开始,也可以用“*”表示注释。 (3) 常用的汇编命令如表所示。 汇编命令 作用 举例 .title 紧随其后的是汇编语言程序正文 .title “example.asm” .end 结束汇编命令 放在汇编语言程序的最后 .text 紧随其后的是汇编语言程序正文 经汇编后,紧随.text 后的是可执行程 序代码 .data 紧随其后的是已初始化数据 有两种数据形式:.int 和.word .int .int 用来设置一个或多个 16 位无 符号整型量常数 .word .word 用来设置一个或多个16位符 号整型量常数 table: .word 1,2,3,4 .word 6,8,4,2 表 示 在 程 序 存 储 器 标 号 为 table 开始的 8 个单元中存放初始化数 据 1,2,3,4,6,8,4,2 .bss .bss 为未初始化变量保留存储空间 .bss x,4 表示在数据存储器中空出 4 个存储单元存放变量 x1,x2,x3 和 x4
.sect“ vectors”定义向量表,紧随 sec 建立包含代码和数据的自定义段其后的是复位向量和中断向量,名为 vectors STACK, sect TACK”,10h在数 为未初始化变量保留存储空间的自 use 据存储器中留出16个单元作为堆栈区 定义段 名为 STACK (4)汇编语言程序中的数据形式如表所示 形式 举例 进制 1110001b或1ll101B 八进制 226q或572Q 十进制 1234或+1234或-1234(缺省型) 十六进制 0A40h或0A40H或0xA40 浮点数 1.654e-23(仅C语言程序中能用,汇编程序中不能用) 字符 字符串 “ this is a strin 2 程序 2.1程序一 编程目的:了解DSP的输入和输出方法 程序功能:求乘积之和y=a1*x1+a2*x2+a3*x3+a4*x4 title"mpy add.asm mmregs 将存储映像寄存器导入列表 STACK. sect "STACK".1Oh 给堆栈段分配空间 441 将9个字空间分配给各个变量 PAO set o ;将端口PA0全部置0 def start ;定义标号stat 定义数据代码段 word4.4.4.4 word4.4.4.4 text 定义文本代码段 start STM #.. SWWSR 将等待寄存器设为0,表示不等待
.sect 建立包含代码和数据的自定义段 .sect “vectors”定义向量表,紧随 其后的是复位向量和中断向量,名为 vectors .usect 为未初始化变量保留存储空间的自 定义段 STACK .usect “STACK”,10h 在数 据存储器中留出 16 个单元作为堆栈区, 名为 STACK (4) 汇编语言程序中的数据形式如表所示 形式 举例 二进制 1110001b 或 1111001B 八进制 226q 或 572Q 十进制 1234 或+1234 或-1234(缺省型) 十六进制 0A40h 或 0A40H 或 0xA40 浮点数 1.654e-23(仅 C 语言程序中能用,汇编程序中不能用) 字符 ‘D’ 字符串 “this is a string” 2. 程序 2.1 程序一 编程目的:了解 DSP 的输入和输出方法 程序功能:求乘积之和 y=a1*x1+a2*x2+a3*x3+a4*x4 .title "mpy_add.asm" .mmregs ;将存储映像寄存器导入列表 STACK .usect "STACK",10h ;给堆栈段分配空间 .bss a,4 ;将 9 个字空间分配给各个变量 .bss x,4 .bss y,1 PA0 .set 0 ;将端口 PA0 全部置 0 .def start ;定义标号 start .data ;定义数据代码段 table: .word 4,4,4,4 .word 4,4,4,4 .text ;定义文本代码段 start: STM #0,SWWSR ;将等待寄存器设为 0,表示不等待
STM #STACK+10h.s 设堆栈指针 STM #a ARl 将ARl指向变量a的地址 RPT 从程序存储空间转移7+1个值到数据储存空间 MVPD table. *ARl+ CALL SUM 调用SUM子程序 B 循环等待 SUM STM #a, AR3 ;将AR3指向变量a的地址 STM #X AR4 将AR4指向变量x的地址 RPTz A#3 将A清0,并重复执行下一条指令3+1次 MAC *AR3+*AR4+A ;将寄存器A中的低16位存入y地址空间 PORTW @y, PAO 将y地址中的值输出到输出口 RET ;子程序返回 ;程序结束 等待位的设置: C54x片内有一部件——软件可编程等待状态发生器,控制着外部总线的工作。软件可 编程等待状态发生器可将外部总线周期延长多达7个周期,这样一来,C54x就能很方便的 与外部慢速器件相接口。如果外部器件要求插入7个以上的等待周期,则可以利用硬件 READY先来接口。当所有的外部寻址都配置在0等待状态时,加到等待状态发生器的时钟 被关断;来自内部时钟的这些通道被切断后,可以降低处理器的功耗 软件可编程等待状态发生器的工作由16位的软件等待状态寄存器( SWWSR)的控制, 它是存储器映象寄存器,在数据空间的地址为0028h。 将程序空间和数据空间都分成两个32K字块,IO空间由一个64K字块组成。这5个 字块空间在 SWWSR中都相应的有一个3位字段,用来定义各个空间插入等待状态的数目 14~12 l1~9 保留/PA 数据空间数据空间程序空间程序空间 I/O空间 (仅'C548 (高(低32(高32(低32 (64K) C549) 32K) 位) 位) 位) R/W R/W R/W 上述 SWWSR的各个3位字段规定的插入等待状态的最小数为0(不插入等待周期),最大 数为7(11b)。 2.2程序二 编程目的:熟悉DSP汇编程序设计技巧,完善输出功能
STM #STACK+10h,SP ;设堆栈指针 STM #a,AR1 ;将 AR1 指向变量 a 的地址 RPT #7 ;从程序存储空间转移 7+1 个值到数据储存空间 MVPD table,*AR1+ CALL SUM ;调用 SUM 子程序 end: B end ;循环等待 SUM: STM #a,AR3 ;将 AR3 指向变量 a 的地址 STM #x,AR4 ;将 AR4 指向变量 x 的地址 RPTZ A,#3 ;将 A 清 0,并重复执行下一条指令 3+1 次 MAC *AR3+,*AR4+,A STL A,@y ;将寄存器 A 中的低 16 位存入 y 地址空间 PORTW @y,PA0 ;将 y 地址中的值输出到输出口 RET ;子程序返回 .end ;程序结束 等待位的设置: C54x 片内有一部件——软件可编程等待状态发生器,控制着外部总线的工作。软件可 编程等待状态发生器可将外部总线周期延长多达 7 个周期,这样一来,’C54x 就能很方便的 与外部慢速器件相接口。如果外部器件要求插入 7 个以上的等待周期,则可以利用硬件 READY 先来接口。当所有的外部寻址都配置在 0 等待状态时,加到等待状态发生器的时钟 被关断;来自内部时钟的这些通道被切断后,可以降低处理器的功耗。 软件可编程等待状态发生器的工作由 16 位的软件等待状态寄存器(SWWSR)的控制, 它是存储器映象寄存器,在数据空间的地址为 0028h。 将程序空间和数据空间都分成两个 32K 字块,I/O 空间由一个 64K 字块组成。这 5 个 字块空间在 SWWSR 中都相应的有一个 3 位字段,用来定义各个空间插入等待状态的数目: 15 14~12 11~9 8~6 5~3 2~0 保留/XPA (仅’C548, ‘C549) I/O 空间 (64K) 数据空间 (高 32K) 数据空间 (低 32 位) 程序空间 (高 32 位) 程序空间 (低 32 位) R R/W R/W R/W R/W R/W 上述 SWWSR 的各个 3 位字段规定的插入等待状态的最小数为 0(不插入等待周期),最大 数为 7(111b)。 2.2 程序二 编程目的:熟悉 DSP 汇编程序设计技巧,完善输出功能
程序功能:实现一8位LED灯由左到右循环闪烁 itle"bubble. asm' 将存储映像寄存器导入列表 STACK sect" STACK",5h;给堆栈段分配空间 bss def start set start: STM #7000.SWWSR 设等待位 STM 将辅助寄存器AR3设为2(乘2,实现左移) STM #6.AR 将辅助寄存器AR1设为6(左移7次) STM #3.AR2 将辅助寄存器AR2设为3(循环执行4次) AR3. 将T(乘法寄存器)设为2 loop1: LD #l,A A寄存器值为1 STL y=1 PORTW @y, PAO 输出y地址内的值到输出口 STM #10000.AR4 将辅助寄存器AR4设为1000 oop3: RPT #10000 重复执行下一指令10000+1次 等待 BANZ loop, 'AR4- 循环AR4值10000+1次 loop2: MPY 将y×T,其值存入A寄存器 IL 将A的值存入y地址中 PORTW @y, PAO 输出y地址值到输出口 STM #10000AR5 将辅助寄存器AR5设为10000 loop4: RPT #10000 实现第8个灯跳转到第1个灯时的时间延迟 NOP BANz loop*AR5 BaNz loop2, * ARI end: B 数据寻址方式 C54x共有7种数据寻址方式,如表所示: 寻址方式 用途 举例 指令含义
程序功能:实现一 8 位 LED 灯由左到右循环闪烁 .title"bubble.asm" .mmregs ;将存储映像寄存器导入列表 STACK .usect "STACK",5h ;给堆栈段分配空间 .bss y,1 .def start .data PA0 .set 0 .text start: STM #7000,SWWSR ;设等待位 STM #2,AR3 ;将辅助寄存器 AR3 设为 2 (乘 2,实现左移) STM #6,AR1 ;将辅助寄存器 AR1 设为 6 (左移 7 次) STM #3,AR2 ;将辅助寄存器 AR2 设为 3 (循环执行 4 次) LD AR3,T ;将 T(乘法寄存器)设为 2 loop1: LD #1,A ;A 寄存器值为 1 STL A,@y ;y=1 PORTW @y,PA0 ;输出 y 地址内的值到输出口 STM #10000,AR4 ;将辅助寄存器 AR4 设为 10000 loop3: RPT #10000 ;重复执行下一指令 10000+1 次 NOP ;等待 BANZ loop3,*AR4- ;循环 AR4 值 10000+1 次 loop2: MPY @y,A ;将 y×T,其值存入 A 寄存器 STL A,@y ;将 A 的值存入 y 地址中 PORTW @y,PA0 ;输出 y 地址值到输出口 STM #10000,AR5 ;将辅助寄存器 AR5 设为 10000 loop4: RPT #10000 ;实现第 8 个灯跳转到第 1 个灯时的时间延迟 NOP BANZ loop4,*AR5- BANZ loop2,*AR1- BANZ loop1,*AR2- end: B end .end 数据寻址方式: C54x 共有 7 种数据寻址方式,如表所示: 寻址方式 用途 举例 指令含义
立即寻址 主要用于初始化LD#10, 将立即数10传送至 累加器A 绝对寻址 利用16位地址寻址SnA,+(y) 将累加器A的低 存储单元 位存放到变量y所在 的存储单元中 累加器寻址 把累加器的内容作为 READYA X 按累加器A作为地址 地址 读程序存储器,并存 入变量x所在的数据 存储器单元 直接寻址 利用数据页指针和堆LD@xA (DP+x的低7位地址) 栈指针寻址 →>A 间接寻址 利用辅助寄存器作为LD*AR1,A (ARl))——>A 地址指针 存储器映象寄存器寻快速寻址存储器映象| LDM STI,B (ST1) 寄存器 堆栈寻址 压入弹出数据存储| PSHM AG 器和MMR(存储器 (AG)——>TOS 映象寄存器) C54x寻址存储器有两种基本的数据形式:16位数和32位数。大多数指令能够寻址 16位数,但是,只有双精度和长字指令才能寻址32位数 在32位寻址时,先处理高有效字,然后处理低有效字。如果寻址的第1个字处在偶地 址,那么第2个字就处在下一个(较高的)地址;如果第1个字处在奇地址,那么第2个 字就处在前一个(较低的)地址。 循环操作:BANZ 在程序设计时,经常需要重复执行某一段程序。利用BANZ(当辅助寄存器部位0 时转移)指令执行循环技术和操作是十分方便的。如果要重复执行n次,则重复指令中应规 定计数值为n-1次。 重复操作: C54x有3条重复操作指令:RPT(重复下条指令)、RPIZ(累加器清0并重复下条指 令)以及RPIB(块重复指令) 重复指令RPT或RPIZ允许重复执行紧随其后的那一条指令。如果要重复执行n次 则重复指令中应规定计数值为n-1次
立即寻址 主要用于初始化 LD #10,A 将立即数 10 传送至 累加器 A 绝对寻址 利用 16 位地址寻址 存储单元 STL A,*(y) 将累加器 A 的低 16 位存放到变量 y 所在 的存储单元中 累加器寻址 把累加器的内容作为 地址 READYA x 按累加器 A 作为地址 读程序存储器,并存 入变量 x 所在的数据 存储器单元 直接寻址 利用数据页指针和堆 栈指针寻址 LD @x,A (DP+x 的低 7 位地址) ——>A 间接寻址 利用辅助寄存器作为 地址指针 LD *AR1,A ((AR1)) ——>A 存储器映象寄存器寻 址 快速寻址存储器映象 寄存器 LDM ST1,B (ST1)——>B 堆栈寻址 压入/弹出数据存储 器和 MMR(存储器 映象寄存器) PSHM AG (SP)-1——>SP, (AG)——>TOS ‘C54x 寻址存储器有两种基本的数据形式:16 位数和 32 位数。大多数指令能够寻址 16 位数,但是,只有双精度和长字指令才能寻址 32 位数。 在 32 位寻址时,先处理高有效字,然后处理低有效字。如果寻址的第 1 个字处在偶地 址,那么第 2 个字就处在下一个(较高的)地址;如果第 1 个字处在奇地址,那么第 2 个 字就处在前一个(较低的)地址。 循环操作:BANZ 在程序设计时,经常需要重复执行某一段程序。利用 BANZ(当辅助寄存器部位 0 时转移)指令执行循环技术和操作是十分方便的。如果要重复执行 n 次,则重复指令中应规 定计数值为 n-1 次。 重复操作: C54x 有 3 条重复操作指令:RPT(重复下条指令)、RPTZ(累加器清 0 并重复下条指 令)以及 RPTB(块重复指令)。 重复指令 RPT 或 RPTZ 允许重复执行紧随其后的那一条指令。如果要重复执行 n 次, 则重复指令中应规定计数值为 n-1 次