*XAR7++ 22位程序地址:(21:0)=XAR7 如果是16位数据操作,XAR7+=1 如果是32位数据操作,XAR7+=2 PS:如果指令被重复执行,地址每次执行后增加1 表6-10程序空间间接寻址方式下的指令语法说明 6.2.7字节寻址方式
字节寻址方式见表6-11 说明 语法 *+XARn[AR0] 32位数据地址(31:0)=XARn+偏移量(即AR0/AR1/3bit) *+XARn[AR1] 如果(偏移量=偶数),访问16位存储单元的最低有效字节;其最高字节不受*+XARn[3bit] 影响 如果(偏移量=偶数),访问16位存储单元的最高有效字节;其最低字节不受影响 PS:其他寻址方式只能访问固定地址单元的最低有效字节,而不影响最高有效字节 表6-11字节寻址方式语法说明 字节寻址的例子如下:
MOV AX.LSB,loc16 ;若(地址方式=*+XARn[AR0/AR1/3bit])
;若(偏移量=偶数值),AX.LSB=[loc16].LSB,AX.MSB=0x00 ;若(偏移量=奇数值),AX.LSB=[loc16].MSB,AX.MSB=0x00 ;否则,AX.LSB=[loc16].LSB,AX.MSB=0x00 MOVB AX.MSB,loc16 ;若(地址方式=*+XARn[AR0/AR1/3bit])
;若(偏移量=偶数值),AX.LSB=原值,AX.MSB= [loc16].LSB ;若(偏移量=奇数值),AX.LSB=原值,AX.MSB=[loc16].MSB ;否则,AX.LSB=[loc16].LSB,AX.MSB=[loc16].LSB
6.3 C28x汇编操作指令
在C28x系列的DSP当中有超过150条的汇编指令,按照功能来分可分位15类,接下来通过表格的方式向读者解释一下最常用的指令。 1.对辅助寄存器(XAR0~XAR7)的操作
CPU提供了8个32位的辅助寄存器:XAR0、XAR1、XAR2、XAR3、XAR4、XAR5、XAR6和XAR7。可以作为地址指针指向存储器,或者作为通用目的寄存器来使用。许多指令可以访问XAR0~XAR7的低16位,其中,辅助寄存器的低16位为AR0~AR7,它们用作循环控制和16位比较的通用目的寄存器。当访问AR0~AR7时,寄存器的高16位(AR0H~AR7H)可能改变或者不改变,着主要取决于所应用的指令。AR0H~AR7H只能作为XAR0~XAR7的一部分来读取,不能单独进行访问。具体操作看表6-12。
助记符 ADD XARn,#7bit ADRK #8bit CMPR 0/1/2/3 说明 7位立即数加到辅助寄存器XARn 8位立即数加到当前辅助寄存器 比较辅助寄存器 MOV AR6/7,loc16 MOV loc16,ARn MOV XARn,PC MOVB XARn,#8bit MOVL XARn,loc32 MOVL loc32,XARn MOVZ ARn,loc16 SBRK #8bit SUBB XARn,#7bit [loc16]加载到辅助寄存器 存储16位辅助寄存器到loc16 保存当前程序指针到辅助寄存器 8位立即数加载到辅助寄存器XARn [loc32]加载32位辅助寄存器 存储32位辅助寄存器内容到loc32 加载XARn的低16位清除高16位 从当前辅助寄存器仲减去8位立即数 从辅助寄存器XARn中减去7位立即数 MOVB AR6/7,#8bit 8位立即数加载到辅助寄存器AR6/7 MOVL XARn,#22bit 用22位立即数加载32位辅助寄存器XARn 表6-12对寄存器XARn的操作说明
2.对数据页指针(DP)的操作
在直接寻址方式中,对数据存储器的寻址要在64个字(即一个页面为64个字)的数据页中进行。由低4M字节的数据存储器组成65536个数据也,用0-65535进行标号 。在DP直接寻址方式下,16位的数据页指针(DP)包含了目前的数据页数。可以通过DP通过给DP赋新值去改变数据页号。具体操作说明看表6-13。 助记符 MOV DP,#10bit MOVW DP,#19bit 说明 加载10位立即数到数据页指针 加载整个数据页 MOVZ DP,#10bit 加载数据页并清除高位 表6-13对DP寄存器操作的说明
3.对堆栈指针SP的操作
堆栈指针(SP)允许在数据存储器中使用软件堆栈。堆栈指针为16位,可以对数据空间的低64K进行寻址。当使用SP时,将32位地址的高16位置为0。复位后SP指向地址00000400h。堆栈操作说明如下: 1.栈从低地址向高地址增长。
2.P总是指向堆栈中的下一个区域。
3.SP被初始化,它指向地址00000400h。
4.将32位数值存入堆栈时,先存入低16位,然后将高16位存入下一个高地址中。
5.当读取32位的数值时,C28x系列的CPU期望存储器或外设接口逻辑把读写排成偶地址。例如,如果SP包含一个奇数地址00000083h,那么,进行一个32位的读操作时,将从地址00000082h和00000083h中读取数值。
6.如果增加SP的值。如果他超过FFFFh,或者减少SP的值,使它低于0000h开始计数。例如,如果SP=FFFFh而一个指令又想SP加3,啫结果是0001h。当减少SP的值使它达到0000h,它就会重新从FFFFh计数。例如,如果SP=0002h而一个指令又从SP减4,则结果就是FFFFh。 7当数值存入堆栈是,SP并不要求排成奇数或者偶数地址。排列由存储器或者外设接口逻辑完成。具体的语法操作说明看表6-14。
助记符 ADDB SP,#7bit POP ACC POP AR1:AR0 POP AR1H:AR1H 说明 7位立即数加载堆栈指针 堆栈内容弹出到寄存器ACC 堆栈内容弹出到寄存器AR1和AR0 堆栈内容弹出到寄存器AR1H和AR1H POP DBGIER POP DP:ST1 POP DP POP IFR POP loc16 POP P POP RPC POP ST0 POP ST1 POP T:ST0 POP XT POP XARn PUSH ACC PUSH ARn:ARm PUSH DBGIER PUSH DP:ST1 PUSH DP PUSH IFR PUSH loc16 PUSH P PUSH RPC PUSH ST0 PUSH ST1 PUSH T:ST0 PUSH XT PUSH XARn SUBB SP,#7bit 堆栈内容弹出到寄存器DBFIER 堆栈内容弹出到寄存器DP和ST1 堆栈内容弹出到寄存器DP 堆栈内容弹出到寄存器IFR 堆栈内容弹出到loc16 堆栈内容弹出到寄存器P 堆栈内容弹出到寄存器RPC 堆栈内容弹出到寄存器ST0 堆栈内容弹出到寄存器ST1 堆栈内容弹出到寄存器T和ST0 堆栈内容弹出到寄存器XT 堆栈内容弹出到辅助寄存器 寄存器ACC的内容入栈 寄存器ARN和ARm的内容入栈 寄存器DBGIER的内容入栈 寄存器DP和ST1的内容入栈 寄存器DP的内容入栈 寄存器IFR的内容入栈 [loc16]入栈 寄存器P的内容入栈 寄存器RPC的内容入栈 寄存器ST0的内容入栈 寄存器ST1的内容入栈 寄存器T和ST0的内容入栈 寄存器XT的内容入栈 辅助寄存器的内容入栈 从堆栈指针中减去7位立即数 PUSH AR1H:AR0H 寄存器AR1H和AR0H的内容入栈 表6-14对SP寄存器操作的说明
4.对AX寄存器的操作
在汇编语言程序中,累加器——AX是一个非常重要的寄存器,但在程序中用它来保存临时数据时,最好将其转存到其它寄存器或内存单元中,以防止在其它指令的执行过程中使其中的数据被修改,从而得到不正确的结果,为程序的调试带来不必要的麻烦。具体操作请看表6-15。 助记符 ADD AX,loc16 ADD loc16,AX ADDB AX,#8bit ANDB AX,#8bit ASR AX,#(1-16) ASR AX,T [loc16]加到AX 将AX的内容与[loc16]相加,并存储到loc16 将8位立即数累加到AX AX与8位立即数(零扩展)逐位“与” 算术右移,移位次数由立即数决定 算术右移,以为次数由T(3:0)的值决定 说明 AND AX,loc16,#16bit 16位立即数和[loc16]逐位“与”,结果保存到AX CMP AX,loc16 CMPB AX,#8bit FLIP AX LSL AX,#(1-16) LSL AX,T LSR AX,#(1-16) LSR AX,T MAX AX,loc16 MIN AX,loc16 MOV AX,loc16 MOV loc16,AX MOV loc6,AX,COND MOVB AX,#8bit MOVB AX,LSB,loc16 MOVB AX,MSB,loc16 MOVB loc16,AX,LSB MOVB loc16,AX,MSB NEG AX NOT AX OR AX,loc16 OR loc16,AX ORB AX,#8bit SUB AX,loc16 SUB loc16,AX SUBR loc16,AX SXTB AX XOR AX,loc16 XOR loc16 ,AX XORB AX,#8bit AX与[loc16]比较 AX与8位立即数(零扩展)比较 将AX寄存器中的数据位翻转顺序 逻辑左移,移位次数由立即数决定 逻辑左移,移位次数由T(3:0)的值决定 逻辑右移,移位次数由立即数决定 逻辑右移,移位次数由T(3:0)的值决定 AX与[loc16]相比较求最大值,并保存到AX AX与[loc16]相比较求最小值,并保存到AX [loc16]加载到AX 寄存器AX保存到loc16 有条件地把AX存储到loc16 把8位立即数(零扩展)加载到AX 加载AX的低字节,AX的高字节等于0x00 加载AX的高字节,AX的低字节不变 加载AX的低字节 加载AX的高字节 求AX的相反数 求AX的“非” AX和[loc16]按位“或”,结果保存到AX AX和[loc16]按位“或”,结果保存到loc16 AX和8位立即数(零扩展)按位“或”,结果保存到AX 从AX中减去[loc16] [loc16]减去AX中的数据,结果存储到loc16 反向减法,AX中的数据减去[loc16],结果存储到loc16 将AX的低字节符号扩展到高字节 AX和[loc16]按位“异或”,结果保存到AX AX和[loc16]按位“异或”,结果保存到loc16 AX与8位立即数(零扩展)逐位“异或”,结果保存到AX 表6-15 AX寄存器操作说明
5.对16位ACC寄存器的操作
累加器(ACC)是CPU的主要工作寄存器。除了那些对存储器和寄存器的直接操作外,所有的ALU操作结果最终都要送入ACC。ACC支持单周期数据传送、加法、减法和来自数据存储器的宽度为32位的比较运算,它也可以接受32位乘法操作的运算结果。对ACC可以单独进行16位/8位的访问。累加器还具有如下的相关状态位。 (1).溢出模式位(OVM) (2).符号扩展模式位(SXM) (3).测试/控制标志位(TC) (4).进位位(C) (5).零标志位(Z) (6).负标志位(N) (7).溢出标志位(V)
(8).溢出计数位(OVC)
对于ACC寄存器的具体操作说明请看表6-16 16位ACC寄存器操作说明、表6-17 32位ACC寄存器操作说明和表6-18 64位ACC寄存器操作说明 助记符 说明 ADD ACC,loc16{<<#0...16} 将[loc]移位后(位扩展)加到ACC ADD ACC,#16bit{<<#0...15} 将16位立即数移位后(位扩展)加到ACC ADD ACC,loc16<