单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,DSP原理及应用,*,北京理工大学珠海学院信息学院,第,4,章 汇编语言,和伪指令,第,4,章 汇编语言和,伪指令,1,第4章 汇编语言和伪指令1,1,采用汇编语言,用户可以直接操作到处理器内部的工作寄存器和片内RAM单元,能把数据的处理过程表述得非常具体和详实。,汇编语言并不独立于具体机器,是一种非常通用的低级程序设计语言。,4.1 汇编语言程序设计,2,采用汇编语言,用户可以直接操作到处理器内部的,2,4.1.1 汇编语言源程序格式,典型的汇编语言格式是四段式格式:,标号段:操作码段 操作数段;注释段,LABLE:OPCODE OPRAND ;COMMENT,其中操作码段是必选项,任何语句都必须有操作码段。如果是多个操作数,中间用逗号隔开。,P1:ADD#1 ;,ACC加1,结果保存在ACC中,BCND P1,LEQ ;,如果ACC0则转到P1,3,4.1.1 汇编语言源程序格式 典型的汇编语,3,4.1.2 常用伪指令介绍,指令语句 每一条指令语句在源程序汇编时都要产生可供计算机执行的指令代码(即目标代码),所以这种语句又叫可执行语句。每一条指令语句表示计算机具有的一个基本能力,如数据传送,两数相加或相减,移位等,而这种能力是在目标程序(指令代码的有序集合)运行时完成的,是依赖于汁算机内的中央处理器(CPU)、存储器、IO接口等硬件设备来实现的。,4,4.1.2 常用伪指令介绍指令语句 每,4,伪指令语句 伪指令语句是用于指示汇编程序如何汇编源程序,所以这种语句又叫命令语句。例如源程序中的伪指令语句告诉汇编程序:该源程序如何分段,有哪些逻辑段在程序段中哪些是当前段,它们分别由哪个段寄存器指向;定义了哪些数据,存储单元是如何分配的等等。伪指令语句除定义的具体数据要生成目标代码外,其他均没有对应的目标代码。伪指令语句的这些命令功能是由汇编程序在汇编源程序时,通过执行一段程序来完成的,而不是在运行目标程序时实现的。,5,伪指令语句 伪指令语句是用于指示汇编程,5,6,6,6,条件汇编伪指令,以下分两种情况介绍条件汇编伪指令。,(1)第一种情况:,.if well-defined expression,.elseif well-defined expression,.else,.endif,(2)第二种情况:,.loopwell-defined expression,.break well-defined expression,.endloop,7,条件汇编伪指令 以下分两种情况介绍条件汇编伪指令。7,7,4.2 C语言程序设计,用汇编语言编写程序是一件繁杂的事情,开发周期相对较长。因此各个DSP公司都推出了相应的高级语言(如C语言),使得DSP芯片的软件可以直接使用高级语言写成。,从而大大提高DSP芯片的开发速度,也使程序的修改和移植变得十分方便。,C语言程序文件的后缀名为.c。在该程序中实现DSP要完成的功能,由开发人员编写。,8,4.2 C语言程序设计 用汇编语言编写程序是一,8,C编译器概述,TMS320C2xx C编译器是一个功能齐全的优化编译器。它的主要功能是把标准的ANSI C语言程序转换成TMS320 DSP芯片能够识别执行的汇编语言代码。,9,C编译器概述 TMS320C2xx C编译器是,9,4.3,调试时需要的五种文件,调试时需要以下五种文件:,(1)C语言程序(.c)或者汇编语言文件(.asm),(2)头文件(.h),(3)库文件(rts2xx.lib),(4)命令文件(.cmd),(5)复位和中断向量文件vectors.asm,10,4.3 调试时需要的五种文件 调试时需要以下五种文件:1,10,4.3.1 C语言文件文件或汇编语言文件,该文件的扩展名为:*.c 或*.asm;,该文件内容为DSP所要完成功能的源程序代码。,11,4.3.1 C语言文件文件或汇编语言文件该文件的扩展名为:*,11,4.3.2 头文件,头文件的扩展名为:*.h;,汇编语言头文件:包含了各种寄存器的名称和地址,此外,用户还可以定义各种常量和宏;,C语言头文件:包含了C语言定义下的各种语言定义下的各种寄存器和地址,还包含支持C语言的的各种库函数;,头文件必须放在C源程序的开始,并使用“include”语句声明和添加。或者在汇编主程序的开始使用汇编伪指令.include、.copy对头文件进行调用。,12,4.3.2 头文件头文件的扩展名为:*.h;12,12,头文件部分寄存器和宏定义举例:,;-,IMR .set 0004h ;,中断屏蔽寄存器,IFR .set 0006h ;,中断标志寄存器,;-,DELAY_S.macro delay_value ;,延时=0.05s 延 时计数,RPT#delay_value,NOP,.endm,调用宏:,DELAY_S 0AC5H,13,头文件部分寄存器和宏定义举例:13,13,头文件,F2407.h,,在该文件中寄存器都以指针方式进行寻址。,头文件为DSP的寄存器和位测试指令,的位码定义助记符,14,头文件F2407.h,在该文件中寄存器都以指针方式进行寻址。,14,4.3.3 命令文件,扩展名为*.cmd,实现对程序存储空间和数据存储器空间的分配;它由三部分组成:一是输入输出文件和选项等(该部分可以省略),二是目标存储器定义,使用伪指令,MEMORY,定义,三是各段的定位,由,SECTIONS,命令定义,。,MEMORY伪指令用来标示实际存在目标系统中并且可被使用的存储器范围。每个存储器范围有名字、起始地址和长度。,SECTIONS伪指令的作用是:描述输入段怎样被组合到输出段;在可执行程序内定义输出段;规定在存储器内何处放置输出段;允许重命名输出段。,15,4.3.3 命令文件 扩展名为*.cmd,实,15,MEMORY,PAGE0:,/*程序存储器*/,name1(attr):origin=constant,length=constant;,namen,(attr):origin=constant,length=constant;,PAGE1:,/*数据存储器*/,name1(attr):origin=constant,length=constant;,namen,(attr):origin=constant,length=constant;,PAGE,2,:,/*I/O空间*/,name1(attr):origin=constant,length=constant;,namen,(attr):origin=constant,length=constant;,16,MEMORY16,16,SECTIONS,name:property,property,property,,name:property,property,property,,name:property,property,property,,17,SECTIONS17,17,每一个以name开始的段的规格说明定义了一个输出段。在段名之后是特性列表,定义段的内容以及它们是怎样被分配的。,(1)装载位置,规定段将被装载在存储器内何处。,(2)运行位置,定义段将在存储器内何处运行。,(3)输入段,定义组成输出段的输入段。,(4)段类型,定义特定段类型的标志。,(5)填充值,定义用于填充未初始化空位的数值。,18,每一个以name开始的段的规格说明定义了一个,18,命令文件举例MEMORY伪指令和SECTION伪指令:,MEMORY,PAGE 0:,VECS:origin=0000h,length=0040h,/*程序,复位,*/,PVECS:origin=004,0,h,length=0F00h,/*,外设中断向量,*/,PM:origin=1000h,length=6000h,PM1:origin=7000h,length=1000h,PM2:origin=8000h,length=800h,/*如果PON=1,则为SARAM,*,/,B0_PM:origin=0FF00h,length=100h,/*如果CNF=1,则为DARAM B0块,*,/,PAGE 1:,MMRS:,origin=00,0,0h,length=0060h,B2:origin=0060h,length=0020h,/*DARAM B2 块*/,B,0,:origin=0,20,0h,length=,010,0h,/*如果CNF=0则为DARAM B,0,块*/,B,1,:origin=0,3,00h,length=0,10,0h,/*DARAM B,1,块*/,SARAM:,origin=0,8,00h,length=0,80,0h,/*如果DON=1则为SARAM*/,PERIPH:origin=7000h,length=10,0,0h,/*外设帧,*,/,EX,T,RAM:origin=8000h,length=8000h,/*外部扩展RAM*/,PAGE 2:,IO_EX:origin=00,0,0h,length=0FFF0h,IO_IN:origin=0FFF0h,length=0Fh,19,命令文件举例MEMORY伪指令和SECTION伪指令:19,19,SECTIONS,.reset,:,VECS PAGE0,/*,复位中断向量,*/,.vectors:,VECS PAGE0,/*,中断向量表,*/,.pvecs:,PVECS PAGE0,/*,外设中断向量表,*/,.text:,PM PAGE0,/*,代码,*/,.t,able:,PM PAGE0,.bss:,B1 PAGE1,.,data0:,B0 PAGE1,.,data2:,B2 PAGE1,.stack:,SARAM PAGE1,20,SECTIONS20,20,4.3.4,中断向量文件,中断向量文件,vectors.asm,定义了系统中各种中断服务程序,的入口地址,。,21,4.3.4 中断向量文件中断向量文件vectors.asm定,21,4.3.5,库文件rts2xx.lib,rts2xx.lib库文件可在C:CCStudio_v3.1C2400cgtoolslib下找到,不得修改,完全复制到需要的地方。,rts2xx.lib包含以下内容:,ANSIC标准库;,系统启动程序_c_int0;,允许C访问特殊指令的函数和宏。,22,4.3.5 库文件rts2xx.librts2xx.lib,22,4.4 C,语言和汇编语言混合编程方法,4.4.1,在C语言中嵌入汇编语言程序,1.在C语言中嵌入单条汇编语句,/系统初始化程序,void inital(),asm(setc SXM);,/,SXM位置1,抑制符号扩展位,asm(clrc OVM);,/,OVM位清0,累加器中结果正常溢出,asm(clrc CNF);,/,CNF位清0,B0被映射到数据存储器空间,23,4.4 C语言和汇编语言混合编程方法4.4.1 在C语言中嵌,23,2.在C语言中嵌入实现某一完整功能的多条汇编语句,在C语言中调用汇编语言编写的子程序,,用户必须遵循相关规则自行维护模块的入口和出口代码,,主要应弄清楚堆栈的使用情况。,24,2.在C语言中嵌入实现某一完整功能的多条汇编语句24,24,4.5,分开编写C语言和汇编语言程序,1.分离的C语言程序和汇编语言程序接口,须注意:在编写汇编语言程序时,必须遵守有关调用规则和寄存器规则,这样不会影响C语言程序的运行环境。,25,4.5 分开编写C语言和汇编语言程序1.分离的C语言程序和,25,2.在C语言程序中访问汇编语言程序的变量,2种操作方法:,(1)汇编变量在.bss段中定义,采用.bss命令定义变量,采用.global命令定义变量,在变量名前加一下划线“_”,在C语言程序中将变量说明为外部变量,26,2.在C语言程序中访问汇编语言程序的变量26,2