第5章 汇编程序设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
AR4→
数据RAM
DBF8 DBF8 DBF8 … 7AB3 … DBF8 0013 DBF8 6B14 DBF8
SP→
用过的栈区
SP→
第5章 TMS320C54x汇编语言程序设计
1.2 数据传送
重复执行 MVPD 指令,可以实现程序存储器至数据 【例5.6.1 】数组 x[5]={1,2,3,4,5} 初始化。
【例5.3.4】 计算 y xi
.bss x,10 ;给x保留10 个空间 用 AR2作为循环计数器,由 BANZ 实现程序的循环 .bss y,1 ;给y保留1个空间 控制。
i 1
10
STM STM LD loop: ADD BANZ
#x,AR1 #9,AR2 #0,A *AR1+,A loop,*AR2-
; 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 ;比较、选择、存储大者
第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
;设置数据段的首地址 ;设置循环计数值 ;累加器清0 ;累加运算,并修改地址 ;若计数值不为0,则循环,并计数值减1
若计数值为0,则结束循环 ;累加和存入y中
STL 注意: BANZ
A, @y loop, *AR2-
;先判断,再修正AR2=AR2-1
第5章 TMS320C54x汇编语言程序设计
3.2 重复操作程序
进一步优化的程序: 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
存储器的数据传送,在系统初始化过程中十分有用。 . 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]中。
第5章 TMS320C54x汇编语言程序设计
3.1循环操作程序
在程序设计时,经常需要重复执行某一段程序。 利用BANZ(当辅助寄存器不为0时转移)指令可实现循 环计数和操作。 循环操作指令:
BANZ
转移地址,辅助寄存器
指令功能:当辅助寄存器不为0时,则转至转移地址, 否则顺序执行。
第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指令对BRC进行设定。
第5章 TMS320C54x汇编语言程序设计
块重复操作的特点:
① 程序块的起始地址RSA是RPTB指令的下一行; ② 块结束地址REA由RPTB指令的操作数规定; ③ 对程序块进行重复操作时,对任意长程序段的 循环开销为0; ④ 与单指令重复操作不同,块重复操作可以响应 中断。
;设置循环次数
AR4→
DBF8 D D ,SP→AR4 DBF8 ;设置数据指针 AR4 DBF8 D ;循环,充填数据 … length … DBF8 D DBF8 D DBF8 D
SP→
第5章 TMS320C54x汇编语言程序设计
堆栈区的大小可以按照以下步骤来确定:
① 先开辟一个较大的堆栈区,用已知数充填。 ② 运行程序,执行所有堆栈操作。 ③ 检查堆栈中的数值。 用过的堆栈区就是实际需要 的堆栈空间。
;子程序执行
•二、分支结构
汇编语言中程序的分支是由条件转移指令实现的, C54x CPU以累加器A、B及标志位C、TC、OVA、OVB 等状态最为条件,判断程序是否转移,这些指令见第三章。
例:比较两数data0和data1的大小。若两者相等, 将值存入data2单元。否则将大者存入data2单元。
; 变量初始化
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
’C54x的重复操作是使CPU重复执行一条指令或 一段指令。可以分为单指令重复和块程序重复。 实现重复操作的指令:
RPT —— 重复下条指令;
RPTZ—— 累加器清0,并重复下条指令; RPTB—— 块重复指令。 使用RPT、RPTZ能重复下一条指令;而RPTB 用于重复代码块若干次。利用重复指令可实现比 BANZ指令更快的循环程序。
•三、循环结构
在程序设计中,如果有一段程序需要多次重复执行时, 就可以使用循环结构,以提高效率,简化程序。 循环程序通常有4部分组成: (a)置循环初值:包括循环次数;置存储区的地址指针; 置其他变量的初值等。 (b)循环体:是程序中需要多次重复的部分。 (c)循环控制部分:每循环一次,检查结束条件是否满足 若满足,循环结束,否则继续循环。 (d)修改控制变量:每进行一次循环,将控制变量加一或 减一
第5章 TMS320C54x汇编语言程序设计
5.5.2 块程序重复操作
对于整个程序块需要重复操作时,可采用程序
块重复操作。 用于块程序重复操作指令为RPTB和RPTBD。程序 块的长度由块程序重复指令 RPTB 的操作数来确定,
而重复次数由块重复计数器BRC来决定。
通常 RPTB 的操作数为程序块的结束地址,而重
作为堆栈的栈底
在数据RAM空间开辟一个堆栈区。 设置好堆栈后,就可以使用堆栈了,如: CALL pmad ;(SP)-1 →SP,(PC)+ 2→TOS,pmad→PC 设置堆栈指针, # stack + size→SP。 RET ;(TOS)→PC,(SP)+1→SP
第5章 TMS320C54x汇编语言程序设计
1st,*AR7- ;4T
第5章 TMS320C54x汇编语言程序设计
3.3 循环嵌套
三重循环嵌套结构:
内层 中层 外层
循环
—— RPT —— 执行N次 —— RPTB —— 执行M次 —— BANZ —— 执行L次
循环嵌套的开销
操 作
指令
Baidu Nhomakorabea
重复次数
机器周期
内层
中层 外层
单程序重复操作
块程序重复操作 循环操作
. 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.4.3】计算 y = a x
i 1
4
i i
程序: table: .word 1,2,3,4 .word 8,6,4,2 .text STM #0,SWWSR STM #stack+10h,SP STM #a,AR1 RPT #7 MVPD table,*AR1+ CALL SUM B end
2). 堆栈区大小的确定
堆栈区的大小可以按照以下步骤来确定:
① 先开辟一个较大的堆栈区,用已知数充填,如: LD STM MVMM loop: STL BANZ # -9224,B # length,AR1 SP,AR4 B,*AR4loop,*AR1数据RAM 0DBF8h加载B ;堆栈区要充填的数
第5章 TMS320C54x汇编语言程序设计
1.2 堆栈的使用方法
1). 堆栈的设置
若程序中要使用堆栈,必须先进行设置,如:
size
stack
.set
.usect STM
120
“STACK”,size
在RAM中定义一个STACK 的保留空间,共120个单元
# stack + size,SP 保留区的高地址赋给SP,
第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
第五章汇编程序设计
•汇编语言程序的基本结构
• 顺序结构 • 分支结构 • 循环结构
•一、顺序结构 • 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
采用单操作数方法: 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
数据RAM
DBF8 DBF8 DBF8 … 7AB3 … DBF8 0013 DBF8 6B14 DBF8
SP→
用过的栈区
SP→
第5章 TMS320C54x汇编语言程序设计
1.2 数据传送
重复执行 MVPD 指令,可以实现程序存储器至数据 【例5.6.1 】数组 x[5]={1,2,3,4,5} 初始化。
【例5.3.4】 计算 y xi
.bss x,10 ;给x保留10 个空间 用 AR2作为循环计数器,由 BANZ 实现程序的循环 .bss y,1 ;给y保留1个空间 控制。
i 1
10
STM STM LD loop: ADD BANZ
#x,AR1 #9,AR2 #0,A *AR1+,A loop,*AR2-
; 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 ;比较、选择、存储大者
第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
;设置数据段的首地址 ;设置循环计数值 ;累加器清0 ;累加运算,并修改地址 ;若计数值不为0,则循环,并计数值减1
若计数值为0,则结束循环 ;累加和存入y中
STL 注意: BANZ
A, @y loop, *AR2-
;先判断,再修正AR2=AR2-1
第5章 TMS320C54x汇编语言程序设计
3.2 重复操作程序
进一步优化的程序: 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
存储器的数据传送,在系统初始化过程中十分有用。 . 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]中。
第5章 TMS320C54x汇编语言程序设计
3.1循环操作程序
在程序设计时,经常需要重复执行某一段程序。 利用BANZ(当辅助寄存器不为0时转移)指令可实现循 环计数和操作。 循环操作指令:
BANZ
转移地址,辅助寄存器
指令功能:当辅助寄存器不为0时,则转至转移地址, 否则顺序执行。
第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指令对BRC进行设定。
第5章 TMS320C54x汇编语言程序设计
块重复操作的特点:
① 程序块的起始地址RSA是RPTB指令的下一行; ② 块结束地址REA由RPTB指令的操作数规定; ③ 对程序块进行重复操作时,对任意长程序段的 循环开销为0; ④ 与单指令重复操作不同,块重复操作可以响应 中断。
;设置循环次数
AR4→
DBF8 D D ,SP→AR4 DBF8 ;设置数据指针 AR4 DBF8 D ;循环,充填数据 … length … DBF8 D DBF8 D DBF8 D
SP→
第5章 TMS320C54x汇编语言程序设计
堆栈区的大小可以按照以下步骤来确定:
① 先开辟一个较大的堆栈区,用已知数充填。 ② 运行程序,执行所有堆栈操作。 ③ 检查堆栈中的数值。 用过的堆栈区就是实际需要 的堆栈空间。
;子程序执行
•二、分支结构
汇编语言中程序的分支是由条件转移指令实现的, C54x CPU以累加器A、B及标志位C、TC、OVA、OVB 等状态最为条件,判断程序是否转移,这些指令见第三章。
例:比较两数data0和data1的大小。若两者相等, 将值存入data2单元。否则将大者存入data2单元。
; 变量初始化
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
’C54x的重复操作是使CPU重复执行一条指令或 一段指令。可以分为单指令重复和块程序重复。 实现重复操作的指令:
RPT —— 重复下条指令;
RPTZ—— 累加器清0,并重复下条指令; RPTB—— 块重复指令。 使用RPT、RPTZ能重复下一条指令;而RPTB 用于重复代码块若干次。利用重复指令可实现比 BANZ指令更快的循环程序。
•三、循环结构
在程序设计中,如果有一段程序需要多次重复执行时, 就可以使用循环结构,以提高效率,简化程序。 循环程序通常有4部分组成: (a)置循环初值:包括循环次数;置存储区的地址指针; 置其他变量的初值等。 (b)循环体:是程序中需要多次重复的部分。 (c)循环控制部分:每循环一次,检查结束条件是否满足 若满足,循环结束,否则继续循环。 (d)修改控制变量:每进行一次循环,将控制变量加一或 减一
第5章 TMS320C54x汇编语言程序设计
5.5.2 块程序重复操作
对于整个程序块需要重复操作时,可采用程序
块重复操作。 用于块程序重复操作指令为RPTB和RPTBD。程序 块的长度由块程序重复指令 RPTB 的操作数来确定,
而重复次数由块重复计数器BRC来决定。
通常 RPTB 的操作数为程序块的结束地址,而重
作为堆栈的栈底
在数据RAM空间开辟一个堆栈区。 设置好堆栈后,就可以使用堆栈了,如: CALL pmad ;(SP)-1 →SP,(PC)+ 2→TOS,pmad→PC 设置堆栈指针, # stack + size→SP。 RET ;(TOS)→PC,(SP)+1→SP
第5章 TMS320C54x汇编语言程序设计
1st,*AR7- ;4T
第5章 TMS320C54x汇编语言程序设计
3.3 循环嵌套
三重循环嵌套结构:
内层 中层 外层
循环
—— RPT —— 执行N次 —— RPTB —— 执行M次 —— BANZ —— 执行L次
循环嵌套的开销
操 作
指令
Baidu Nhomakorabea
重复次数
机器周期
内层
中层 外层
单程序重复操作
块程序重复操作 循环操作
. 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.4.3】计算 y = a x
i 1
4
i i
程序: table: .word 1,2,3,4 .word 8,6,4,2 .text STM #0,SWWSR STM #stack+10h,SP STM #a,AR1 RPT #7 MVPD table,*AR1+ CALL SUM B end
2). 堆栈区大小的确定
堆栈区的大小可以按照以下步骤来确定:
① 先开辟一个较大的堆栈区,用已知数充填,如: LD STM MVMM loop: STL BANZ # -9224,B # length,AR1 SP,AR4 B,*AR4loop,*AR1数据RAM 0DBF8h加载B ;堆栈区要充填的数
第5章 TMS320C54x汇编语言程序设计
1.2 堆栈的使用方法
1). 堆栈的设置
若程序中要使用堆栈,必须先进行设置,如:
size
stack
.set
.usect STM
120
“STACK”,size
在RAM中定义一个STACK 的保留空间,共120个单元
# stack + size,SP 保留区的高地址赋给SP,
第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
第五章汇编程序设计
•汇编语言程序的基本结构
• 顺序结构 • 分支结构 • 循环结构
•一、顺序结构 • 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
采用单操作数方法: 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