程序示例
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
table:
;0.66 ;-0.33
(16348) (512)
start:
; 传送2个数据至分子、分母单元 ;将分母移到累加器A(32~16) ;(num)*A(32~16) →B,获取商的符号 ;(在累加器B中) ;分母取绝对值 ;分母绝对值存回原处 ;分子→ A(32~16) ;分子取绝对值 ;16次减法重复操作,完成除法
数据存储器→数据存储器
编写一段程序,将数据存储器中数组x[20]中的数据复制到数组y[20]中 .title “zh10.asm” .mmregs .usect “STACK”,10H :堆栈的设置 .bss x,20 .bss y,20 .data .word 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 .def start .text STM #x,AR1 RPT #19 MVPD table,*AR1+ STM #x,AR2 STM #y,AR3 RPT #19 MVDD *AR2+,*AR3+ B end .end
65535
...
加减法运算和乘法运算
计算Z=X+Y-W STACK
Байду номын сангаас
table : start:
end: SUMB:
.title “zh3.asm” .mmregs .usect “STACK”,10H .bss x,1 .bss y,1 .bss w,1 .bss z,1 .def start .data .word 10,26,23 .text STM #0,SWWSR STM #STACK+10H,SP STM #x,AR1 RPT #2 MVPD table,*AR1+ CALL SUM B end LD @x,A ADD @y,A SUB @w,A STL A,@z RET .end
len=0100h len=0004h
len=0020h len=0100h
PAGE0 PAGE0 PAGE1 PAGE1 PAGE0
STACK
table:
start:
end: SUM:
.title .mmregs .usect .bss .bss .bss .def .data .word .word .text STM STM STM RPT MVPD CALL B STM STM RPTZ MAC STL RET .end
:堆栈的设置 ;为变量分配4个字的存储空间
;m,x,b ;插入0个等待状态 ;设置堆栈指针 ;AR1指向m ;移3个数据
对数组x[5]每个元素加1 start: .bss LD STM STM RPTB ADD STH LD x,5 #1,16,B #4,BRC #x,AR4 next-1 *AR4,16,B,A A,*AR4+ #0,B
len=01F8H len=00080H len=00030H len=01380H
VECS EPROM EPROM SPRAM DARAM
PAGE0 PAGE0 PAGE0 PAGE1 PAGE1
除法运算
在C54x中没有除法器硬件,也就没有专门的除法指令。但是,可以利用一条
条件减法指令(SUBC)加上重复指令“RPT #15”可以实现两个无符号数的除法 运算。
数据存储器 0 ... stack SP→ 可用栈区 最后用的单元 已用栈区
}
.set 100 .usect “STK”,size STM #stack+size,SP STK 堆栈的用法: 压入堆栈:SP先减1后,再将数据压入堆栈中 弹出操作:数据弹出后,再将SP加1
堆栈的设置 size stack
图7-9 DSP定点运算中小数的表示
计算y= x i
i=1
5
STACK
table: start:
end: SUM:
loop:
.title .mmregs .usect .bss .bss .def .word .text STM STM STM RPT MVPD LD CALL B STM STM ADD BANZ STL RET .end
:堆栈的设置 ;为变量分配4个字的存储空间
;x,y,w ;插入0个等待状态 ;设置堆栈指针 ;AR1指向x ;移3个数据
计算y=mx+b STACK
table : start:
end: SU:
.title “zh4.asm” .mmregs .usect “STACK”,10H .bss m,1 .bss x,1 .bss b,1 .bss y,1 .def start .data .word 3,15,20 .text STM #0,SWWSR STM #STACK+10H,SP STM #m,AR1 RPT #2 MVPD table,*AR1+ CALL SU B end LD @m,T MPY @x,A ADD @b,A STL A,@z RET .end
“zh7.asm”
“STACK”,10H a,4 x,4 y,4 start 1,5,3,4 8,6,7,2 #0,SWWSR #STACK+10H,SP #a,AR1 #7 table,*AR1+ MAX end
;设置堆栈指针 ;AR1指向a
MAX:
loop
STM STM STM LD MPY LD MPY MAX BANZ STL RET .end
next
对数组x[5]初始化后再对每个元素加1 .title “zh7.asm” .mmregs .usect “STACK”,10H .bss x,5 .def start .text STM #x,AR1 LD #2H,A RPT #4 STL A,*AR1+ LD #1,16,B STM #4,BRC RPTB next-1 ADD *AR4,16,B,A STH A,*AR4+ LD #0,B B end .end
#a,AR1 #x,AR2 #2,AR3 *AR1+,T *AR2+,A *AR1+,T *AR2+,B A loop,*AR3A,@y
; 第一个乘积在累加器A中 ;其他乘积在累加器B中 ;累加器A和B比较,选大的存入A中 ;此循环中共进行3次乘法运算和比较
比较操作CMPR
编程时,需要数据与数据进行比较,CMPR指令测试所规定的AR寄存器(AR1~AR7) 与AR0的比较结果。如果所给定的测试条件成立,则TC位置1,然后,条件分支转移指 令就可以根据TC位的状态进行分支转移,所有比较的数据都是无符号操作数。 start: loop: STM STM … … *AR1+ … … CMPR BC #5,AR1 #10,AR0
SUBC Smem,src
;(src)-(Smem)《15→ALU输出
;如果ALU输出》0,则(ALU输出)《1+1 →src ;否则(src) )《1 →src
下面考虑:当被除数≥除数,商为整数 编写0.66 ⁄ (-0.33)程序段
除法运算
.bss num.1 .bss den.1 .bss quot.1 .data .word 66*32768/100 .word -33*32768/100 .text STM #num,AR1 RPT #1 MVPD table,*AR1+ LD @den,16,A MPYA @num ABS STH LD ABS RPT SUBC XC NEG STL A A,@den @num,16,A A #15 @den,A 1,BLT A A,@quot
STACK
:堆栈的设置
start:
;将数组每个元素初始化为2
;B←10H,为每个元素加1作准备 ;BRC←04H
next end:
初始化数组x[5]={1,2,3,4,5} .title “zh9.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 重复执行MVPD指令,实现程序存储器至数据存储器的数据传输,在系统初始化过程中非 常有用。可以将数据表格与文本一道驻留在程序存储器中,复位后将数据表格传送到数据 存储器中。从而不需要配置数据ROM,降低系统成本。
;x1,x2,x3,x4,x5 ;插入0个等待状态 ;设置堆栈指针 ;AR1指向x
/*
zh1.cmd
*/
MEMORY { PAGE 0: EPROM: org=0e00H VECS: org=0FF80H PAGE 0: SPRAM: org=0060H DARAM: org=0080H } SECTIONS { .text :>EPROM .data :>EPROM .bss :>SPRAM STACK :>DARAM .vectors :>VECS }
“zh6.asm” “STACK”,10H a,4 x,4 y,4 start 1,2,3,4 8,6,4,2 #0,SWWSR #STACK+10H,SP #a,AR1 #7 table,*AR1+ SUM end #a,AR3 #x,AR4 A,#3 *AR3+,*AR4+,A A,@y
计算y= a i x i
LT,AR1 loop,TC
堆栈的使用方法
程序中要用到堆栈,则先必须进行设置,方法如下: size .set 100 stack .usect “STK”,size STM #stack+size,SP
上述语句在数据RAM空间开辟一个堆栈区。前两句在数据RAM中自定义一个名为STK 的保留空间,共100个单元。第3句将这个保留空间的高地址(#stack+size)赋给SP, 作为栈底。至于自定义未初始化段STK究竟定位在数据RAM中什么位置,应当在链接 器命令文件中规定。
“zh1.asm”
“STACK”,10H x,5 y,1 start 10,20,3,4,5 #0,SWWSR #STACK+10H,SP #x,AR1 #4 table,*AR1+ #0,A SUM end #x,AR3 #4,AR2 *AR3+,A loop,*AR2A,@y ;堆栈的设置 ;为变量分配6个字的存储空间
加法、减法和乘法运算
1.定点DSP中数据表示方法 定点DSP芯片的数值表示是基于2的补码表示形式。数的定标 有Q表示法和S表示法,表7-10列出了16位数的16种Q表示和S表 示,以及它们所能表示的十进制数范围。16位中有一个符号位、Q 个小数位和15-Q个整数位来表示一个数。
表7-10 Q表示、S表示及数值范围
i=1
4
;设置堆栈指针 ;AR1指向a ;移动8个数据 ;从程序存储器到数据存储器 ;调用SUM子程序 ;子程序执行
在上例中4项乘积ai xi (i 1, 2,3, 4)中找出最大值,并存放在累加器A中。
STACK
table:
start:
end:
.title .mmregs .usect .bss .bss .bss .def .data .word .word .text STM STM STM RPT MVPD CALL B
STACK
table;
start:
end:
/* zh10.cmd */ MEMORY { PAGE0: EPROM: VECS: PAGE1: SPRAM: DARAM: } SECTIONS { .vectors:> .text:> .data:> .bss:> STACK:> }
org=0E00H org=0FF80H org=00060H org=00090H
;如果B<0(商是负数),则需要变号
;保存商
除法运算
被除数 16385
除数 512
商(十六进 商(十进制) 制) 0xC020 32 -2
66*32768/100(0.66) -33*32768/100(-0.33) 0xFFFE
表4-4 乘法指令
表4-7 专用指令
返回本节
表4-19 混合程序控制指令
除法运算
双操作数乘法
求y=mx+b,单操作数与双操作数实现方法比较如下:
单操作数方法 LD MPY ADD STL @m,T @x,A @b,A A,@y 双操作数方法 MPY ADD STL *AR2,*AR3,A @b,A A,@y