有四种基本寻址方式:
直接寻址 - 16位的寄存器DP用作,固定页指针(段指针),DP中存放当前变量所在页的首地址,指令中的6位或7位二进制数给出变量的偏移量(段偏移量)。用于访问固定地址的数据结构,如片上外设或C/C++中的全局变量和静态变量。
栈寻址-通过使用栈指针SP访问变量,在C28x中栈是从低地址向高地址增长的,SP始终指向下一个可用的空栈单元。SP值减去指令中6位二进制数给出的偏移量为变量地址,或者该偏移量给出分别在压栈(或出栈)操作时SP需要后加(或先减)的量。
间接寻址 - 32位的辅助寄存器XAR0~XAR7用作通用32位数据指针。指令可以进行直接的后加、先减/后减,或者通过三位二进制立即数给出对哪个寄存器操作,也可以用另外一个16位辅助寄存器内容给出当前用的寄存器。
寄存器寻址 - 直接对寄存器内容操作,寄存器可以是操作的源或目的地。这就使得C28x架构可以直接进行寄存器对寄存器的操作。
其它的寻址方式: 数据/程序/IO空间立即寻址 - 存储器地址操作数直接嵌入在指令中。 程序空间间接寻址 - 某些指令可以使用某个间接指针来访问程序空间。因为C28x CPU中存储器之一致的,因此这种寻址模式可以完成在同一条指令中同时读两个操作数的操作。
说明:寻址模式由指令中的八位编码给出,状态寄存器ST1中的寻址模式选择位AMODE给出了编译器所使用的编码方式。 AMODE=0 - 复位时默认的寻址模式,也是C28x的C/C++编译器使用的默认模式。但某些寻址方式C2xLP器件不兼容,此时段偏移量由六位二进制数给出(C2xLP器件是七位的),因此仅支持部分C2xLP器件的间接寻址方式。 AMODE=1 - 包含了C2xLP器件全兼容的寻址模式。此时段偏移量为七位二进制数给出,支持C2xLP器件所有的寻址方式。
注意:(1)C28x器件和C2xLP器件间接寻址指令的不同在于,C28x的指令中辅助寄存器指针是隐含的,也就是指令中标明了对哪个寄存器操作。而在Cx2LP的指令中,对哪个寄存器操作是由3位的辅助寄存器指针ARP(在ST1中)给出的,并且可以同时给出下一条指令要使用辅助寄存器指针(第三个操作数);(2)在C28x的指令中,目的操作数总是在源操作数的左边。请看下例: 假如要完成这样的操作,把XAR4所指的数据读出加到AL中,随后把XAR4的内容加一,C28x的指令为:ADD AL,*XAR4++;C2xLP的指令可以为:ADD AL,*++(此时ARP=4)。而C2xLP的指令ADD AL,*++,ARP5则在完成上述操作的同时,把ARP的内容更新为5,即令ARP指向ARP5。
具体的区别请参见TI的文档spru430d中第五章的表5-1。
操作符*和@的作用:*表示取后面的变量值或寄存器的内容作为地址,取该地址所指向的存储空间的内容作为操作数。@表示直接取后面的变量值或寄存器的内容作为操作数。
如何改变编译器的处理模式: 编译器总是默认为AMODE=0,通过两种方式改变编译器的处理方式,一种是命令行参数法,当使用-v28时使编译器默认为AMODE=0模式,当使用-v28 -m20时默认为AMODE=1模式。另一种是源文件中指定法,如下面的文件(假设编译器命令行参数为-v28) ; 文件开始 ... ... ... SETC AMODE ; AMODE位置一 .lp_amode ; 通知编译器检查C27x/C28x的语法,该段代码只能用AMODE=1的寻址方式 ... ... ... CLRC AMODE ; AMODE位清零 .c28_amode ; 通知编译器检查C28x的语法,该段代码只用AMODE=0的寻址方式 ... ... ... ; 文件结束 |