DSP汇编语言程序设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第4章DSP汇编语言程序设计4.1TMS320C54x汇编语言的基本概念4.2TMS320C54x汇编语言程序设计的基本方法4.3TMS320C54x汇编语言程序的编辑、汇编与链接过程4.4汇编器4.5链接器4.6汇编程序举例1.汇编语言源程序的句法格式要点以.asm为扩展名每一行由4个部分组成格式[标号][:]空格[助记符]空格[操作数]空格[;注释][]中的内容为可选择部分供本程序的其它部分或其它程序调用。标号是任选项,标号后面可以加也可以不加冒号“:”。4.1TMS320C54x汇编语言的基本概念要点1.标号必须从第1列写起,2.标号最多可达32个字符,可以是A~Z,a~z,0~9,_,以及$,但标号的第1个字符不能是数字。3.引用标号时,标号的大小写必须一致。4.标号的值就是段程序计数器SPC的值。5.如果不用标号,则第一个字母必须为空格、分号或星号(*)。要点建议[标号][:]空格[助记符]空格[操作数]空格[;注释]可以是助记符指令、汇编指令、宏指令和宏调用命令。1.助记符指令,一般用大写;2.汇编命令和宏命令,以句号“.”开始,且为通常用小写。要点[标号][:]空格[助记符]空格[操作数]空格[;注释]1.指令中的操作数或汇编命令中定义的内容2.操作数之间必须用逗号“,”分开。1.从分号“;”开始2.可以放在指令或汇编命令后面,也可以放在单独的一行或数行。要点2.汇编语言源程序的数据型式二进制:如1110001b或1111001B;八进制:226q或572Q;十进制:1234或+1234或-1234(缺省型)十六进制:0A40h或0A40H或0xA40浮点数:1.623e-23(仅C语言程序中能用,汇编程序不能用)字符:‘D’,每位字符由8位ASCII码表示;字符串:“thisisastring”符号用作标号、常数和替代符号。符号名可以是长达200个字符的字母(A~Z,a~z)、数字(0~9)加上$或下划线(_)。第一个字符不能是数字,符号中间不能有空格。符号分大小写,例如:Abc。3.汇编语言源程序的符号4.表达式1)运算顺序影响表达式运算顺序的三个主要因素是:圆括号、优先级和同级运算顺序。圆括号内的表达式最先运算,不能用{}或[]来代替()。TMS320C54x汇编器的优先级使用与C语言类似,优先级高的运算先执行。表4-1给出了表达式中可用的运算符及优先级。表4-1表达式的运算符及优先级符号操作计算顺序+、−、~取正、取负、按位求补从右到左*、/、%乘、除、求模从左到右、左移、右移从左到右+、−加、减从左到右、=、、=小于、小于等于、大于、大于等于从左到右!=、=不等于、等于从左到右&按位与从左到右^按位异或从左到右|按位或从左到右2)表达式的合法性表达式在使用符号时,汇编器对符号在表达式中的使用具有一些限制,由于符号的属性不同(即定义不同),使表达式存在合法性问题。符号按属性可分为三种:外部符号、可重定位符号和绝对符号。外部符号是那些在一个模块定义而被另一个模块引用的符号。(一般用.global定义)在汇编和执行阶段,符号值、符号地址不同的是可重定位符号,相同的是绝对符号。含有乘、除法的表达式中只能使用绝对符号(其值不能改变)。表达式中不能使用未定义的符号。表4-2表达式符号的合法性若A为…若B为…则A+B为…则A−B为…绝对绝对绝对绝对绝对外部外部非法绝对可重新定位可重新定位非法可重新定位绝对可重新定位可重新定位可重新定位可重新定位非法绝对可重新定位外部非法非法外部绝对外部外部外部可重新定位非法非法外部外部非法非法4.1.3TMS320C54x伪指令TMS320C54x伪指令给程序提供数据、控制汇编过程。具体实现以下任务:(1)将数据和代码汇编到特定的段。(2)为未初始化的变量保留存储空间。(3)控制展开列表的形式。(4)存储器初始化。(5)汇编条件块。(6)定义全局变量。(7)指定汇编器可以获得宏的特定库。(8)检查符号调试信息。表4-3常用伪指令伪指令句法作用title.title“string”标题名。例如:.title“example.asm”end.end结束伪指令,放在汇编语言源程序的最后text.text[段起点]包含可执行程序代码data.data[段起点]包含初始化数据int.intvalue1[,…,valuen]设置16位无符号整型量word.wordvalue1[,…,valuen]设置16位带符号整型量bss.bss符号,字数为未初始化的变量保留存储空间sect.sect“段名”[,段起点]建立包含代码和数据的自定义段usect符号.usect“段名”,字数为未初始化的变量保留存储空间的自定义段def.def变量1[,…,变量n]在当前模块中定义,并可在别的模块中使用ref.ref变量1[,…,变量n]在当前模块中使用,但在别的模块中定义global.global变量1[,…,变量n]可替代 .def和 .ref伪指令mmregs.mmregs定义存储器映像寄存器的替代符号1.段定义伪指令段定义伪指令有以下五个:●.bss(未初始化段)●.data(已初始化段)●.sect(已初始化段)●.text(已初始化段)●.usect(未初始化段)1)未初始化段.bss和.usect命令建立未初始化段。.bss伪指令为未初始化变量在.bss段中预留空间;.usect伪指令在一个未初始化的自定义段中预留空间。.usect伪指令与.bss类似,但是它可以把预留空间与.bss段分离。这两条命令的句法如下:.bss符号,字数符号.usect“段名”,字数2)已初始化段.text、.data和.sect命令建立已初始化段。这三条命令的句法如下:.text[段起点].data[段起点].sect段名”[,段起点].text后是汇编语言程序的正文。经汇编后,.text后的是可执行程序代码,一般存放于程序存储器区域中。.data后是已初始化数据,有int和word两种数据形式。由命令文件可以将定义的数据存放于程序或数据存储器中。.sect建立包含代码和数据的自定义段,常用于定义中断向量表。2.常数初始化伪指令(1).bes和.space。汇编器对这些保留的位填0,将位数乘以16来实现保留字。当标号与.space连用时,标号指向保留位的第一个字;当标号与.bes连用时,标号指向保留位的最后一个字。(2).field。此指令可以把多个域打包成一个字,汇编器不会增加SPC的值,直至填满一个字。(3).float和.xfloat。这两个指令将32位浮点数存放在当前段的连续字中,高位字先存。.float伪指令能自动按长字(偶地址)边界排列,但.xfloat不能。(4).long和.xlong。这两个指令将32位数存放在当前段的连续字中,高位字先存。.long伪指令能自动按长字(偶地址)边界排列,但.xlong不能。(5).string和.pstring。.string类似于.byte,把8位字符放到当前段的连续字中,每8位字符占一个字。(6).int和.word。例如“table:.int1,2,3,4”,或例“table:.word8,6,4,2”。3.段程序计数器定位伪指令段程序计数器定位伪指令的句法如下:.align[sizeinbits]该指令使段程序计数器SPC对准1~128字的边界,保证该指令后面的代码从一个字或页的边界开始。不同的操作数代表了不同的含义:“1”表示让SPC对准字边界;“2”表示让SPC对准长字/偶地址边界;“128”表示让SPC对准页边界。当.align不带操作数时,其缺省值为128,即对准页边界。4.条件汇编伪指令以下分两种情况介绍条件汇编伪指令。(1)第一种情况:.ifwell-definedexpression.elseifwell-definedexpression.else.endif(2)第二种情况:.loop[well-definedexpression].break[well-definedexpression].endloop4.1.4TMS320C54x宏命令TMS320C54x汇编器支持宏语言。宏命令是源程序中具有独立功能的一段程序代码,它可以根据用户的需要,由用户创建自己的指令。宏命令一经定义,便可在以后的程序中多次调用,从而可以简化和缩短源程序。1.宏定义宏命令可以在源程序的任何位置定义,但必须在宏调用之前先定义好。宏定义也可以嵌套。定义如下:宏命令名.macro形式参数;宏体;.endm2.调用宏命令定义好之后,就可以在源程序中将宏命令名作为指令来调用这个宏了。格式如下:宏命令名实际参数3.宏展开当源程序中调用宏命令时,汇编时就将宏命令展开。在宏展开时,汇编器将实际参数传递给形式参数,再用宏定义替代宏调用语句,并对其进行汇编。1*23*add34*5*ADDRP=P1+P2+P3;说明宏功能67add3.macrop1,p2,p3,ADDRP;定义宏89LDp1,A;将参数1赋给A10ADDp2,A;将参数2与A相加11ADDp3,A;将参数3与A相加12STLA,ADDRP;将结果A的低字存参数413.endm;结束宏141516.globalabc,def,ghi,adr;定义全局符号1718000000add3abc,def,ghi,adr;调用宏110000001000!LDabc,A;宏展开10000010000!ADDdef,A10000020000!ADDghi,A10000038000!STLA,adr例4-2宏定义、宏调用和宏展开的一个例子。4.2TMS320C54x汇编语言程序设计的基本方法DSP的软件开发一般有以下几种方式:(1)直接编写汇编语言源程序;(2)编写C语言程序;(3)混合编程(既有C代码,又含汇编代码)。4.2.1TMS320C54x汇编语言源程序的完整结构汇编语言源程序中,以.asm为程序的扩展名,程序员用“段”伪指令来组织程序的结构。程序一般由数据段、堆栈段和代码段组成。.data用于存放有初值的数据块;.usect用于为堆栈保留一块存储空间;.text用于设置代码段。另外,.bss用于为变量保留一块存储空间;.sect常用于定义中断向量表。程序的基本结构有四种:顺序结构、分支结构、循环结构和子程序结构。4.2.2顺序结构程序顺序结构是最基本、最简单的程序结构形式,程序中的语句或结构被连续执行。【例1】试编制程序,求出下列公式中z的值。z=(x+y)×8-w源程序编制如下:*************************************************ex41.asmz=(x+y)*8-w*************************************************.titleex41.asm.mmregsSTACK.usectSTACK,10H;开辟堆栈空间.bssx,1;为变量分配4个字的空间.bssy,1.bssw,1.bssz,1.defstart.datatable:.word6,7,9.textstart:STM#0,SWWSR;零等待状态STM#STACK+10H,SP;设置堆栈指针STM#x,AR1;AR1指向xRPT#2;从程序存储器传送3个值至数据存储器MVPDtable,*AR1+LD@x,AADD@y,A;A=x+yLDA,3;A=(x+y)*8SUB@w,A;A=(x+y)*8-wSTLA,@zend:Bend.end采用顺序结构编程时应注意:①合理选取算法;②采用合适的寻址方式进行指令选取;③存储数据及结果时注意内存空间的分配和寄存器的使用。4.2.3分支结构程序程序的分支主要是靠条件转移指令来实现的。TMS320C54x具有丰富的程序控制与转移指令,利用这些指令可以执行分支转移、循环控制以及子程序操作。分支转移指令(如B、BACC、BC等)通过改写PC,以改变程序的流向。分支结构也称条件结构。【例2】试编制程

1 / 187
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功