间接寻址方式(Indirect Addressing Mode)操作数的物理地址存放在32位寄存器XAR0~XAR7中。在C28x的间接寻址中所用的寄存器直接出现在指令中。在C2xLP的间接寻址中,由3位的辅助寄存器指针(ARP)选择指令使用哪个辅助寄存器作为间接寻址寄存器。
AMODE的取值不同,则间接寻址方式也不同。下面介绍C28x、C2xLP以及循环间接寻址方式。
1.C28x间接寻址方式
C28x间接寻址方式有5种形式:∗XARn++、∗--XARn、∗+XARn[AR0]、∗+XARn[AR1]和∗+XARn[3bit],其说明分别见表3-7~表3-11。
表3-7 AMODE=x时∗XARn++的语法说明
注:指令执行后,若是loc16,则XARn=XARn+1;若是loc32,则XARn=XARn+2。
指令实例:
MOVL XAR2,#Array1 ;将Arrayl的起始地址装入XAR2
MOVL XAR3,#Array2 ;将Array2的起始地址装入XAR3
MOV @AR0,#N-1 ;将循环次数N装入AR0
Loop:
MOVL ACC,∗XAR2++ ;将XAR2所指存储单元内容装入ACC,之后XAR2加2
MOVL ∗XAR3++,ACC ;将ACC内容存入XAR3所指存储单元,之后XAR3加2
BANZ Loop,AR0-- ;循环判断是否AR0=0,不为0转,且AR0减1
该程序段实现将起始地址Array1开始的N个存储单元(32位)的内容复制到Array2开始的存储单元。
表3-8 AMODE=x时∗--XARn的语法说明
指令实例:
MOVL XAR2,#Array1+N∗2 ;将Array1的结束地址装入XAR2
MOVL XAR3,#Array2+N∗2 ;将Array2的结束地址装入XAR3
MOV @AR0,#N-1 ;将循环次数N装入AR0
Loop:
MOVL ACC,∗--XAR2 ;XAR2先减2,XAR2所指存储单元内容装入ACC
MOVL ∗--XAR3,ACC ;XAR3先减2,将ACC内容存入XAR3所指存储单元
BANZ Loop,AR0-- ;循环判断是否AR0=0,不为0转,且AR0减1
表3-9 AMODE=x时∗+XARn[AR0]的语法说明
表3-10 AMODE=x时∗+XARn[AR1]的语法说明
指令实例:
MOVW DP,#Array1ptr ;DP指向Array1指针位置
MOVL XAR2,@Array1ptr ;将Array1指针装入XAR2
MOVB XAR0,#16 ;AR0=16,AR0H=0
MOVB XARl,#68 ;AR1=68,AR1H=0
MOVL ACC,∗+XAR2[AR0]
MOVL P,∗+XAR2[AR1]
MOVL ∗+XAR2[AR1],ACC
MOVL ∗+AR2[AR0],P ;将Array1[16]的内容与Array1[68]的内容互换
表3-11 AMODE=x时∗+XARn[3bit]的语法说明
指令实例:
MOVW DP,#Array1ptr ;DP指向Array1指针位置
MOVL XAR2,@Array1ptr ;将Arrayl指针装入XAR2
MOVL ACC,∗+XAR2[2]
MOVL P,∗+XAR2[5]
MOVL ∗+XAR2[5],ACC
MOVL ∗+XAR2[2],P ;将Array1[2]的内容与Array1[5]的内容互换
注意:汇编器也可以将“∗XARn”作为一种寻址方式,这其实是“∗+XARn[3bit]”的特例“∗+XARn[0]”。
2.C2xLP间接寻址方式
C2xLP间接寻址方式在AMODE=0时有8种形式:∗、∗++、∗--、∗0++、∗0--、BR0++、∗BR0--和∗,ARPn。在AMODE=1时与C24x完全兼容。各种寻址方式综合说明见表3-12~表3-18。
表3-12 AMODE=x时∗的语法说明
表3-13 AMODE=x时∗++的语法说明
表3-14 AMODE=x时∗--的语法说明
指令实例:
MOVL XAR2,#Array1 ;将Arrayl的起始地址装入XAR2(www.daowen.com)
MOVL XAR3,#Array2 ;将Array2的起始地址装入XAR3
MOV @AR0,#N-1 ;将循环次数N装入AR0
NOP ∗,ARP2 ;ARP指针指向XAR2
SETC AMODE ;务必令AMODE=1
.lp_amode ;告知汇编器AMODE=1
Loop:
MOVL ACC,∗++,ARP3 ;将XAR2所指存储单元内容装入ACC,之后XAR2加2
;ARP指针指向XAR3
MOVL ∗++,ACC,ARP0 ;将ACC内容存入XAR3所指存储单元,之后XAR3加2
;ARP指针指向XAR0
BANZ Loop,∗--,ARP2 ;循环直至AR0=0,AR0减l。ARP指针指向XAR2
表3-15 AMODE=x时∗0++的语法说明
注:XAR0的低16位加到选定的32位寄存器中,XAR0的高16位被忽略。AR0作为一个16位的无符号数。
表3-16 AMODE=x时∗0--的语法说明
注:从选定的32位寄存器中减去XAR0的低16位,XAR0的高16位被忽略。AR0作为一个16位的无符号数。
表3-17 AMODE=x时∗BR0++的语法说明
注:XAR0的低16位反向进位加(rcadd)到选定的32位寄存器中,XAR0的高16位被忽略。操作不改变选定寄存器的高16位。
指令实例:
MOVL XAR2,#Arrayl ;将Arrayl的起始地址装入XAR2
MOVL XAR3,#Array2 ;将Array2的起始地址装入XAR3
MOV @AR0,#N ;将Array的长度N装入AR0,N必须是2的倍数
MOV @AR1,#N-1 ;将循环次数N装入AR1
NOP ∗,ARP2 ;ARP指针指向XAR2
SETC AMODE ;令AMODE=1
·lp_amode ;告知汇编器AMODE=1
Loop:
MOVL ACC,∗++,ARP3 ;将XAR2所指存储单元内容装入ACC,且XAR2加2
;ARP指针指向XAR3
MOVL ∗BR0++,ACC,ARP1 ;将ACC内容存入XAR3所指存储单元,XAR3反向进位加AR0
BANZ Loop,∗--,ARP2 ;循环直至AR0=0,AR0减l。ARP指针指向XAR2
表3-18 AMODE=x时∗BR0--的语法说明
注:从被选定寄存器的低16位反向借位减(rcsub)去XAR0的低16位。XAR0高16位被忽略。操作不会改变选定寄存器的高16位。
反向进位加法和反向借位减法通常用于FFT算法的数据重新排序。典型的使用方法是,AR0被初始化为(FFT点数)/2,使用反向进位寻址方式则可以自动产生存储FFT数据的地址。在C28x中,这种寻址方式限制数据块尺寸小于64KW,实际上大多数FFT运算都远小于这个数值。
3.循环间接寻址方式
循环间接寻址(Circular Indirect Addressing)有两种方式,说明分别见表3-19和表3-20。
表3-19 AMODE=0时∗AR6%++的语法说明
注:这种寻址方式,循环缓冲器不能跨越64KW的页边界,被限制在数据空间的低64KW空间。
实例:计算有限脉冲响应(FIR)滤波器(X[N]为数据阵列,C[N]为系数矩阵)。
MOVW DP,#Xpointer ;将X[N]阵列Xpointer的页地址装入DP
MOVL XAR6,@Xpointer ;将当前的Xpointer值装入XAR6
MOVL XAR7,#C ;将C阵列的起始地址装入XAR7
MOV @AR1,#N ;将阵列大小装入AR1
SPM -4 ;设置乘积移位模式为右移4位
ZAPA ;ACC=0,P=0,OVC=0
RPT N-1 ;下一条指令重复执行N次
QMACL P,∗AR6%++,∗AR7++ ;ACC=ACC+P>>4
;P=(∗AR6%++)×(∗AR7++)>>32,修改指针
ADDL ACC,P<<PM ;最后累加
MOVL @Xpointer,XAR6 ;将XAR6存入当前Xpointer
MOVL @Sum,ACC ;将结果存入Sum
表3-20 AMODE=1时∗AR6%++的语法说明
注:这种寻址方式,没有循环缓冲器定位要求。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。