
第三章DSP的软件结构.ppt
174页第三章第三章DSP的软件结构的软件结构 Introductionn汇编语言程序编写方法汇编语言程序编写方法 nTMS320C54x的寻址方式的寻址方式nTMS320C54x指令的表示方法指令的表示方法 nTMS320C54x的指令系统的指令系统 n汇编伪指令汇编伪指令 汇编程序语法汇编程序语法TMS320的的汇汇编编程程序序包包含含汇汇编编指指令令((伪伪指指令令,,assembler directives))、、汇汇编编语语言言 指指 令令 (( assembly language instructions)) 、、 宏宏 指指 令令 (( macro directives))和注释(和注释(comments)汇编程序源程序格式汇编程序源程序格式[label][:] mnemonic [operand list] [;comment][标号标号][:] 助记符助记符 [操作数操作数] [;注释;注释]n SYM1 .set 2 ;符号;符号SYM1=2nBegin: LD #SYM1, AR1 ;将;将2装入装入AR1汇编程序语法汇编程序语法v所有的语句必须由语句标号、空格、所有的语句必须由语句标号、空格、* *号或号或 ;号开头。
号开头v语句标号不是必须的,如果用,就必须语句标号不是必须的,如果用,就必须在第一列在第一列v语句中的各部分之间,由一个或多个空语句中的各部分之间,由一个或多个空格分开v注释不是必须的注释可以从第一列的注释不是必须的注释可以从第一列的 * * 号或号或 ;号开头;如果不是从第一列开;号开头;如果不是从第一列开始,就必须用始,就必须用 ;号开头语句标号语句标号 由字母、数字、由字母、数字、_、、$组成,最多不超过组成,最多不超过32个字符,对大小写敏感,第一个字符个字符,对大小写敏感,第一个字符不能是数字后跟不能是数字后跟 :助记符助记符v助助记记符符不不允允许许从从第第一一列列开开始始,,否否则则被被认认为是语句标号为是语句标号v助助记记符符可可以以是是机机器器指指令令((如如ABS,,MPYU等等 )) 、、 伪伪 指指 令令 (( 如如 .data, .list, .set等等 )) 、、 宏宏 指指 令令 (( 如如.macro, .var, .mexit等)和宏调用等)和宏调用操作数操作数操作数可以是常数、符号或表达式当操作数多于一个操作数可以是常数、符号或表达式。
当操作数多于一个时,用逗号分开时,用逗号分开n汇编器允许指定常数、符号或表达式作为地址、立即汇编器允许指定常数、符号或表达式作为地址、立即数或间接地址操作数前缀规定如下:数或间接地址操作数前缀规定如下:n# #前缀:表示操作数为立即数如:前缀:表示操作数为立即数如: LabelLabel::ADD #123ADD #123,,B B ;表示将操作数;表示将操作数123123(十(十进制)和累加器进制)和累加器B B中的内容相加中的内容相加n* *前缀:操作数为间接地址使用操作数的内容作为地前缀:操作数为间接地址使用操作数的内容作为地址如: LabelLabel::LD *AR4LD *AR4,,A A ;操作数;操作数* *AR4AR4为间接地为间接地址,将址,将AR4AR4中的内容作为地址,然后将该地址的内容装中的内容作为地址,然后将该地址的内容装入到指定的累加器入到指定的累加器A A常数常数v二进制常数(如二进制常数(如01B或或01b))v八进制常数(如八进制常数(如10Q或或10q))v十进制常数(如十进制常数(如23))v十六进制常数(如十六进制常数(如78H或或78h))v字符常数(如字符常数(如‘A’或或‘b’))v字符串(如字符串(如“sample program”))符号符号n符号用于作标号、常数和替代符号。
符号名可符号用于作标号、常数和替代符号符号名可长达长达200200个字符,可由个字符,可由A-ZA-Z、、a-za-z、、0-90-9、、$ $、、_ _组组成,且第一个字符不能是数字,符号对大小写成,且第一个字符不能是数字,符号对大小写敏感符号仅在定义它的汇编程序中有效,除敏感符号仅在定义它的汇编程序中有效,除非用非用.global.global或或.def.def伪指令声明为外部符号伪指令声明为外部符号n例例: :n K .set 1024 K .set 1024 表达式表达式v表表达达式式是是一一个个常常数数、、符符号号、、或或用用算算术术运运算算符符连连接接起起来来的的常常数数或或符符号号表表达达式式的的值的范围为值的范围为-32768到到32767v例:例:v X .set 50hv sym1 .set 100h+X可以用在表达式中的运算符可以用在表达式中的运算符优先级优先级符号符号含义含义()()+、、-、、~、!、!*、、/、、%+、、-<<、、>><、、<=、、>、、>==[=]、、!=&^|括弧内的表达式最先计算括弧内的表达式最先计算一元加、减、反码、逻辑非一元加、减、反码、逻辑非乘、除、模运算乘、除、模运算加、减加、减左移、右移左移、右移小于、小于等于、大于、大于等于小于、小于等于、大于、大于等于等于、不等于等于、不等于按位与按位与按位异或按位异或按位或按位或123456789注释区注释区n注释区可以从任何一列开始,可能包含注释区可以从任何一列开始,可能包含ASCIIASCII字符和空格。
注释打印在列表文件中,但不影字符和空格注释打印在列表文件中,但不影响汇编工作响汇编工作TMS320C54x的寻址方式的寻址方式 n立即寻址:指令中有一个固定的立即数;立即寻址:指令中有一个固定的立即数;n绝对地址寻址:指令中有一个固定的地址(绝对地址寻址:指令中有一个固定的地址(16位);位);n累加器寻址:按累加器的内容作为地址去访问程序存累加器寻址:按累加器的内容作为地址去访问程序存储器中的一个单元;储器中的一个单元;n直接寻址:指令编码中含有的直接寻址:指令编码中含有的7位地址与位地址与DP或或SP一一起合成数据存储器中操作数的实际地址;起合成数据存储器中操作数的实际地址;n间接寻址:通过辅助寄存器寻址;间接寻址:通过辅助寄存器寻址;n存储器映射寄存器寻址:修改存储器映射寄存器中的存储器映射寄存器寻址:修改存储器映射寄存器中的值,而不影响当前数据页面指针值,而不影响当前数据页面指针DP和当前堆栈指针和当前堆栈指针SP的值;的值;n堆栈寻址:把数据压入或弹出系统堆栈堆栈寻址:把数据压入或弹出系统堆栈符号符号含含 义义SmemSmem1616位单寻址操作数位单寻址操作数XmemXmem1616位的双寻址操作数,从位的双寻址操作数,从DBDB总线读出总线读出YmemYmem1616位的双寻址操作数,从位的双寻址操作数,从CBCB总线读出总线读出dmaddmad1616位立即数,数据存储器的地址位立即数,数据存储器的地址pmadpmad1616位立即数,程序存储器的地址位立即数,程序存储器的地址PAPA1616位立即数,位立即数,I/OI/O的地址的地址srcsrc源源累加器累加器dstdst目的累加器目的累加器lklk1616位的长立即数位的长立即数寻址指令中用到的缩写符号及其含义寻址指令中用到的缩写符号及其含义立即寻址立即寻址v短立即数寻址(单字指令)短立即数寻址(单字指令)在指令字中包括立即操作数在指令字中包括立即操作数 RPT #99 ;;将下一条指令循环将下一条指令循环100次次LD #0h,,DP ;;将将0装入数据页指针装入数据页指针ADD #0ffh,,A ;;将将0ffh加给加给AccA立即寻址立即寻址立即寻址立即寻址v长立即数寻址长立即数寻址指令字的后一个字是立即数(双字指令字的后一个字是立即数(双字指令)指令)ADD #1234h,,A ;;将将#1234h加给加给 AccA立即寻址立即寻址绝对地址寻址绝对地址寻址v数据存储器地址(数据存储器地址(dmad))寻址:寻址: 用一个符号或一个数来确定数据空间中的一个地址用一个符号或一个数来确定数据空间中的一个地址例:例:MVKD sample,,*AR5 ;sample所代表的就是一个所代表的就是一个dmadMVKD 1000h,,*AR5;将数据存储器将数据存储器1000h单元的数据传送到由单元的数据传送到由AR5所指的所指的存储单元中存储单元中 。
1000h代表的是一个代表的是一个dmad绝对地址寻址绝对地址寻址v程序存储器地址(程序存储器地址(pmad))寻址寻址:: 用一个符号或一个数来确定程序地址空间用一个符号或一个数来确定程序地址空间中的一个地址中的一个地址例:例:MVPD table,,*AR5 table 所代表的就是一个所代表的就是一个pmad绝对地址寻址绝对地址寻址v端口地址端口地址(PA)寻址寻址用一个符号或常数来确定用一个符号或常数来确定I/O口地址口地址 PORTR PA, Smem ;从;从PA单元端口读入一单元端口读入一 个数据,传送到个数据,传送到Smem所指的数据单元中去所指的数据单元中去 PORTW Smem, PA ;从;从Smem所指的数据单所指的数据单 元取出一个数据,传送到元取出一个数据,传送到PA单元端口单元端口PORTR FIFO, *AR5 ;把一个数从端口为;把一个数从端口为FIFO的的I/O口传送到口传送到AR5所指向的数据单元所指向的数据单元绝对地址寻址绝对地址寻址v*(lk)寻址寻址 用一个符号或一个表示用一个符号或一个表示16位地址的长立即位地址的长立即数来确定数据存储器中的一个地址数来确定数据存储器中的一个地址例:例: LD *((BUFFER),),A ;把地址为;把地址为BUFFER的数据单元中的数据装到的数据单元中的数据装到AccA中中 累加器寻址累加器寻址用累加器中的数作为一个地址,可用来对存放用累加器中的数作为一个地址,可用来对存放数据的程序存储器寻址:数据的程序存储器寻址:READA SmemWRITA SmemvREADA,,把累加器把累加器A所确定的程序存储器单元所确定的程序存储器单元中的一个字,传送到数据存储器单元中的一个字,传送到数据存储器单元Smem中。
中vWRITA,,把数据单元把数据单元Smem中的一个字,传送中的一个字,传送到累加器到累加器A确定的程序存储器单元确定的程序存储器单元直接寻址直接寻址vTMS320C54的数据存储器分为的数据存储器分为512页,每页页,每页128字设置一个数据页指针字设置一个数据页指针DP((Data Pointer),用),用9-bit指向一个数据页,再加上一指向一个数据页,再加上一个个7-bit的页内偏移地址,形成的页内偏移地址,形成16-bit的数据地的数据地址址LD #4,,DP ;;指向页指向页4((0200h-027Fh))ADD 9h,,A ;;将数据页将数据页4中地址中地址9h的的 数据加给数据加给AccA直接寻址直接寻址间接寻址间接寻址v8个个辅辅助助寄寄存存器器((AR0--AR7)),,由由一一个个辅助寄存器指针(辅助寄存器指针(ARP 3-bit))来指定来指定v辅助寄存器算术单元(辅助寄存器算术单元(ARAU))作作16-bit无符号数运算,决定一个新的地址,装入无符号数运算,决定一个新的地址,装入辅助寄存器中的一个辅助寄存器中的一个间接寻址间接寻址间接寻址间接寻址vAR0--AR7的的内内容容相相当当灵灵活活,,可可以以装装入入立立即即数数,,加加上上立立即即数数,,减减去去立立即即数数;;也也可可以以从从数数据据存存储储器装入地址;还可以作以下的变址寻址:器装入地址;还可以作以下的变址寻址:间接寻址间接寻址v将将该该AR的的内内容容加加1或或减减1,,再再寻寻址(循环常用)址(循环常用)v将将该该AR的的内内容容加加上上或或减减去去AR0的的内容,再寻址。
内容,再寻址v将该将该AR的内容逆向进位加上或减去的内容逆向进位加上或减去AR0的内容,再寻址的内容,再寻址间接寻址间接寻址 ADD *,,8,,A ;;将当前辅助寄存器所指将当前辅助寄存器所指的地址里的数据,左移的地址里的数据,左移8-bit后加给后加给AccAADD *+,,8,,A,,AR4 ;;数据左移加给数据左移加给AccA后,当前辅助寄存器加后,当前辅助寄存器加1,选择辅助寄,选择辅助寄存器存器AR4 ADD *+,,8,,A ;;将当前辅助寄存器所将当前辅助寄存器所指的地址里的数据,左移指的地址里的数据,左移8-bit后加给后加给AccA,当前辅助寄存器加当前辅助寄存器加1.间接寻址间接寻址 ADD *0+,,8,,A ;;执行加法执行加法后,将后,将AR0的值加给当前辅助的值加给当前辅助寄存器寄存器ADD *BR0+,,8,,A ;;执行加法后,执行加法后,将将AR0的值加给当前辅助寄存器,但的值加给当前辅助寄存器,但反向进位反向进位正向进位与反向进位正向进位与反向进位 1 0 0 1 0 0 + 1 0 0 + 1 0 0 ———— ———— 1 0 0 0 0 1 0位倒序寻址位倒序寻址AR0 = 100AR1 = 000按按AR1寻址后,将寻址后,将AR0加给加给AR1,,反向进位反向进位位倒序寻址位倒序寻址原序原序 原地址原地址 位倒序后地址位倒序后地址 位倒位倒序序0 000 000 01 001 100 42 010 010 23 011 110 6 4 100 001 1 5 101 101 56 110 011 37 111 111 7存储器映射寄存器存储器映射寄存器(MMR)寻址寻址v存储器映射寄存器寻址用来修改存储器存储器映射寄存器寻址用来修改存储器映射寄存器。
存储器映射寄存器寻址既映射寄存器存储器映射寄存器寻址既可以在直接寻址中使用,又可以在间接可以在直接寻址中使用,又可以在间接寻址中使用寻址中使用vSTM #8888h,T ;存储器映射寄存器寻址存储器映射寄存器寻址T暂存器 LDM MMRLDM MMRLDM MMRLDM MMR,,,,dstdstdstdst ; ; ; ;将将将将MMRMMRMMRMMR加载到累加器加载到累加器加载到累加器加载到累加器 MVDM MVDM MVDM MVDM dmaddmaddmaddmad,,,,MMRMMRMMRMMR ; ; ; ;数据存储器向数据存储器向数据存储器向数据存储器向MMRMMRMMRMMR传送数据传送数据传送数据传送数据 MVMD MMRMVMD MMRMVMD MMRMVMD MMR,,,,dmaddmaddmaddmad ; ; ; ;MMRMMRMMRMMR向指定地址传送数据向指定地址传送数据向指定地址传送数据向指定地址传送数据 MVMM MVMM MVMM MVMM MMRxMMRxMMRxMMRx,,,,MMRyMMRyMMRyMMRy ; ; ; ;MMRxMMRxMMRxMMRx向向向向MMRyMMRyMMRyMMRy传送数据传送数据传送数据传送数据 POPM MMRPOPM MMRPOPM MMRPOPM MMR ; ; ; ;将数据从栈顶弹至将数据从栈顶弹至将数据从栈顶弹至将数据从栈顶弹至MMRMMRMMRMMR PSHM MMRPSHM MMRPSHM MMRPSHM MMR ; ; ; ;将将将将MMRMMRMMRMMR数据压入堆栈数据压入堆栈数据压入堆栈数据压入堆栈 STLM STLM STLM STLM srcsrcsrcsrc,,,,MMRMMRMMRMMR ; ; ; ;累加器低位存入累加器低位存入累加器低位存入累加器低位存入MMRMMRMMRMMR STM #STM #STM #STM #lklklklk,,,,MMRMMRMMRMMR ; ; ; ;长立即数长立即数长立即数长立即数lklklklk存入存入存入存入MMRMMRMMRMMRnC54x共有共有8条指令可以进行条指令可以进行MMR寻址。
寻址存储器映射寄存器存储器映射寄存器(MMR)寻址寻址堆栈寻址堆栈寻址 系统堆栈用来在中断和子程序期间自动存放程序计系统堆栈用来在中断和子程序期间自动存放程序计数器它也能用来存放额外的数据项或传递数据值它也能用来存放额外的数据项或传递数据值处理器使用一个处理器使用一个16-bit的存储器映射寄存器的存储器映射寄存器——堆栈指针堆栈指针((SPSP)来对堆栈寻址,它总是指向存放在堆栈中的最)来对堆栈寻址,它总是指向存放在堆栈中的最后一个元素在压入堆栈操作时,后一个元素在压入堆栈操作时,SPSP先减先减1 1,然后将数,然后将数据压入堆栈;在弹出堆栈操作时,数据从堆栈中弹出据压入堆栈;在弹出堆栈操作时,数据从堆栈中弹出后,后,SPSP再加再加1.1. PUSH ; PUSH ;把一个数据存储器数据压入堆栈把一个数据存储器数据压入堆栈 POP ;POP ;从堆栈中弹出一个数据至数据存从堆栈中弹出一个数据至数据存 储器单元储器单元堆栈寻址堆栈寻址 ’’’’C54xC54xC54xC54x的的的的堆堆堆堆栈栈栈栈是是是是向向向向低低低低地地地地址址址址生生生生长长长长,,,,并并并并由由由由16161616位位位位堆栈指针堆栈指针堆栈指针堆栈指针SPSPSPSP管理。
管理SPSPSPSP总是指向栈顶总是指向栈顶总是指向栈顶总是指向栈顶 堆栈寻址:堆栈寻址:堆栈寻址:堆栈寻址:利用利用利用利用SPSPSPSP指针,按照先进后出的原则进指针,按照先进后出的原则进指针,按照先进后出的原则进指针,按照先进后出的原则进 行行行行寻址 当进栈操作时,当进栈操作时,SPSP先减先减1,然后数据进入堆栈;,然后数据进入堆栈; 当出当出栈操作操作时,数据先出,数据先出栈,然后,然后SPSP加加1 00010010001101000101011000010010001101000101011000110011spsp操作前的堆栈和操作前的堆栈和SPSP00100010spsp操作后的堆栈和操作后的堆栈和SPSPX1X1X2图、堆栈操作对堆栈指针的影响图、堆栈操作对堆栈指针的影响堆栈寻址堆栈寻址 采用堆栈寻址的指令:采用堆栈寻址的指令:采用堆栈寻址的指令:采用堆栈寻址的指令: PSHD PSHD PSHD PSHD SmemSmemSmemSmem ; ; ; ;将将将将SmemSmemSmemSmem中的数据压入堆栈中的数据压入堆栈中的数据压入堆栈中的数据压入堆栈 PSHM MMRPSHM MMRPSHM MMRPSHM MMR ; ; ; ;将将将将MMRMMRMMRMMR中的数据压入堆栈中的数据压入堆栈中的数据压入堆栈中的数据压入堆栈 POPD POPD POPD POPD SmemSmemSmemSmem ; ; ; ;将数据从栈顶弹至将数据从栈顶弹至将数据从栈顶弹至将数据从栈顶弹至SmemSmemSmemSmem中中中中 POPM MMRPOPM MMRPOPM MMRPOPM MMR ; ; ; ;将数据从栈顶弹至将数据从栈顶弹至将数据从栈顶弹至将数据从栈顶弹至MMRMMRMMRMMR中中中中指令指令TMS320C54x的指令集有近两百条指令,按功能的指令集有近两百条指令,按功能分为如下几类分为如下几类:v算术运算指令算术运算指令v逻辑运算指令逻辑运算指令v程序控制指令程序控制指令v装入和存储指令装入和存储指令算术运算指令算术运算指令 加法指令加法指令 减法指令减法指令 乘法指令乘法指令 乘加指令乘加指令 乘减指令乘减指令 双数双数/ /双精度指令双精度指令 特殊操作指令特殊操作指令加法指令加法指令ADD *AR3+, AADD *AR3+,14,An将将AR3指向的地址单元指向的地址单元0100h的内容的内容1500h左移左移14位,位,得到得到5400000h加上加上1200h,将结果,将结果5401200h存在累存在累加器加器A中。
中ADDC *+AR2(5),,An将将AR2加上加上5后指向的地址单元内容,并进位后指向的地址单元内容,并进位加到累加器加到累加器A中,此指令计算中,此指令计算0013h++0004h++1h==0018hADDM 0123Bh,,*AR4+减法指令减法指令乘法指令乘法指令MPY 13, A乘加和乘减指令乘加和乘减指令MAC *AR5+,,AMAC #345h,,A,,BnB=A+T*#345hMAC *AR5+,,*AR6+,,A,,B B=A+(*AR5)*(*AR6) T=(*AR5)MACR *AR5+,,A A=rnd(A+T*(*AR5))MACR *AR5+,,*AR6+,,A,,B B=rnd(A+((*AR5)*(*AR6))) T=(*AR5)MACA *AR5+ B=B+(*AR5)*A(31~16) T=(*AR5) AR5=AR5+1MAC X0,Y0,A X:(R0)+,X0 Y:(R4)+N4,Y0这条指令命令这条指令命令DSP56300l将寄存器将寄存器X0和和Y0中的数相乘中的数相乘l结果加到结果加到Acc A中中l将将寄寄存存器器R0所所指指的的X存存储储器器地地址址中中的值装入寄存器的值装入寄存器X0l将将寄寄存存器器R4所所指指的的Y存存储储器器地地址址中中的值装入寄存器的值装入寄存器Y0lR0的值加的值加1l寄存器寄存器N4的值加给的值加给R4.bss x, 4, 1a0.word 012ha1.word 3211ha2.word fe11ha3.word ff03h.sect “program”LD #x, AR1LD #0, A,,AR1LD #a0, T MAC *+,,ALD #a1,,TMAC *+,,ALD #a2,,TMAC *+,,A LD #a3,,TMAC *,,A逻辑运算指令逻辑运算指令AND *AR3+,,A A=A&(*AR3) AR3=AR3+1ANDM #00FFh,,*AR4+n(*AR4)=(*AR4)&(#00FF)nAR4=AR4+1移位指令移位指令ROL AROLTC AROR ASFTA B,, +5n累加器算术移位累加器算术移位SFTA A,, –5,, BnSHIFT<0,指令执行算术右移;指令执行算术右移;nSXM=1,移出的高位用符号位填。
移出的高位用符号位填 SFTC ASFTL A,, –5,, Bn逻辑右移,高位补逻辑右移,高位补0.测试指令测试指令BIT *AR5+,,15-12 指令中的(指令中的(15--12)表示测试第)表示测试第12位位 TC=(*AR5)(15-12) AR5=AR5+1BITF 5,,#00FFhn测试测试Smem中指定的某些位,中指定的某些位,lk常数在测试一位或多常数在测试一位或多位时起屏蔽作用假如指定的一位或多位为位时起屏蔽作用假如指定的一位或多位为0,状态寄,状态寄存器存器ST0的的TC位清位清0,否则该位置,否则该位置1BITT *AR7++0CMPM *AR4+,,0404hn比较比较16位单数据存储器操作数位单数据存储器操作数Smem和和16位常数位常数lk是是否相等若相等,否相等若相等,ST0寄存器的寄存器的TC位置位置1,否则该位清,否则该位清0CMPR 2,,AR4n 测试测试AR4是否大于是否大于AR0程序控制指令程序控制指令v分支指令分支指令 v调用指令调用指令v中断指令中断指令v返回指令返回指令v循环指令循环指令v堆栈操作指令堆栈操作指令v混合程序控制指令混合程序控制指令转移指令转移指令BD 1000hn程序指针指向指定的程序存储器地址(程序指针指向指定的程序存储器地址(pmad),该地),该地址可以是符号或一个数字。
如果是延迟转移(指令带址可以是符号或一个数字如果是延迟转移(指令带有后缀有后缀D),紧接着该指令的两条单字指令或一条双字),紧接着该指令的两条单字指令或一条双字指令从程序存储器中取出先执行指令从程序存储器中取出先执行BACC An程序指针指向程序指针指向src的低的低16位所确定的地址如果是延迟位所确定的地址如果是延迟转移(指令带有后缀转移(指令带有后缀D),紧跟着该指令的两条单字或),紧跟着该指令的两条单字或一条双字指令从程序存储器中取出先执行一条双字指令从程序存储器中取出先执行BANZ 2000h,,*AR3–指令的条件代码所对应的条件指令的条件代码所对应的条件 条件条件 说明说明 条件条件 说明说明 AEQ A=0 ANEQ A≠0 ALT A<0 AGT A>0 ALEQ A≤0 AGEQ A≥0 AOV AOV=0 ANOV AOV=1 C C=1 NC C=0 TC TC=1 NTC TC=0BC 2000h,,AGTFB 012000hFBACC A调用指令调用指令CALA An程序指针转移到程序指针转移到src的低位所确定的地址单元,返回地的低位所确定的地址单元,返回地址压入栈顶。
如果是延迟调用,紧接着该指令的两条址压入栈顶如果是延迟调用,紧接着该指令的两条单字指令或一条双字指令从程序存储器中取出来先执单字指令或一条双字指令从程序存储器中取出来先执行CALLD 1000hCC 2222h,,AGTFCALA A中断指令中断指令INTR 3TRAP l0h返回指令返回指令FRETFRETERC ANOVRETRETE循环指令循环指令RPT 127n该指令实现对下一条指令的自动循环执行在循环执该指令实现对下一条指令的自动循环执行在循环执行期间,所有外部的中断都不会响应,如果有较长时行期间,所有外部的中断都不会响应,如果有较长时间的循环,一定保证循环期间没有中断产生间的循环,一定保证循环期间没有中断产生ST #99,,BRC;执行循环块;执行循环块100次次RPTB end_block–1n循环执行一段指令块,循环的次数由存储器映射的块循环执行一段指令块,循环的次数由存储器映射的块循环计数器(循环计数器(BRC)确定BRC的值必须在指令执行的值必须在指令执行之前设置程序执行时,块循环起始地址寄存器之前设置。
程序执行时,块循环起始地址寄存器((RSA)中装入程序指针)中装入程序指针PC+2(如果是采用了延迟就(如果是采用了延迟就是是PC+4);块循环尾地址寄存器();块循环尾地址寄存器(REA)中装入程序)中装入程序存储器地址(存储器地址(pmad)RPTZ A,,#1023n对目的累加器对目的累加器dst清清0,并且循环执行下一条指,并且循环执行下一条指令令n+1次堆栈操作指令堆栈操作指令FRAME 10hn把一个短立即数把一个短立即数K加到堆栈指针加到堆栈指针SP中POPD 10n把由堆栈指针把由堆栈指针SP寻址的数据存储器单元的内容转移到寻址的数据存储器单元的内容转移到由由Smem确定的数据存储器单元中,然后堆栈指针确定的数据存储器单元中,然后堆栈指针SP执行加执行加1操作POPM AR5n把由堆栈指针把由堆栈指针SP寻址的数据存储器单元的内容转移到寻址的数据存储器单元的内容转移到指定的存储器映射寄存器指定的存储器映射寄存器MMR中,然后堆栈指针中,然后堆栈指针SP执执行加行加1操作PSHD *AR3+nSP减减1后将数据压入堆栈后将数据压入堆栈PSHM BRCnBRC:存储器映射的块循环计数器。
存储器映射的块循环计数器nSP减减1后,将后,将MMR压入堆栈压入堆栈程序控制指令程序控制指令IDLE Kn1≤K≤3,执行,执行(PC)+1 PCn状态位受状态位受INTM位的影响位的影响n强迫程序执行等待操作直至不可屏蔽中断产生或复位强迫程序执行等待操作直至不可屏蔽中断产生或复位中断产生芯片保持空闲状态(低功耗方式)不论中断产生芯片保持空闲状态(低功耗方式)不论INTM如何设置,只要有一个不可屏蔽中断出现,系统如何设置,只要有一个不可屏蔽中断出现,系统就退出空闲状态,如果就退出空闲状态,如果INTM=1,程序继续执行紧接着,程序继续执行紧接着IDLE的指令,不会响应中断;如果的指令,不会响应中断;如果INTM=0,程序转0,程序转移到相应的中断服务程序移到相应的中断服务程序IDLE KnK的值决定了可以使芯片从空闲状态中激活的中断类型:的值决定了可以使芯片从空闲状态中激活的中断类型:nK=1定时器和串口等外围设备在空闲状态时仍有效,定时器和串口等外围设备在空闲状态时仍有效,此时定时器和串口仍然有输出时钟信号外围中断和此时定时器和串口仍然有输出时钟信号外围中断和复位以及外部中断可以激活芯片。
复位以及外部中断可以激活芯片nK=2定时器和串口中等外围设备在空闲状态时无效,定时器和串口中等外围设备在空闲状态时无效,此时定时器和串口没有输出时钟信号复位和外部中此时定时器和串口没有输出时钟信号复位和外部中断可以激活芯片断可以激活芯片nK=3定时器和串口等外围设备在空闲状态时无效,锁定时器和串口等外围设备在空闲状态时无效,锁相环相环PLL被禁止,此时芯片将彻底进入空闲状态被禁止,此时芯片将彻底进入空闲状态MAR *AR3+n修改由修改由Smem所确定的辅助寄存器的内容在兼容方所确定的辅助寄存器的内容在兼容方式下式下(CMPT=1),并且,并且ARx≠AR0,指令会修改,指令会修改ARx的内的内容以及辅助寄存器指针(容以及辅助寄存器指针(ARP)的值;在非兼容方式)的值;在非兼容方式下下(CMPT=0),指令只修改辅助寄存器的值,而不改变,指令只修改辅助寄存器的值,而不改变ARPNOPn执行执行PC+1 PCn该指令除了程序指针执行加1操作以外不执行任何操该指令除了程序指针执行加1操作以外不执行任何操作这在建立流水和执行延迟方面比较有用这在建立流水和执行延迟方面比较有用STLM A,AR1LD *AR1,BSTLM A,AR1NOPNOPLD *AR1,BRESETn非屏幕的软件复位。
非屏幕的软件复位n该指令不受该指令不受INTM的影响,但它对的影响,但它对INTM置位以置位以禁止中断禁止中断RSBX SXMRSBX 1,,8n对状态寄存器对状态寄存器ST0和和ST1的特定位清的特定位清0N指明了被修指明了被修改的状态寄存器(改的状态寄存器(N==0表示修改表示修改ST0寄存器,寄存器,N==1表表示修改示修改ST1寄存器),寄存器),SBIT确定被修改的位可直接确定被修改的位可直接用状态寄存器中的一个特定位的名称作为操作数,这用状态寄存器中的一个特定位的名称作为操作数,这样就不需要使用样就不需要使用N和和SBITSSBX SXMSSBX 1,,8n对状态寄存器对状态寄存器ST0和和ST1的特定位置的特定位置1XC 1,,ALEQMAR *AR1+n该指令的运行情况由该指令的运行情况由n和所选择的条件决定如果和所选择的条件决定如果n==1并且满足条件,就执行该指令的下一条单字指令;如并且满足条件,就执行该指令的下一条单字指令;如果果n==2并且满足条件,就执行该指令的下两条单字指并且满足条件,就执行该指令的下两条单字指令或者一条双字指令;如果不满足条件,执行令或者一条双字指令;如果不满足条件,执行n次次nop操作。
操作装入和存储指令装入和存储指令v一般的装入和存储指令一般的装入和存储指令v条件存储指令条件存储指令v并行装入和存储指令并行装入和存储指令v并行装入和乘法指令并行装入和乘法指令v并行存储和加减乘指令并行存储和加减乘指令v混合装入和存储指令混合装入和存储指令一般的装入指令一般的装入指令DLD *AR3+,,Bn把一个把一个32位的长操作数位的长操作数Lmem装入目的累加器装入目的累加器dst中LD *AR4,,DPn把一个数据存储器的值或一个短立即数装入把一个数据存储器的值或一个短立即数装入T寄存器或寄存器或状态寄存器中的状态寄存器中的DP、、ASM和和ARP位LDM AR4,,An把存储器映射寄存器把存储器映射寄存器MMR中的值装入到目的累加器的中的值装入到目的累加器的低位字中,累加器的高位字和保护位清低位字中,累加器的高位字和保护位清0 不论DP的的当前内容或当前内容或ARx的高的高9位是多少,有效地址的高位是多少,有效地址的高9位清位清0,将数据页指针设置为,将数据页指针设置为0LDR *AR1,,An把单数据存储器操作数把单数据存储器操作数Smem左移左移16位后装入目的累位后装入目的累加器加器DST的高端的高端(位位31~~16)。
Smem通过对累加器的通过对累加器的位位14~~0清清0进行四舍五入运算,累加器的第进行四舍五入运算,累加器的第15位设置位设置为为1LDU *AR1,,An把单数据存储器把单数据存储器Smem的值装入目的累加器的值装入目的累加器dst的低端的低端(位(位15~~0),),dst的保护位和高端的保护位和高端(位位39~~16)清清0因此,数据被看成是一个无符号的因此,数据被看成是一个无符号的16位数,不管位数,不管SXM位的状态如何都不进行符号扩展位的状态如何都不进行符号扩展存贮指令存贮指令DST B,,*AR3+n把源累加器的内容存放在一个把源累加器的内容存放在一个32位的长数据储存器单位的长数据储存器单元中元中Lmem中ST TRN,,5ST T,,*AR7–ST #FFFFh,,0STH A,,10n把源累加器把源累加器src的高端(位的高端(位31~~16)存放到数据存储器)存放到数据存储器单元单元Smem中中.STH B,,–8,,*AR7–n把源累加器移位后位把源累加器移位后位31~~16存放到数据存储器单元存放到数据存储器单元((Smem或或Xmem)中。
中STLM A,,BRCn把源累加器把源累加器src的低端的低端(位位15~~0)存放到存储器存放到存储器映射寄存器映射寄存器MMR中无论DP的当前值或的当前值或ARx的高的高9位是多少,有效地址的高位是多少,有效地址的高9位清位清0并行装入和乘法指令并行装入和乘法指令LD *AR4+,16,A||MAC *AR5+,,Bn16位双数据存储器操作数位双数据存储器操作数Xmem左移左移16位后装入目的位后装入目的累加器的高端同时并行执行一个双数据操作数累加器的高端同时并行执行一个双数据操作数Ymem与与T寄存器的值相乘再把乘积加到寄存器的值相乘再把乘积加到dst_中的操作中的操作LD *AR4+,16,A||MACR *AR5+,,Bn指令带有指令带有R后缀,则对乘积和累加器操作的结果进行四后缀,则对乘积和累加器操作的结果进行四舍五入,再存在舍五入,再存在dst中四舍五入的方法是:给该值加中四舍五入的方法是:给该值加上上215,然后将结果的低端,然后将结果的低端(位位15~~0)清清0混合装入和存储指令混合装入和存储指令MVDD *AR3+,,*AR5+n将将Xmem寻址的数据存储器单元的内容复制到寻址的数据存储器单元的内容复制到Ymem寻址的数据存储器单元中。
寻址的数据存储器单元中伪指令(伪指令(Assembler Directives))伪伪指指令令为为程程序序提提供供数数据据、、控控制制汇汇编编过过程程所所作的工作包括:作的工作包括:l将代码和数据汇编到指定的位置将代码和数据汇编到指定的位置l在存储器中为未初始化的变量保留存储空间在存储器中为未初始化的变量保留存储空间l控制列表的方式控制列表的方式l初始化存储器初始化存储器l汇编条件块汇编条件块l定义全局变量定义全局变量l为汇编器指定可以获得宏的库为汇编器指定可以获得宏的库l检查符号调试信息检查符号调试信息段定义伪指令段定义伪指令v.bss 在该段中保留若干字在该段中保留若干字v.data 汇编入已初始化的数据段汇编入已初始化的数据段v.sect “section name” 汇汇编编入入已已命命名名的段的段v.text 汇编入可执行的代码段汇编入可执行的代码段初始化常数伪指令初始化常数伪指令v.float 初始化一个初始化一个32-bit的浮点常数的浮点常数v.int 初初始始化化一一个个或或多多个个16-bit的的无无符符号号整整数数v.string 初始化一个或多个字符串初始化一个或多个字符串v.word 初初始始化化一一个个或或多多个个16-bit的的带带符符号号整整数数格式化输出列表的伪指令格式化输出列表的伪指令v.list 开始源文件列表开始源文件列表v.nolist 停止源文件列表停止源文件列表v.length 设置源文件列表的页长度设置源文件列表的页长度v.title 在在列列表表文文件件每每一一页页打打印印文文件件名名引用其他文件的伪指令引用其他文件的伪指令v.copy /.include 包含其他文件的源语句包含其他文件的源语句v.global 确认一个或多个全局确认一个或多个全局(外部外部)符符号号v.mlib 定义宏库定义宏库条件汇编伪指令条件汇编伪指令v.if/.else/.endif 条件汇编条件汇编代码块代码块v.loop/.endloop 循环汇编代码块循环汇编代码块v.break 终止循环汇编代码块终止循环汇编代码块汇编时的符号汇编时的符号v.equ/.set 使一个符号等于一个使一个符号等于一个值值v.end 结束程序结束程序宏语言宏语言vMacro: A user-defined routine that can be used as an instructionv汇汇编编器器支支持持宏宏语语言言,,使使用用户户可可以以建建立立自自己己的的“指指令令”。
当当程程序序要要将将特特定定的的任任务务执执行行若若干干次次时时,,尤其有用尤其有用宏语言可以使用户:宏语言可以使用户:l定义自己的宏,或重新定义正执行的宏定义自己的宏,或重新定义正执行的宏l简化长的或复杂的汇编代码简化长的或复杂的汇编代码l访问由归档器建立的宏库访问由归档器建立的宏库l在一个宏内定义条件块和可重复的块在一个宏内定义条件块和可重复的块l在一个宏内操作字符串在一个宏内操作字符串l 控制展开列表控制展开列表定义宏定义宏 在在程程序序中中使使用用宏宏之之前前,,首首先先必必须须定定义义它它可以用两种方法来定义:可以用两种方法来定义:((1))在在源源文文件件或或.include/.copy文文件件中中定义定义((2)在宏库中定义)在宏库中定义定义宏定义宏macname .macro [parameter] model statements [.mexit] .endm定义宏定义宏vmacname 宏的名字宏的名字v.macro 是一个伪指令,确认源语句为是一个伪指令,确认源语句为宏定义的第一行宏定义的第一行v[parameters] 选项,作为选项,作为.macro伪指令伪指令的操作数的操作数vModel statements 每次调用宏时执行的每次调用宏时执行的指令或伪指令指令或伪指令v.endm 终止宏定义终止宏定义定义宏举例定义宏举例* add3 p1, p2, p3* p3 = p1 + p2 + p3 add3 .macro p1, p2, p3 ld p1,,a add p2,,a add p3,,a stl a,,p3 .endm调用宏调用宏在在源源程程序序中中用用宏宏的的名名字字作作为为操操作作码码来来调用宏调用宏 add3 x, y, zTMS320C54x程序简例程序简例v一个一个16位的二进制数既可以表示一个整数,也位的二进制数既可以表示一个整数,也可以表示一个小数。
可以表示一个小数v当它表示一个整数时,其最低位(当它表示一个整数时,其最低位(D0))表示表示20,,D1位表示位表示21,次高位(,次高位(D14))表示表示214v如果表示一个有符号数时,最高位(如果表示一个有符号数时,最高位(D15))为为符号位,符号位,0表示正数,表示正数,1表示负数表示负数v例如,例如,07FFFH表示最大的正数表示最大的正数32767(十进制)(十进制),而,而0FFFFH表示最大的负数表示最大的负数-1(负数用二进制(负数用二进制的补码方式显示)的补码方式显示)TMS320C54x程序简例程序简例v当需要表示小数时,小数点的位置始终在最高当需要表示小数时,小数点的位置始终在最高位后,最高位(位后,最高位(D15))表示符号位表示符号位v次高位(次高位(D14))表示表示2-1,然后是,然后是2-2,最低位,最低位((D0))表示表示2-15v 04000H表示小数表示小数0.5,,01000H是小数是小数2-3 = 0.125,,0001H则表示则表示16位定点位定点DSP能表示的最小能表示的最小的小数(有符号)的小数(有符号) 2-15 = 0.000030517578125。
TMS320C54x程序简例程序简例v在在DSP中中,,一一个个16进进制制的的数数可可以以表表示示不不同同的的十十进进制制数数,,或或者者是是整整数数,,或或者者是是小小数数((如如果果表表示示小小数数,,必必定定小小于于1)),,但但仅仅仅仅是是在在做做整整数数乘乘除除或或小小数数乘乘除除时时,,系系统统对对它它们们的的处处理理才才是是有有所所区区别别的,而在加减运算时,系统都当成整数来处理的,而在加减运算时,系统都当成整数来处理v在在后后面面的的例例子子中中,,除除非非有有特特别别说说明明,,我我们们指指的的都都是是有有符符号号数数在在C54X中中,,将将一一个个小小数数用用16位位定定点点格格式式来来表表示示的的方方法法是是用用215乘乘以以该该小小数数,,然然后后取取整定点加法定点加法 temp3=temp1+temp2 ld temp1,a;;变量变量temp1装入累加器装入累加器Aadd temp2,a ;;变量变量temp2与累加器与累加器A相相 加,结果放入加,结果放入A中中stl a,temp3;;结果(低结果(低16位)存入变位)存入变 量量temp3中。
中v没有特意考虑没有特意考虑temp1和和temp2是整数还是是整数还是小数小数定点减法定点减法 stm #temp1,ar3;;变变量量temp1的的地地址址装装入入ar3寄存器寄存器stm #temp2,ar2;;变变量量temp2的的地地址址装装入入ar2寄存器寄存器sub *ar2, *ar3,b ;;变变量量temp2和和temp1都都左左移移16位位,,然然后后相相减减,,结结果果放放入入累累加加器器B中中((高高16位)位)sth b,temp3;;相相减减的的结结果果((累累加加器器B的的高高16位)存入变量位)存入变量temp3定点整数乘法定点整数乘法vC54X提供了大量的有符号数乘法运算指提供了大量的有符号数乘法运算指令,其结果都是令,其结果都是32位vMPYU是一条专用于无符号数乘法运算是一条专用于无符号数乘法运算的指令,而其它的乘法指令都是有符号数的指令,而其它的乘法指令都是有符号数的乘法的乘法定点整数乘法定点整数乘法rsbx FRCT ;清;清FRCT标志,准备整数乘标志,准备整数乘ld temp1,T;;变量变量temp1装入装入T寄存器寄存器mpy temp2,a;;temp2*temp1,,结果放入结果放入 累加器累加器A((32位)位)stha,temp3;;结果的高结果的高16位存入位存入temp3stla,temp4;;结果的低结果的低16位存入位存入temp4定点小数乘法定点小数乘法v由于两个有符号的小数相乘,其结果的由于两个有符号的小数相乘,其结果的小数点的位置在次高的后面,所以必须小数点的位置在次高的后面,所以必须左移一位,才能得到正确的结果。
左移一位,才能得到正确的结果C54X中提供了一个状态位中提供了一个状态位FRCT,,将其设置为将其设置为1时,系统自动将乘积结果左移移位时,系统自动将乘积结果左移移位定点小数乘法定点小数乘法ssbx FRCT;;FRCT=1,,准备小数乘法准备小数乘法ld temp1,16,a ;;temp1装入装入A的高的高16位位mpya temp2;;temp2乘乘A的高的高16位,结果位,结果 在在B中,同时将中,同时将temp2装入装入T寄存器寄存器sthb,temp3;;将乘积的高将乘积的高16位存位存temp3定点整数除法定点整数除法vC54X没有提供专门的除法指令,一般有没有提供专门的除法指令,一般有两种方法来完成除法两种方法来完成除法v使用乘法来代替,除以某个数相当于乘以使用乘法来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘其倒数,所以先求出其倒数,然后相乘这种方法对于除以常数特别适用这种方法对于除以常数特别适用v使用使用SUBC指令,重复指令,重复16次减法完成除法次减法完成除法运算C54程序举例程序举例n例例1:使用:使用C54X汇编语言编程计算汇编语言编程计算 z1=x1+y1;z2=x1-y1;z3=x1*y1;z4=x2*y2。
其其中,中,x1=20,,y1=54,,x2=0.5,,y2=-0.5837编写汇编源程序如下:编写汇编源程序如下: .title “suanshu.asm” .mmregs .bss x1,1 .bss x2,1 .bss y1,1 .bss y2,1 .bss z1,1 .bss z2,1 .bss z3_h,1 .bss z3_l,1 .bss z4,1 v1 .set 014h ;; v1 =20 v2 .set 036h ;; v2=54 v3 .set 04000h ;; v3=0.5 v4 .set 0b548h ;; v4=-0.5837 start: LD #x1,DP ST #v1,x1 ST #v2,y1 LD x1,A ;;x1 A ADD y1,A ;;A+Y1 A STL A,z1 ;保存;保存AL z1 LD x1,A SUB y1,A STL A,z2 RSBX FRCT ;准备整数乘法,;准备整数乘法,FRCT=0 LD X1,T MPY Y1,A ;; x1*y1 A STH A,z3_h ;乘法结果高;乘法结果高16位在位在z3_h 单单元元 STL A,z3_l ;乘法结果低;乘法结果低16位在位在z3_l单元单元 ST #v3,x2 ST #v4,y2 SSBX FRCT ;准备小数乘法,;准备小数乘法,FRCT=1 LD x2,16,A ; 将将x2加载到加载到AH MPYA y2 ;;x2*y2 B,and y2 T STH B,z4 ;结果放到;结果放到z4单元单元 例例2:对数组:对数组x[8]={0,1,2,3,4,5,6,7}进行初始化进行初始化n .bss x,8n .datanTable: .word 0,1,2,3,4,5,6,7n .textnStart: STM #x,AR5n RPT #7n MVPD table,*AR5+n …例例3:计算:计算 y =n .bss x,10n STM #x,AR1n STM #9,AR2n LD #0,AnLOOP: ADD *AR1+,An BANZ LOOP,*AR2-n 例例3:计算:计算 y =n .bss x,10n .bss y,1n STM #x,AR1n LD #0,An RPT #9 ; RPTZ A, #9 n ADD *AR1+,An STL A,y例例4:对数据:对数据x[8]中的每个元素加中的每个元素加1n .bss x,8nBegin: LD #1,16,Bn STM #7,BRCn STM #x,AR4n RPTB next-1n ADD *AR4,16,B,An STH A,*AR4+nnext: LD #0,Bn … 例例5:求解:求解 .其中数据均为小数,且其中数据均为小数,且a1=0.3 a2=0.2 a3= -0.4 a4=0.1x1=0.6 x2=0.5 x3=-0.1 x4=-0.2n .bss a,4n .bss x,4n .datantable: .word 3*32768/10n .word 2*32768/10n .word -4*32768/10n .word 1*32768/10n .word 6*32768/10n .word 5*32768/10n .word -1*32768/10n .word -2*32768/10n .textnStart: SSBX FRCTn STM #a,AR4n RPT #7n MVPD table,*AR4+n STM #x,AR5n STM #a,AR6n RPTZ A,#3n MAC *AR5+,*AR6+,A。












