- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
. bss x,20 .bss y,20 … STM #x,AR2 STM #y,AR3 RPT #19 MVDD *AR2+,*AR3+
第5章 TMS320C54x汇编语言程序设计
ቤተ መጻሕፍቲ ባይዱ
1.3 算术运算程序
基本算术运算包括: 加减法和乘法运算 除法运算 长字和并行运算
例:编写完成 y=aixi(i=1~20)
第5章 TMS320C54x汇编语言程序设计
【例5.5.2】对数组x[8]中的每一元素加1。
.bss begin: LD STM STM RPTB ADD STH next: LD … x, 8 #1,16,B #7,BRC #x,AR4 next-1 *AR4,16,B,A A,*AR4+ #0,B ;设置数组空间 注 意 ;立即数1送入BH ① 块结束地址 REA ; 设置重复次数 ,BRC= 7通常取程 ,循环8次 序块最后一条指令的下一 ;数组首地址 x送入AR4 条指令地址-1; ;设置循环结束地址 ; 数组数据左移 16位与 ② 重复次数为 7次 BH相加 ; 存入数组结果,并修改地址 ③ RPTB指令可以响应中断。 ;B 清0
;设置循环次数
AR4→
DBF8 D D ,SP→AR4 DBF8 ;设置数据指针 AR4 DBF8 D ;循环,充填数据 … length … DBF8 D DBF8 D DBF8 D
SP→
第5章 TMS320C54x汇编语言程序设计
堆栈区的大小可以按照以下步骤来确定:
① 先开辟一个较大的堆栈区,用已知数充填。 ② 运行程序,执行所有堆栈操作。 ③ 检查堆栈中的数值。 用过的堆栈区就是实际需要 的堆栈空间。
RPT
RPTB BANZ
N
M L
1
4+2 4L+2
第5章 TMS320C54x汇编语言程序设计
4. 算术运算程序 4.1 长字运算和并行运算
1.长字运算 ’C54x可以利用32位长操作数进行长字运算。 长字指令: ;dst=Lmem 单周期 DLD Lmem,dst ;Lmem=src 双周期 DST src,Lmem ;dst=src+Lmem 单周期 DADD Lmem,src[,dst] ;dst=src-Lmem 单周期 DSUB Lmem,src[,dst] ;dst=Lmem-src 单周期 DRSUB Lmem,src[,dst]
进一步优化的程序: STM STM RPTZ MAC STH STL #x,AR2 #a,AR3 A,#19 *AR2+,*AR3+,A A,@y A, @y+1
第5章 TMS320C54x汇编语言程序设计
【例5.4.3】计算 y =
a x
i 1
4
i i
程序: ******************************************** * example.asm * ******************************************** .title “example.asm” .mmregs ;为堆栈指定空间 stack .usect “STACK”,10h .bss a,4 ;为变量分配9个字的空 间 .bss x,4 .bss y,1 .def start .data
; 变量初始化
start:
end:
; 插入0个等待状态 ; 设置堆栈指针 ; AR1指向a ; 移动8个数据 ; 从程序存储器到数据存储器 ; 调用SUM子程序
第5章 TMS320C54x汇编语言程序设计
【例5.4.3】计算 y = a x
i 1
4
i i
程序: SUM: STM STM RPTZ MAC STL RET .end #a, AR3 #x, AR4 A, #3 *AR3+,*AR4+,A A,@ y
第5章 TMS320C54x汇编语言程序设计 【例5.5.2】三重循环嵌套程序。 STM 1st: 外部 STM RPTB 中间 中间 中 内 RPT 层 层 内部 中间 中间 2nd: 外部 外部 BANZ #L-1,AR7 #M-1,BRC 2nd-1 ;2T ;2T ;4T
外 层
#N-1
;1T
2). 堆栈区大小的确定
堆栈区的大小可以按照以下步骤来确定:
① 先开辟一个较大的堆栈区,用已知数充填,如: LD STM MVMM loop: STL BANZ # -9224,B # length,AR1 SP,AR4 B,*AR4loop,*AR1数据RAM 0DBF8h加载B ;堆栈区要充填的数
存储器的数据传送,在系统初始化过程中十分有用。 . bss x,5 . data TBL: . word 1,2,3,4,5 . text START:STM #x,AR5 RPT #4 MVPD TBL,*AR5+ ……
第5章 TMS320C54x汇编语言程序设计
例:编写一段程序将数据存储器中的数组X[20] 复制到 数组Y[20]中。
第五章汇编程序设计
•汇编语言程序的基本结构
• 顺序结构 • 分支结构 • 循环结构
•一、顺序结构 • 1、堆栈的设置 • 2、数据传送 • 3、算术运算指令举例 •乘、加运算 •小数乘法运算 •除法运算
第5章 TMS320C54x汇编语言程序设计
1.1 堆栈的使用方法
当程序调用中断服务程序或子程序时,需要将 程序计数器PC的值和一些重要的寄存器值进行压栈 保护,以便程序返回时能从间断处继续执行。 ’C54x提供一个用16位堆栈指针SP寻址的软件 堆栈。 当向堆栈中压入数据时,堆栈是从高地址向低 地址方向填入,堆栈指针SP先减1,然后将数据压入 堆栈。 当从堆栈中弹出数据时。数据先从堆栈中弹出, 然后堆栈指针SP加1。
• 思路1:使用SUB指令
data0 data1 .set 200 .set 100 .bss data2,1 .text LD #data0,A SUB #data1,A BC d1,ALT ST #data0, data2 BD loop NOP NOP ST #data1, data2 NOP .end
作为堆栈的栈底
在数据RAM空间开辟一个堆栈区。 设置好堆栈后,就可以使用堆栈了,如: CALL pmad ;(SP)-1 →SP,(PC)+ 2→TOS,pmad→PC 设置堆栈指针, # stack + size→SP。 RET ;(TOS)→PC,(SP)+1→SP
第5章 TMS320C54x汇编语言程序设计
第5章 TMS320C54x汇编语言程序设计
5.5.2 块程序重复操作
对于整个程序块需要重复操作时,可采用程序
块重复操作。 用于块程序重复操作指令为RPTB和RPTBD。程序 块的长度由块程序重复指令 RPTB 的操作数来确定,
而重复次数由块重复计数器BRC来决定。
通常 RPTB 的操作数为程序块的结束地址,而重
1st,*AR7- ;4T
第5章 TMS320C54x汇编语言程序设计
3.3 循环嵌套
三重循环嵌套结构:
内层 中层 外层
循环
—— RPT —— 执行N次 —— RPTB —— 执行M次 —— BANZ —— 执行L次
循环嵌套的开销
操 作
指令
重复次数
机器周期
内层
中层 外层
单程序重复操作
块程序重复操作 循环操作
; data0-data1 ;data0<data1时转入d1 ;将data0存入data2
d1: loop:
;将data1存入data2
例:比较两数data0和data1的大小。若两者相等, 将值存入data2单元。否则将大者存入data2单元。
• 思路2:使用CMPS指令
data0 data1 .set .set .bss .text LD ADD CMPS .end 200 100 data2,1 #data0,16, A ;将data0送入A(31~16) #data1,A ;将data0送入A(15~0) A, data2 ;比较、选择、存储大者
•三、循环结构
在程序设计中,如果有一段程序需要多次重复执行时, 就可以使用循环结构,以提高效率,简化程序。 循环程序通常有4部分组成: (a)置循环初值:包括循环次数;置存储区的地址指针; 置其他变量的初值等。 (b)循环体:是程序中需要多次重复的部分。 (c)循环控制部分:每循环一次,检查结束条件是否满足 若满足,循环结束,否则继续循环。 (d)修改控制变量:每进行一次循环,将控制变量加一或 减一
第5章 TMS320C54x汇编语言程序设计
1.2 堆栈的使用方法
1). 堆栈的设置
若程序中要使用堆栈,必须先进行设置,如:
size
stack
.set
.usect STM
120
“STACK”,size
在RAM中定义一个STACK 的保留空间,共120个单元
# stack + size,SP 保留区的高地址赋给SP,
采用单操作数方法: LD #0,B STM #a,AR2 STM #x,AR3 STM #19,BRC RPTB Done-1 LD *AR2+, T MPY *AR3+, A ADD A, B Done: STH B, @y STL B, @y+1
采用双操作数的方法: LD #0,B STM #a,AR2 STM #x,AR3 STM #19,BRC RPTB Done-1 MPY *AR2+,*AR3+,A ADD A, B Done: STH B, @y STL B, @y+1
;设置数据段的首地址 ;设置循环计数值 ;累加器清0 ;累加运算,并修改地址 ;若计数值不为0,则循环,并计数值减1