汇编语言程序课件_第1页
汇编语言程序课件_第2页
汇编语言程序课件_第3页
汇编语言程序课件_第4页
汇编语言程序课件_第5页
已阅读5页,还剩166页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章

汇编语言程序设计7.1程序流程控制7.2数据块传送7.3定点数的基本算术运算7.4长字运算和并行运算7.5FIR滤波器的DSP实现7.6IIR数字滤波器的DSP实现7.7FFT运算的DSP实现第7章汇编语言程序设计7.1程序流程控制7.1程序流程控制7.1.1程序存储器地址生成7.1.2条件操作7.1.3分支转移7.1.4调用与返回7.1.5重复操作7.1.6TMS320C54x中断系统7.1.7堆栈的使用返回首页7.1程序流程控制7.1.1程序存储器地址生成返回首7.1.1程序存储器地址生成程序存储器中存放指令代码、参数表和立即数。程序地址产生逻辑(PAGEN),

包括以下5个寄存器(如图7-1所示):

程序计数器(PC);重复计数器(RC);块重复计数器(BRC);块重复起始地址寄存器(RSA);块重复结束地址寄存器(REA)。7.1.1程序存储器地址生成程序图7-1程序地址产生逻辑(PAGEN)寄存器返回本节图7-1程序地址产生逻辑(PAGEN)寄存器返回本节7.1.2条件操作表7-1条件指令中的各种条件操作符号条件说

明操作符号条件说

明AEQA=0累加器A等于0

AOVAOV=1累加器A溢出BEQB=0累加器B等于0

BOVBOV=1累加器B溢出ANEQA0累加器A不等于0

ANOVAOV=0累加器A不溢出BNEQB0累加器B不等于0

BNOVBOV=0累加器B不溢出ALTA<0累加器A小于0

CC=1ALU进位位置1

BLTB<0累加器B小于0

NCC=0ALU进位位置0

ALEQA0累加器A小于等于0

TCTC=1测试/控制标志位置1

BLEQB0累加器B小于等于0

NTCTC=0测试/控制标志位置0

AGTA>0累加器A大于0

BIOBIO低BIO信号电平为低BGTB>0累加器B大于0

NBIOBIO高BIO信号电平为高AGEQA0累加器A大于等于0

UNC无无条件操作BGEQB0累加器B大于等于0

7.1.2条件操作表7-1条件指令中的各种条件操作符表7-2多条件指令中的条件组合返回本节

可以使用多个条件作为条件指令的操作数,只有所有条件满足时才被认为是满足条件。这种多个条件的组合就构成了指令的多重条件,但必须是特定的条件组合。

第1组第2组A类B类A类B类C类EQ

NEQLEQGEQLT

GTOVNOVTCNTCCNCBIONBIO表7-2多条件指令中的条件组合返回本节可以使用多

选用多重条件时应当注意以下几点:

第1组:分为两类,最多可选择两个条件,

组内两类条件可以与/或构成多重条件,但不能用组内同类条件构成与/或多重条件。

当选择两个条件时,累加器必须是同一个。例如,可以同时选择AGT和AOV,但不能同时选择AGT和BOV。

②第2组:分为三类,最多可选三个条件,可以在每类中各选一个条件进行与/或构成多重条件,但不能在同类选两个条件。

例如,可以同时测试TC、C和BIO,但不能同时测试NTC、C和NC。选用多重条件时应当注意以下几点:①第1组【例7-1】

条件操作程序。

BCsub,BLEQ

;条件分支转移

若累加器B≤0,则转至sub,

否则,往下执行

CCstart,AGEQ,AOV

;条件调用

若累加器A≥0且溢出,

则调用start,否则往下执行

RCNTC

;条件返回

若TC=0,则返回,否则往下执行

【例7-1】条件操作程序。BCsub,BLE注意:

若需要多个条件相与时,用单条指令表示。

如:BCnew,AGT,AOV

转移条件:AGT和AOV的与逻辑

若需要两个条件相或时,需用两条指令分别表示。

如:若累加器A大于0或溢出,则转移至sub

转移条件:AGT和AOV的或逻辑

BCsub,AGT

BCsub,AOV注意:若需要多个条件相与时,用单条指令表示。7.1.3分支转移

通过传送控制到程序存储器的其他位置,分支转移会中断连续的指令流。

分支转移指令通过改写PC值,使程序改变流向。其指令分为无条件分支转移、条件分支转移和远分支转移三类。三者都可以带延时操作和不带延时操作。

分支转移指令

分类

指令

说明

无条件分支转移

B[D]

用该指令指定的地址加载PC

BACC[D]

用累加器的低16位指定的地址加载PC条件分支转移

BC[D]

若满足指令给定条件,用该指令指定的地址加载PC

BANG[D]

若当前选择辅助寄存器不等于0,用该指令指定的地址加载PC远程分支转移

FB[D]

用该指令指定的地址加载PC和XPC

FBACC[D]

用累加器的低23位指定的地址加载PC和XPC7.1.3分支转移通过传送控制到程序存储器的其他

无条件分支转移:无条件执行分支转移;

条件分支转移:要在满足用户一个或多个条件时才执行分支转移;

远程分支转移:允许分支转移到扩展存储器。

【例7-2】分支转移举例。

STM#88H,AR0

LD#1000H,Azhong:SUBAR0,A

BCzhong,AGT,AOV

;将操作数#88H装入AR0

;将操作数#1000H装入ACC

;将A中的内容减去AR0中的

;内容结果装入A

;若累加器A>0且溢出,

;则转至zhong,否则往下执行

无条件分支转移:无条件执行分支转移;【例7-2】分【例7-3】比较操作后条件分支转移

STM#5,AR1

;AR1=5

STM

#10,AR0

;AR0=10loop:

…*AR1+

;AR1=AR1+1

CMPRLT,AR1

;若AR1-AR0<0,则TC=1,否则为0

BCloop,TC

;若AR1-AR0<0,则循环

若AR1=AR0,则顺序执行【例7-3】比较操作后条件分支转移7.1.4调用与返回

与分支转移一样,中断当前程的执行,转移到其他位置去执行,子程序调用会中断连续的指令流。但是与分支转移不同的是,这种转移是临时的,执行完调用程序还要返回到被中断的地方继续执行。

当函数的子程序被调用时,紧跟在调用后的下一条指令的地址保存在堆栈中。这个地址用于返回到调用前的程序并继续执行调用前的程序。

子程序调用操作分成三种形式:无条件调用和返回、有条件调用和返回、远调用和远返回,三者都可以带延时操作和不带延时操作。

7.1.4调用与返回与分支转移一样,中断当前程的

无条件调用是指无条件执行调用。

条件调用和无条件调用操作相同,但是条件调用要在满足一个或多个条件时才执行调用。

远程调用允许对扩展存储器的子程序或函数进行调用。

无条件调用是指无条件执行调用。子程序调用指令分类

指令

说明

无条件调用

CALL[D]将返回的地址压入堆栈,并用该指令指定的地址加载PC

CALA[D]将返回的地址压入堆栈,用累加器A或B指定的地址加载PC条件调用

CC[D]

如果满足指令给定条件,将返回的地址压入堆栈,并用该指令指定的地址加载PC远程调用

FCALL[D]将XPC和PC压入堆栈,并用该指令指定的地址加载PC和XPC

FCALA[D]将XPC和PC压入堆栈,用累加器的低23位指定的地址加载PC和XPC子程序调用指令分类指令说明无条

子程序返回指令可以使程序重新在被中断的连续指令处继续执行。

返回指令通过将弹出堆栈的值(包含将要执行的下一条指令的地址),送到程序计数器PC来实现返回功能。C54x可以执行无条件返回和条件返回,并且它们都可以带延时或不带延时操作。

子程序返回指令可以使程序重新在被中断的连续指令处继续子程序返回指令分类

指令

说明

无条件返回

RET[D]将堆栈顶部的返回地址加载到PC。

RETE[D]

将堆栈顶部的返回地址加载到PC,并使能可屏蔽中断。

RETF[D]

将RTN寄存器中的返回地址加载到PC,并使能可屏蔽中断。条件返回

RC[D]如果满足指令给定条件,将堆栈顶部的返回地址加载到PC。远程返回

FCALL[D]将堆栈顶部的值弹出加载到XPC,将堆栈中下一个值弹出加载到PC。

FCALA[D]将堆栈顶部的值弹出加载到XPC,将堆栈中下一个值弹出加载到PC,并使能可屏蔽中断。子程序返回指令分类指令说明无条

无条件返回是无条件执行返回操作。

条件返回可以给予被调用函数或中断服务程序(ISR)更多的返回方式,以便根据被处理的数据选择返回路径,通过使用条件返回指令来实现返回。

远程返回允许从扩展存储器的子程序或函数返回。

无条件返回是无条件执行返回操作。【例7-4】

子程序调用举例。

STM#123H,AR0LD#456H,AR1CALLnewLDAR1,16,Anew:MPYAR0,AR1,A

RET

;将操作数#123H装入AR0

;将操作数#456H装入AR1

;调子程序new

;将AR1的内容左移16位后装入A

;AR0与AR1的内容相乘,结果放入A中

;子程序返回

【例7-4】子程序调用举例。STM#12C54x的重复操作是使CPU重复执行一条指令或一段指令。可以分为单指令重复和块程序重复。

实现重复操作的指令:RPT——

重复执行下条指令;

RPTZ——

累加器清0,并重复执行下条指令;

RPTB——

使下一块指令重复执行。

使用RPT、RPTZ能重复下一条指令;而RPTB用于重复代码块若干次。利用重复指令可实现比BANZ指令更快的循环程序。7.1.5重复操作C54x的重复操作是使CPU重复执行一条指令或一段指

利用RPT和RPTZ可重复执行紧随其后的一条指令。重复次数由该指令的操作数决定,并且等于操作数加1。

若要重复执行N+1次,则重复指令中应规定重复次数为N。该数值保存在16位重复计数器RC中,这个值只能由重复指令(RPT或RPTZ)加载,而不能编程设置RC寄存器中的值。一条指令的最大重复次数为65536。

由于要重复的指令只需要取指一次,对于多周期指令,采用重复操作后,可使多周期指令变成单周期指令,提高运行速度。

1、单指令重复操作利用RPT和RPTZ可重复执行紧随其后的一条指令。重【例7-5】对数组进行初始化,使x[8]={0,0,0,0,0,0,0,0}。.bssx,8STM#x,AR1LD#0,ARPT#7STL

A,*AR1+

.bssx,8STM#x,AR1

RPTZA,#7

STLA,*AR1+注意:

①对x[8]中的8个元素置0,重复次数为7,即执行1次STLA,AR1+指令后,再重复执行7次;②RPTZ指令设定重复次数后,再对累加器清零。

【例7-5】对数组进行初始化,使x[8]={0,0,0,0,在执行重复操作期间,除了RS外所有中断被禁止,直到重复循环完成。

’C54x能响应HOLD信号,若HM=0,CPU继续执行重复操作,若HM=1,则暂停重复操作。

在执行重复操作期间,除了RS外所有中断被禁止,直到重2、块程序重复操作

对于整个程序块需要重复操作时,可采用程序块重复操作。

用于块程序重复操作指令为RPTB和RPTBD。程序块的长度由块程序重复指令RPTB的操作数来确定,而重复次数由块重复计数器BRC来决定。

通常RPTB的操作数为程序块的结束地址,而重复次数可用STM指令对BRC进行设定。

2、块程序重复操作对于整个程序块需要重复操作时,块重复操作的特点:

①程序块的起始地址RSA是RPTB指令的下一条指令的地址;

②块结束地址REA由RPTB指令的操作数规定;

③与单指令重复操作不同,块重复操作可以响应中断。

块重复操作的特点:①程序块的起始地址RSA是RP

块程序重复指令的特点是对任意长程序段的循环开销为0。循环由ST1状态寄存器的块重复标志位(BRAF)和紧跟在ST1状态寄存器后面的存储器映像寄存器控制。

循环过程:

①将块重复标志位BRAF置1,激活块程序重复循环;

②将一个取值在0~65535范围里的循环次数N加载到BRC;

③块重复指令把块重复的起始地址放在块重复开始地址寄存器RSA中;

④块重复指令把块重复的末地址放在块重复结束地址寄存器REA中。

块程序重复指令的特点是对任意长程序段的循环开销为0。【例7-6】对数组x[8]中的每一元素加1。

.bssx,8begin:LD#1,16,BSTM#7,BRCSTM#x,AR4RPTBnext-1ADD*AR4,16,B,ASTHA,*AR4+next:LD#0,B…;设置数组空间;立即数1送入BH;设置重复次数,BRC=7,循环8次;数组首地址x送入AR4;设置循环结束地址;数组数据左移16位与BH相加;存入数组结果,并修改地址;B清0注意①块结束地址REA通常取程序块最后一条指令的下一条指令地址-1;②重复次数为7次③RPTB指令可以响应中断。

【例7-6】对数组x[8]中的每一元素加1。.【例7-7】三重循环嵌套程序。

STM#L-1,AR7

1st:外部

STM#M-1,BRC

RPTB2nd-1

中间中间

RPT#N-1

内部

中间中间

2nd:

外部外部

BANZ1st,*AR7-内层中层外层【例7-7】三重循环嵌套程序。S7.1.6TMS320C54x中断系统1.中断类型C54x支持软件中断和硬件中断。软件中断由程序指令产生(INTR、TRAP或RESET)。硬件中断由设备的一个信号产生,包括两种类型:①外部硬件中断由外部中断口的信号触发;②内部硬件中断由片内外设的信号触发。软件中断不分优先级,硬件中断有优先级,其中,1为最高优先级。无论是硬件中断还是软件中断,都属于以下两种类型:(1)可屏蔽中断(2)非屏蔽中断7.1.6TMS320C54x中断系统1.中断类型可屏蔽中断:是可用软件来屏蔽或开放的中断,即通过对中断屏蔽寄存器(IMR)中的相应位和状态寄存器(ST1)中的中断允许控制位INTM编程来屏蔽或开放该中断。TMS320C54x最多可以支持16个用户可屏蔽中断(SINT15~SINT0),但有的处理器只用了其中的一部分。有些中断有两个名称。非可屏蔽中断:是不能用软件来屏蔽的中断,不受IMR和INTM位的影响。TMS320C54x对这一类中断总是响应的,并从主程序转移到中断服务程序。可屏蔽中断:是可用软件来屏蔽或开放的中断,即通过对中断屏蔽寄表7-9C5402中断源的中断向量及硬件中断优先权表7-9C5402中断源的中断向量及硬件中断优先权第7章汇编语言程序课件

’C54x中断系统设置两个中断寄存器,分别为中断标志寄存器IFR和中断屏蔽寄存器IMR。

2.中断寄存器(1)

中断标志寄存器IFR中断标志寄存器IFR是一个存储器映像寄存器,当一个中断出现时,IFR中的相应的中断标志位置1,直到CPU识别该中断为止。

’C5402中断标志寄存器IFR的结构:

15

141312111098保留DMAC5DMAC4BXINT1BRINT1HPINTINT376543210TINT1DMAC0BXINT0BRINT0TINT0INT2INT1INT0’C54x中断系统设置两个中断寄存器,分别为中断标志

在C54x系列芯片中,IFR中5~0位对应的中断源完全相同,分别为外部中断和通信中断标志寄存位,而15~6位中断源根据芯片的不同,定义的中断源类型不同。有四种情况将清除中断标志:

软件和硬件复位,即C54x的复位引脚RS=0;②中断得到响应处理③相应的IFR标志位写1;④使用相应的中断号响应该中断,

即使用INTR#K指令。在C54x系列芯片中,IFR中5~0位对应的中断(2)中断屏蔽寄存器IMR

中断屏蔽寄存器是一个存储器映像寄存器,主要用于控制中断源的屏蔽和开放。

当状态寄存器ST1中的INTM位为0时,全局中断允许。IMR中的某位置1时,开放相应的中断。由于RS和NMI都不包含在IMR中,因此IMR对这两个中断不能进行屏蔽。(2)中断屏蔽寄存器IMR中断屏蔽寄存器是一个存

中断屏蔽寄存器IMR的结构:

15

141312111098保留DMAC5DMAC4BXINT1BRINT1HPINTINT376543210TINT1DMAC0BXINT0BRINT0TINT0INT2INT1INT0

用户可以对IMR寄存器进行读写操作。

中断屏蔽寄存器IMR的结构:151(1)接受中断请求一个中断可由硬件器件或软件指令提出请求。当产生一个中断时,IFR寄存器中相应的中断标志位被置1。不管中断是否被处理器应答,该标志位都会置1。当相应的中断响应后,该标志位自动被清除。3.中断响应过程(1)接受中断请求一个中断可由硬件器件或软件指令提

外部硬件中断由外部中断口的信号发出请求,而内部硬件中断由片内外设的信号发出中断请求。

①硬件中断请求

C5402硬件中断的请求信号:

外部中断:

INT3~INT0引脚;

非屏蔽中断:RS和NMI引脚;

片内中断:BRINT0、BXINT0、BRINT1和BXINT1(串口中断)

TINT0、TINT1(定时器中断);

DMAC4、DMAC5(DMA中断);

HPINT(HPI中断)。

外部硬件中断由外部中断口的信号发出请求,而内部硬件中软件中断是由程序指令产生的中断请求,主要有3条指令:

②软件中断请求

INTR指令:允许执行任何的可屏蔽中断,包括用户定义的中断(从SINT0到SINT30);

TRAP指令:与INTR指令相同,但不影响状态寄存器ST1的中断方式(INTM)位;

RESET指令:可在程序的任何时候产生,使处理器返回一个预定状态。软件中断是由程序指令产生的中断请求,主要有3条指令:

对于软件中断和非屏蔽中断,CPU将立即响应,进入相应中断服务程序。

对于硬件可屏蔽中断,只要满足以下3种条件后CPU才能响应中断。(2)

中断响应

当前中断优先级最高。

’C54x按照中断优先级响应中断请求。

INTM位清0。

当INTM=0,所有可屏蔽中断被使能。当INTM=1,所有可屏蔽中断被禁止。

IMR屏蔽位为1。

在IMR中,中断的相应位为1,表明允许该中断。

对于软件中断和非屏蔽中断,CPU将立即响应,进入相应满足上述条件后,CPU响应中断,终止当前正进行的操作,指令计数器PC自动转向相应的中断向量地址,取出中断服务程序地址,并发出硬件中断响应信号IACK,而清除相应的中断标志位。满足上述条件后,CPU响应中断,终止当前正进行的操作

CPU响应中断后,将进行以下操作:

(3)执行中断服务程序

保护现场,将程序计数器PC值压入堆栈;

将中断向量的地址加载到PC;③

从中断向量所指定的地址开始取指;④

执行分支转移,进入中断服务程序;⑤

执行中断服务程序直到出现返回指令;

从堆栈中弹出返回地址,加载到PC中;⑦

继续执行主程序。CPU响应中断后,将进行以下操作:(3)执行中断服

当执行一个中断服务程序时,有些寄存器必须保存在堆栈中。当程序从ISR返回时,用户软件代码必须恢复这些寄存器的上下文。

使用堆栈操作指令可以将这些寄存器传送到堆栈中,或者从堆栈中取出。

PSHM指令:将MMR寄存器中的内容传送到堆栈中;

POPM指令:从堆栈中读出的数据传送到MMR寄存器中;PSHD指令:将数据存储器中的数据传送到堆栈;

POPD指令:从堆栈中读出的数据传送到数据存储器中.

当执行一个中断服务程序时,有些寄存器必须保存在堆栈中

当保存和恢复上下文时,应考虑如下几点:

①当使用堆栈保存上下文时,必须按相反的方向执行恢复;②

当恢复ST1寄存器的BRAF位之前,应该恢复BRC位。如果没有按照这个顺序,BRC=0,则BRAF位将被清除。当保存和恢复上下文时,应考虑如下几点:图7-2中断操作流程:

图7-2中断操作流程:4.重新映象中断向量地址

中断向量可以映射到程序存储器的任何128字页面的起始位置,除保留区域外。

C54x的中断向量地址是由PMST寄存器中的IPTR(9位中断向量指针)和左移2位后的中断向量序号所组成。

中断向量地址=IPTR+(左移2位的中断向量序号)例如,IPTR=0001H,INT0的中断向量序号为10H,中断向量的地址为00C0H。

中断向量地址=0

00000001100

0000=00C0H4.重新映象中断向量地址中断向量可以映射到程序存储器中断向量号

左移两位后中断向量地址图7-3中断向量地址的产生返回本节中断向量号

左移两位后中断向量地址图7-3中断向量地址的产

硬件复位时,IPTR=1FFH,复位向量将映射到程序存储器的511页空间,复位向量地址为FF80H。

当硬件复位后,CPU将从0FF80H开始执行程序。

若对IPTR重新赋值,中断向量可以映射到程序存储器的其他地址。

例如,用0001H加载IPTR,中断向量将被移到0080H单元开始的程序存储器空间。硬件复位时,IPTR=1FFH,复位向量将映射到程序.mmregs.def_c_int00STACK .usect"STACK",100ht0_cout .usect"vars",1 ;计数器t0_flag .usect“vars”,1 ;当前XF输出电平标志。t0_flag=1,则XF=1;;t0_flag=0,则XF=0TVAL .set 1639 ;1640(10(61=1ms,又因中断程序中计数器初值;t0_cout=1000,所以定时时间:1ms(1000=1sTIM0 .set 0024H ;定时器0寄存器地址PRD0 .set 0025HTCR0 .set 0026H .dataTIMES .intTVAL ;定时器时间常数

.text中断矢量表程序举例汇编程序文件(timers.asm)如下:.mmregs*******************************;中断矢量表程序段_c_int00 bstart nop nopNMI rete;非屏蔽中断

nop nop nopSINT17 .space4*16;各软件中断SINT18 .space4*16SINT19 .space4*16SINT20 .space4*16SINT21 .space4*16SINT22 .space4*16SINT23 .space4*16SINT24 .space4*16SINT25 .space4*16SINT26 .space4*16SINT27 .space4*16SINT28 .space4*16SINT29 .space4*16SINT30 .space4*16INT0 rsbxintm;外中断0中断

rete nop nopINT1 rsbxintm;外中断1中断

rete nop nopINT2 rsbxintm;外中断2中断

rete nop nopTINT: bdtimer;定时器中断向量

nop nop nopRINT0: rete ;串口0接收中断

nop nop nop******************************XINT0: rete ;串口0发送中断

nop nop nopSINT6 .space4*16 ;软件中断SINT7 .space4*16 ;软件中断INT3: rete ;外中断3中断

nop nop nopHPINT: rete;主机中断

nop nop nopRINT1: rete;串口1接收中断

nop nop nopXINT1: rete ;串口1发送中断

nop nop nop******************************************start:LD#0,DPSTM#STACK+100h,SPSTM#07FFFh,SWWSRSTM#1020h,PMST;计数器设置为1000(1s)ST #1000,*(t0_cout)SSBXINTM ;关全部中断

LD#TIMES,A READATIM0;初始化TIM,PRDREADAPRD0STM#669h,TCR0 ;初始化TCR0;初始化IMR,使能timer0中断STM#8,IMR

RSBXINTM ;开放全部中断WAIT: B WAIT*******************************************XINT0: rete ;串口0发送中断**********;定时器0中断服务子程序timer: ADDM #-1,*(t0_cout) ;计数器减1

………….…RETE.end链接命令文件(timers.cmd)如下timers.obj/*输入文件名*/-otimers.out/*指定输出文件的选项*/-mtimers.map/*指定map文件的选项*/MEMORY/*MEMORY伪指令*/{PAGE0:RAM1:origin=1000h,length=500hPAGE1:SPRAM1:origin=0600h,length=20hPAGE1:SPRAM2:origin=0100h,length=200h}SECTIONS/*SECTIONS伪指令*/{.text:>RAM1.data:>RAM1.vars:>SPRAM1.STACK:>SPRAM2}

;定时器0中断服务子程序链接命令文件(timers.c7.1.7堆栈的使用堆栈被用于保存中断程序、调用子程序的返回地址,也用于保护和恢复用户指定的寄存器和数据,还可用于程序调用时的参数传递。返回地址是由DSP自动保存的。

用户编写的压栈指令和出栈指令将指定的内容压入和弹出堆栈,SP总是指向最后压入堆栈的数据,压栈之前SP减1,出栈之后SP加1。

7.1.7堆栈的使用堆栈被用于保存C54x支持软件堆栈,在用户指定的存储区开辟一块存储区作为堆栈存储器。堆栈的定义及初始化步骤为:

1)声明具有适当长度的未初始化段;2)将堆栈指针指向栈底;3)在链接命令文件(.cmd)中将堆栈段放入内部数据存储区。

返回本节1.堆栈的设置

C54x支持软件堆栈,在用户指定的存储

size.set120stack.usect“STACK”,sizeSTM#

stack

+

size,SP

在数据RAM空间开辟一个堆栈区。

在RAM中定义一个STACK的保留空间,共120个单元

设置堆栈指针,#

stack+size→SP。保留区的高地址赋给SP,作为堆栈的栈底

若程序中要使用堆栈,必须先进行设置,如:

设置好堆栈后,就可以使用堆栈了,如:

CALLpmad;(SP)-1→SP,(PC)+2→TOS,pmad→PCRET;(TOS)→PC,(SP)+1→SP

size.set120在数据2.

堆栈区大小的确定①

先开辟一个较大的堆栈区,用已知数充填,如:

LD#

-9224,BSTM#

length,AR1MVMMSP,AR4loop:STLB,*AR4-

BANZloop,*AR1-

堆栈区的大小可以按照以下步骤来确定:

;堆栈区要充填的数0DBF8h加载B

;设置循环次数

;设置数据指针AR4,SP→AR4

;循环,充填数据

数据RAMDDD……DDSP→DDBF8DBF8DBF8……DBF8DBF8DBF8AR4→length2.堆栈区大小的确定①先开辟一个较大的堆栈区,用已知数2.

堆栈区大小的确定①

先开辟一个较大的堆栈区,用已知数充填。

堆栈区的大小可以按照以下步骤来确定:

数据RAMAR4→DBF8DBF8DBF8……DBF8DBF8SP→DBF86B140013…SP→②

运行程序,执行所有堆栈操作。

检查堆栈中的数值。7AB3

用过的堆栈区就是实际需要的堆栈空间。用过的栈区2.堆栈区大小的确定①先开辟一个较大的堆栈区,用已知数

C54x有10条数据传送指令,共分为四类:

(1)

数据存储器之间的数据传送

MVDKSmem,dmad

MVKDdmad,Smem

MVDDXmem,Ymem2字

2周期2字

2周期1字

1周期7.2数据块传送C54x有10条数据传送指令,共分为四类:(2)

数据存储器与MMR之间的数据传送

MVDMdmad,MMR

MVMDMMR,dmad

MVMMMMRx,MMRy

2字

2周期2字

2周期1字

1周期(3)

程序存储器和数据存储器之间的数据传送

MVPDpmad,Smem

MVDPSmem,pmad

READASmem

WRITASmem

2字

3周期2字

4周期1字

5周期1字

5周期(2)数据存储器与MMR之间的数据传送MV(4)

从PA口读/写数据

PORTRPA,Smem

PORTWSmem,PA

2字

2周期2字

2周期数据传送指令的特点:

传送速度比加载和存储指令要快;

②数据传送不通过累加器;

可寻址程序存储器;

④与RPT结合,可实现数据块传送。

(4)从PA口读/写数据PORTRPA1.编写汇编源程序为

.mmregs.def_c_int00.dataTBL:.word0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19.word1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1PROM: .usect"PROM",20.bssa,20.bssx,20.bssy,20DATA: .usect "DATA",20.text1.编写汇编源程序为_c_int00bstartnopnopstart:STM#a,AR1;a[20]={0,1,2,3,4,5,6,7,8,9,10, ;11,12,13,14,15,16,17,18,19} RPT #39 ;x[20]={1,1,1,1,1,1,1,1,1,1MVPD TBL,*AR1+;1,1,1,1,1,1,1,1,1,1}STM#x,AR2;将数据存储器中的数组x[20]复制到数组y[20] STM #y,AR3RPT #19MVDD*AR2+,*AR3+ _c_int00STM#a,AR1;将数据存储器中的a[20]写入到程序存储器PROMLD #PROM,ASTM #19,AR3LOOPP:WRITA*AR1+ADD #1,A,ABANZ LOOPP,*AR3-LD#PROM-1,A;读程序存储器PROM中20个数据存入DATASTM #DATA,AR1ST #19,BRCRPTBLOOP2ADD#1,A,ALOOP2:READA*AR1+;该指令为单字指令WAIT: NOPBWAITSTM#a,AR1;将数据存储器中的a[202.建立汇编源程序点击CCSC5000图标,进入CCS环境,再点击File→New→SourceFile菜单命令,打开一个空白文档,将汇编源程序逐条输入。单击File→Save菜单命令,出现如图7-5所示的窗口,选择D:\ProgramFiles\ti\myprojcets\mymove子目录,在“文件名”一栏中输入mymove,并选择保存类型为AssemblySourceFiles(*.asm),单击“保存”按钮,以上汇编程序被存盘。2.建立汇编源程序3.建立链接命令文件点击File→New→SourceFile菜单命令,打开一个空白文档,逐条输入链接命令文件。mymove.obj-omymove.out-mmymove.mapMEMORY{PAGE0: RAM:origin=1000h,length=800h RAM1:origin=2000h,length=300hPAGE1: DARAM1:origin=0100h,length=100hDARAM2:origin=0200h,length=100h}3.建立链接命令文件SECTIONS{.data:>RAM PAGE0.text:>RAM PAGE0PROM : >RAM1PAGE0.bss :>DARAM1PAGE1DATA :>DARAM2PAGE1}点击File→Save菜单命令,如图7-5所示,选择D:\ProgramFiles\ti\myprojcets\mymove子目录,在“文件名”一栏中输入mymove,并选择保存类型为TICommandLanguageFile(*.cmd),单击“保存”按钮,以上链接命令程序被存盘。SECTIONS4.创建一个新工程在Project菜单中选择New项,弹出ProjectCreation(工程创建)窗口,如图7-6所示。在Project一栏键入mymove,然后单击“完成”按钮,CCS将创建一个名为mymove.pjt的工程,此文件保存了工程的设置信息及工程中的文件引用情况。4.创建一个新工程图7-5保存汇编源程序图7-6工程创建窗口图7-5保存汇编源程序5.将有关文件添加到工程中从Project菜单中选取AddFilestoProject命令,选择文件mymove.asm,双击将mymove.asm添加到工程中。点击Project→AddFilestoProject菜单命令,将mymove.cmd添加到工程文件中。逐层打开如图7-7所示。双击mymove.asm打开文件,可以观察和修改mymove.asm文件的内容。

5.将有关文件添加到工程中6.汇编、编译和链接产生.out文件点击Project菜单中的RebuildAll。请注意在监视窗口显示的汇编、编译和链接的相关信息。如果没有错误,将产生mymove.out文件;如果有错,在监视窗口以红色字体显示出错行,用鼠标双击该行,光标跳将至源程序相应的出错行。修改错误后,重新汇编、链接。6.汇编、编译和链接产生.out文件7.加载并运行.out文件执行菜单命令File→LoadProgram,选择mymove.out并打开,将RebuildAll生成的程序加载到DSP中。CCS将自动打开一个反汇编窗口,显示加载程序的反汇编指令。点击Debug→Run菜单命令运行程序,单步执行程序则点击Debug→StepInto菜单命令,或按F8键。7.加载并运行.out文件8.观察运行结果点击View→Memory菜单命令,将出现如图7-8所示的选项窗口,将Address改为0x0100,单击OK按钮,将在汇编窗口显示选定的数据空间的内容。当结果数据错误时,可检查源程序并进行修改。修改完毕,可重新汇编、链接,再加载运行.out文件,直到结果正确。返回本节8.观察运行结果返回本节7.3定点数的基本算术运算7.3.1加法、减法和乘法运算7.3.2定点除法运算返回首页7.3定点数的基本算术运算7.3.1加法、减法和乘法1.定点DSP中数据的表示方法(1)数的定标

采用小数运算时,设定小数点在16位中的位置称为定标。

小数点在16位数中的位置不同,可以表示不同大小和不同精度的小数。

数的定标通常有Q表示法,如Q0,Q1,…,Q15。Q越大,可以表示的数的范围越小,但精度越高。

在具体的定点程序中,必须根据具体情况适当选择合适的定标。

7.3.1加法、减法和乘法运算1.定点DSP中数据的表示方法采用小数运算时,设定小表7-10Q表示、S表示及数值范围表7-10Q表示、S表示及数值范围(2)小数的表示方法C54x采用基于2的补码小数表示形式。每个16位数用1个符号位(最高位)、Q个整数位、15-Q个小数位来表示。

采用2的补码小数(Q15格式),其位权值为:

MSB…………LSB

-1.2-12-22-3……2-15

例如:

00000010.10100000——21+2-1+2-3

=2.625

(2)小数的表示方法C54x采用基于2的补码小数表

Q15格式2的补码小数表示方法:

将十进制小数乘以32

768,并将整数乘积转换成16进制数。正数:乘以32

768,整数转换成16进制数;负数:其绝对值乘以32

768,整数取反加1。图7-9DSP定点运算中小数的表示Q15格式2的补码小数表示方法:正数:乘以3如:1——7FFFH0.5——4000H0.25——2000H0——0000H-0.25——E000H-0.5——C000H-1——8000H1×32

768=7FFFH0.5×32

768=4000H0.25×32

768=2000H0×32

768=0000H(0.25×32

768)补=E000H(0.5×32

768)补=C000H(1×32

768)补=8000H注意:汇编时,不能直接写成十进制小数。

如:0.907——

.word32

768*907/1000

如:1——7FFFH1×32768=7FFFH2.16位定点加法和16位定点减法C54x中提供了多条用于加法的指令,如ADD、ADDC、ADDM和ADDS。其中,ADDS用于无符号数的加法运算,ADDC用于带进位的加法运算而ADDM专用于立即数的加法。

C54x中提供了多条用于减法的指令,如SUB、SUBB、SUBC和SUBS。其中,SUBS用于无符号数的减法运算,SUBB用于带进位的减法运算,而SUBC为条件减法指令。

注意:在做加、减运算时,如果两个操作数的定标不一样,在运算前要进行小数点的调整,为保证运算精度,需要使Q值小的数调整为与另一个数的Q值一样大。2.16位定点加法和16位定点减法

【例7-8】x=5.625,y=-0.625,求x+y。解:x=5.625,采用Q3.12格式表示的十六进制码为5A00H;

y=-0.625,采用Q.15格式表示的十六进制码为B000H。将y表示为Q3.12格式时,将它右移3位,因为是负数,所以整数部分符号位扩展后结果为F600H。将F600H加到5A00H上,结果为5000H,x+y的Q3.12格式的值等于5。

【例7-8】x=5.625,y=-0.623.16位定点整数乘法C54x中提供了大量的乘法运算指令,其结果都是32位,放在累加器A或B中。乘数在C54x的乘法指令中很灵活,可以是T寄存器、立即数、存储单元和累加器A或B的高16位。在C54x中,一般对数据的处理都当做有符号数,如果是无符号数相乘,使用MPYU指令,这是一条专门用于无符号数乘法运算的指令,其他指令都是有符号数的乘法。

3.16位定点整数乘法

在整数乘法编程时,应事先复位FRCT位,如:

RSBXFRCTLDx,TMPYy,ASTHA,z_hSTLA,z_l若乘积未大于16位二进制能表示的范围,则只需要保存低16位即可。

在整数乘法编程时,应事先复位FRCT位,4.Q15定点小数乘法运算两个16位整数相乘,乘积总是“向左增长”,这就意味着多次相乘后乘积将会很快超出定点器件的数据范围。而且要将32位乘积保存到数据存储器,就要耗费两个机器周期以及两个字的程序和RAM单元。然而,两个Q15的小数相乘,乘积总是“向右增长”,这就意味着超出定点器件数据范围的将是不太感兴趣的部分。

4.Q15定点小数乘法运算小数乘法与冗余符号位

小数乘法实例:

0.5(-0.375)=-0.1875

0100

(0.5)1101

(-0.375)×0100000001001100

(-0100)

1110100(-0.1875)

小数乘法与冗余符号位小数乘法实例:0.5乘积:

-0.1875=1110100

7位二进制

扩展为8位后,乘积:11110100=-0.09375

出错原因:两带符号数相乘,其结果带有2个符号位。

Sxxx(Q3格式)

Syyy(Q3格式)

×

SSzzzzzz(Q6格式)如:11110100

左移1位:11101000结果:-0.1875

乘积:-0.1875=1110100

在小数乘法编程时,应事先设置FRCT位,如:

SSBXFRCTMPY*AR2,*AR3,ASTHA,@Z只需要保存高16位即可完成了Q15*Q15=Q15的小数乘法。为了提高精度,还可以使用RND或MPYR指令对低16位做四舍五入处理后再保存高16位。

在小数乘法编程时,应事先设置FRCT位,5.混合表示法有些情况下,运算过程中为了既满足数值的动态范围又保证一定的精度,必须采用Q0与Q15之间的表示方法。

例如:数值1.125显然用Q15格式无法表示,而若用Q0格式表示,则最接近的数是1,精度无法保证。因此,数1.125最佳的表示法是Q14格式。返回本节5.混合表示法返回本节

例如:1.125×1.5=1.6875。

01.00100000000000 (1.125);Q14× 01.10000000000000(1.5);Q140001.1011000000000000000000000000=1.6875;Q2832位的乘积:0001.1011000000000000000000000000左移一位后:001.10110000000000000000000000000保留高16位:001.1011000000000(Q13)

由于Q14的最大值不大于2,因此,2个Q14数相乘得到的乘积不大于4,理论上用Q13表示乘积。由于1.6875不大于2,所以还可以将16位积左移一位后用Q14表示。再左移一位:01.10110000000000(Q14)例如:1.125×1.5=1.6875。.title"suanshu.asm"

.mmregs

.defstart,_c_int00

.bssx1,1

.bssx2,1

.bssy1,1

.bssy2,1

.bss z1,1

.bss z2,1

.bss z3_h,1

.bss z3_l,1

.bss z4,1

v1 .set014H ;20x1

v2 .set036H ;54y1

v3 .set04000H;0.5(fraction)x2

v4 .set00b548H;-0.5837(fraction)y2

【例7-9】使用C54X汇编语言编程计算z1=x1+y1、z2x1-y1、z3=x1×y1、z4=x2×y2。.tit_c_int00

bstart

nop

nop

start:

LD #x1,DP

ST #v1,x1

ST #v2,y1

;**********testADD************

LD x1,A ;loadx1->A

ADD y1,A ;A+y1->A

STL A,z1 ;saveA(low16bits)->z1

NOP

;**********testSUB ************

LD x1,A

SUBy1,A

STL A,z2

NOP_c_int00

bstart

;**********testMPY(integer) ************

RSBXFRCT;准备整数乘法

LD x1,T;x1->T

MPY y1,A ;x1*y1->A(resultis32bit)

STH A,z3_h ;乘法结果高16位在z3_h单元中

STL A,z3_l;乘法结果低16位在z3_l单元中

NOP

ST#v3,x2

ST#v4,y2

;**********testMPY((fraction)*************

;*******0.5*(-0.58374)=-0.29187(0x0daa4)********

SSBX FRCT ;准备小数乘法

LD x2,16,A ;loadx2intoA(high16bits)

MPYA y2 ;x2*y2->B,andy2->T

STH B,z4 ;结果在z4单元中

nop

end:Bend;**********testMP【例7-10】使用双操作数指令编程计算y=

。;***编制计算小数乘法运算的程序段。其中数据均为小数***;***a1=0.1a2=0.2a3=-0.3a4=0.4***;***x1=0.8x2=0.6x3=-0.4x4=-0.2***

.mmregs .def start,_c_int00

.bssx,4 .bssa,4 .bss y,1

.datatable:.word1*32768/10 .word2*32768/10 .word-3*32768/10【例7-10】使用双操作数指令编程计算y=.word4*32768/10

.word8*32768/10

.word6*32768/10

.word-4*32768/10

.word -2*32768/10

.text

_c_int00

bstart

nop

nop

start:SSBX FRCT

STM #0,SWWSR

STM #x,AR1

RPT #7

MVPDtable,*AR1+

STM #x,AR2

STM #a,AR3

STM #y,AR4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论