在间接寻址方式中,64K字数据空间的任意单元都可以通过一个辅助寄存器中的内容所代表的16位地址进行访问。TMS320C54x有8个16位辅助寄存器(AR0~AR7)、2个辅助寄存器算术单元(ARAU0和ARAU1),根据辅助寄存器ARx的内容进行操作,完成无符号的16位算术运算。间接寻址主要用在需要存储器地址以步进方式连续变化的场合。当使用间接寻址方式时,辅助寄存器内容(地址)可以被修改(如增加或减少),还可以提供循环寻址和位倒序寻址两种特殊模式。
间接寻址方式有很大的灵活性,不但可以用一条指令从数据存储器读或写一个16位的数据操作数(单操作数寻址),还能在一条指令中访问2个数据存储器单元(双操作数寻址),包括从2个不同的数据存储器单元读数据,读并写2个连续的存储器单元,或者读一个存储器单元同时写另一个存储器单元。
1.单操作数寻址
单操作数寻址是指一条指令中,只有一个存储器操作数(即从存储器中只存取一个操作数)。单数据存储器操作数间接寻址指令的格式如图4-6所示,其各位功能说明见表4-3。
图4-6 单数据存储器操作数间接寻址指令的格式
表4-3 单数据存储器操作数间接寻址指令的各位说明
表4-4 单数据存储器操作数的间接寻址类型
(续)
①寻址16位字时增量/减量为1,寻址32位字时增量/减量为2。
②这种方式只能用于写操作指令。
③这种方式不允许对存储器映射寄存器寻址。
MOD=0,1,2,3,12,13为增加,减少指令类寻址方式,其中MOD=0,1,2,3为增1、减1寻址方式,注意先增后寻址(*+ARx)只能用于写操作。MOD=12,13为加偏移量寻址方式,前一种ARx的值不更新,后一种ARx的值更新。
MOD=5,6为变址寻址方式,和加偏移量寻址方式相比,变址寻址方式不需要额外的偏移地址指令字,而且地址偏移量是在代码执行阶段确定的,因此可以调整变址步长。
【例4-9】 增量/减量指令类寻址方式示例。
【例4-10】 变址寻址方式示例。
在表4-4单数据存储器操作数的间接寻址类型中,除了上述常见的增加、减少指令类和变址寻址功能外,还增加了两种特殊的间接寻址方式,分别为循环寻址和位倒序寻址。下面分别对循环寻址和位倒序寻址进行介绍。
(1)循环寻址
在卷积、相关和FIR滤波器等算法中,都需要在存储器中设置一个循环缓冲器,它是一个滑动窗口,保存着最新的一批数据。当新的数据到来时,缓冲器中最早的数据就会被新的数据覆盖。循环缓冲器实现的关键是循环寻址的实现。TMS320C54x间接寻址中以后缀“%”表示循环寻址的方式。
循环缓冲器的参数主要包括:循环缓冲器长度寄存器(BK)、循环缓冲器的有效基地址(EFB)和循环缓冲器的尾地址(EOB)。其中,循环缓冲器长度寄存器(BK)用于确定循环缓冲器的大小。BK中的数值由指令“STM#lk,BK”设定。长度为R的缓冲器必须从N位地址的边界开始(即循环缓冲器基地址的N个最低有效位必须为0),N是满足2N>R条件的最小整数,R值必须要放入BK。例如,长度R=31的循环缓冲器必须从地址XXXX XXXX XXX0 0000b(N=5,25>31,该地址的最低5位为0)开始,同时31必须存入BK。又如,长度R=32的循环缓冲器必须从地址XXXX XXXX XX00 0000b(N=6,26>32,该地址的最低6位为0)开始,同时32必须存入BK。
循环缓冲器的有效基地址(EFB)定义了缓冲器的起始地址,也就是用户选定的辅助寄存器(ARx)的低N位置0后所得到的值,循环缓冲器的尾地址(EOB)定义了缓冲器的底部地址,它通过用BK的低N位代替ARx的低N位得到。
循环缓冲器的指针index就是当前ARx的低N位,步长step就是一次加到辅助寄存器或从辅助寄存器中减去的值。循环寻址的算法为
图4-7所示的循环缓冲器示意图说明了循环缓冲器是如何实现的,并且说明了产生的值和循环缓冲器中单元的关系。
图4-7 循环缓冲器示意图
【例4-11】 循环寻址方式示例。
使用*AR2+0%间接寻址方式重复执行三次指令STT,*AR2+0%
1)设存储器大小为R=25=32,由于26>R=25,选N=6,则N-1=5。
存储器首地址EFB:
存储器尾地址EOB:
首地址(AR2)=0080h
数据块大小(BK)=0020h
2)若步长step:(AR0)=0014h
(www.xing528.com)
3)若步长step:(AR0)=FFFCh
使用循环寻址时,必须遵循以下3个原则:
①循环缓冲器的长度R小于2N,且地址从一个低N位为0的地址开始。
②步长小于或等于循环缓冲器的长度。
③所使用的辅助寄存器必须指向缓冲器单元。
循环寻址可用于单数据存储器操作数寻址,也可用于双数据存储器操作数寻址。当BK=0时,ARx的值不修正。表4-4中MOD=8,9,10,11,14为循环寻址方式,不同的指令其步长和正负不同。
(2)位倒序寻址
位倒序寻址是DSP的一种特殊处理方式,是专门为快速傅里叶变换FFT而设计的,这种寻址方式可以显著提高程序的执行速度和存储区的利用效率。使用时,AR0存放的整数N为FFT点数的一半,另一个辅助寄存器ARx指向数据存放的单元,当使用位倒序寻址把AR0加到辅助寄存器中时,地址以位倒序的方式产生,即进位是从左向右,而不是通常的从右向左。例如,1010与1100的正向进位相加结果为10110,而1010与1100的反向进位即位倒序相加结果为0001:
表4-4中MOD=4和MOD=7即*ARx-0B和*ARx+0B表示位倒序寻址。
假设辅助寄存器都是8位字长,AR2表示在存储器中数据的基地址(01100000b),AR0的值为(00001000b)。下面给出在位倒序寻址中AR2值修改的顺序和修改后AR2的值。
开始时刻AR2的值是01100000b,采用位倒序间接寻址方式,不是在AR2的基础上简单地加1,而是AR2与AR0采用位倒序方式相加,也就是计算B(01100000b+00001000b),所以结果就是01101000b。第2次寻址就是计算B(01101000b+00001000b),所以结果就是01100100b,依此计算。必须注意的是,这些计算都是采用从左到右的位倒序计算顺序。
在快速傅里叶变换FFT分析中广泛应用位倒序概念,如在时间抽选奇偶分解FFT变化中,输入为自然顺序,输出为位倒序;在频率抽选奇偶分解FFT变化中,输入为位倒序,输出为自然顺序。以16点快速傅里叶变换FFT为例,其原序和位倒序寻址对应关系见表4-5。
表4-5 原序和位倒序寻址
【例4-12】 位倒序存储示例。
数字0~7按正序存在0100h~0107h存储区,见表A,编程使表A中数传到0110h~0117h存储区且要求数据按照位倒序存放在该区,见表B。
设(AR3)=0100h,(AR2)=0110h,(AR0)=0004h,T=0000h执行n次下述两条指令:
由上述分析可知,指令执行后AR2的地址和内容与表B相对应,当n=8时,完成位倒序存储。
2.双操作数寻址
双数据存储器操作数间接寻址用于完成两次读操作或者一次读和一次并行存储操作(用||表示)。这些指令只有一个字长且只能以间接寻址的方式工作。两个数据存储器操作数用Xmem和Ymem表示,其中Xmem表示读操作数,Ymem在读两个操作数时表示读操作数,Ymem在一次读同时并行一个写的指令中表示写操作数。如果源操作数和目的操作数指向了同一个单元,那么在并行存储指令中(如ST||LD),读在写之前。如果一个双操作数指令(如ADD)指向了同一辅助寄存器,且这两个操作数的寻址方式不同,那么就用Xmod所确定的方式来寻址。
双数据存储器操作数间接寻址指令的格式如图4-8所示,其各位功能说明见表4-6。
图4-8 双数据存储器操作数间接寻址指令的格式
表4-6 双数据存储器操作数间接寻址指令的各位说明
在指令格式中,由于只有两位可以用来选择辅助寄存器,所以根据Xar或Yar的值可以选择4个辅助寄存器AR2~AR5。表4-7说明了Xar或Yar与辅助寄存器的对应关系。
表4-7 Xar或Yar与辅助寄存器的对应关系
双数据存储器操作数间接寻址类型为*ARx、*ARx-、*ARx+、*ARx+0%。表4-8列出了双数据存储器操作数间接寻址的类型,以及每种类型修改字段的值(Xmod或Ymod)、汇编语句和功能。
表4-8 双数据存储器操作数间接寻址的类型
【例4-13】 双操作数寻址示例。
双数据存储器操作数间接寻址的特点是:占用程序空间小,运行速度快,在一个机器周期内通过两个16位数据总线(C和D)读两个操作数。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。