理论教育 间接寻址方式详解

间接寻址方式详解

时间:2023-06-15 理论教育 版权反馈
【摘要】:间接寻址方式操作数的物理地址存放在32位寄存器XAR0~XAR7中。在C28x的间接寻址中所用的寄存器直接出现在指令中。在C2xLP的间接寻址中,由3位的辅助寄存器指针选择指令使用哪个辅助寄存器作为间接寻址寄存器。下面介绍C28x、C2xLP以及循环间接寻址方式。

间接寻址方式详解

间接寻址方式(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++的语法说明

978-7-111-57271-8-Chapter03-18.jpg

注:指令执行后,若是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的语法说明

978-7-111-57271-8-Chapter03-19.jpg

指令实例:

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]的语法说明

978-7-111-57271-8-Chapter03-20.jpg

3-10 AMODE=x时∗+XARn[AR1]的语法说明

978-7-111-57271-8-Chapter03-21.jpg

指令实例:

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]的语法说明

978-7-111-57271-8-Chapter03-22.jpg

指令实例:

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时∗的语法说明

978-7-111-57271-8-Chapter03-23.jpg

3-13 AMODE=x时∗++的语法说明

978-7-111-57271-8-Chapter03-24.jpg

3-14 AMODE=x时∗--的语法说明

978-7-111-57271-8-Chapter03-25.jpg

指令实例:

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++的语法说明

978-7-111-57271-8-Chapter03-26.jpg

注:XAR0的低16位加到选定的32位寄存器中,XAR0的高16位被忽略。AR0作为一个16位的无符号数。

3-16 AMODE=x时∗0--的语法说明

978-7-111-57271-8-Chapter03-27.jpg

注:从选定的32位寄存器中减去XAR0的低16位,XAR0的高16位被忽略。AR0作为一个16位的无符号数。

3-17 AMODE=x时∗BR0++的语法说明

978-7-111-57271-8-Chapter03-28.jpg

注: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--的语法说明

978-7-111-57271-8-Chapter03-29.jpg

注:从被选定寄存器的低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%++的语法说明

978-7-111-57271-8-Chapter03-30.jpg

注:这种寻址方式,循环缓冲器不能跨越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%++的语法说明

978-7-111-57271-8-Chapter03-31.jpg

注:这种寻址方式,没有循环缓冲器定位要求。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈