第七章-伪指令和宏语言_第1页
第七章-伪指令和宏语言_第2页
第七章-伪指令和宏语言_第3页
第七章-伪指令和宏语言_第4页
第七章-伪指令和宏语言_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

伪指令和宏语言●

信息工程学院

●17.1、伪指令7.2、宏语言7.3、通用目标文件格式7.4、命令文件程序举例伪指令和宏语言2伪指令

TMS320C2000/C5X的汇编伪指令可以实现以下功能:▲

汇编代码和数据到指定的段;▲

为未定义的变量保存空间;▲

控制列表文件;▲

分配存储器;▲

汇编条件块;▲

定义全局变量;▲

指定汇编器能得到的宏;▲

检查符号调试信息。37.1伪指令——分为8类:

段定义伪指令:把汇编语句程序的各部分与适当的段联系起来。

.bes,

.bss,.data,.text,.sect,.usect,.sblock。▲初始化常数伪指令:为当前段汇编数值。

.space,.byte,.field,.float,.xfloat,.int,.word,.long,.xlong,.pstring,string。▲段程序计数器排列伪指令:使段程序计数器SPC指向预定的位置。align,.even。

▲输出列表格式伪指令:控制列表文件的格式。.drlist,.drnolist,.fclist,.fcnolist,.length,.width,.list,.nolist,.mlist,.mnolist,.option,.page,.sslist,.ssnolist,.tab,.title。▲引用其他文件伪指令:为文件提供信息或提供这些文件的信息。..copy,.include,.global,.def,.ref,.mlib。▲条件汇编伪指令:使汇编器根据表达式求值结果的真或假来汇编代码的某些段。

.if,.elseif,.else,.endif,.loop,.break,.endloop。▲汇编时的符号伪指令:使定义的符号名等同于常数值或字符串。

.asg,.eval,.set,.equ,.struct,.endstruct,.label

汇编模式伪指令:定义在C28x或认可C2xLP模式。.c28_amode,.lp_amode。▲其他伪指令:具有其他功能和特性的伪指令。.end,.mmregs,.newblock,.port,.sblock,.version,.emsg,.wmsg。47.2宏指令▲

将频繁出现的程序段定义为宏指令,▲

当程序中需要执行该程序段时,只需用一条宏调用语句。▲

缩短源程序的长度,使源程序易读,减少了书写错误。使用宏的过程要经过以下3个步骤:1)定义宏:用户在使用宏之前必须先定义宏。在程序的任何地方都可以定义一个宏。可在源文件开始处或者在.include/.copy文件中或者在宏库中定义。格式:

宏名.macro[形式参数1][,形式参数2]…[,形式参数n]

}宏体

[.mexit]

.endm5宏名——用通常规定的字符串格式书写。.mexit

——相当于“goto.endm”,用于条件判断后的转移,可缺省。形式参数——或称为替代符号。同样按通常规定的字符串格式书写。替代符号作为宏参数仅在被定义的宏中有效。▲

每个宏最多可以用32个宏参数。▲

宏可以嵌套,但宏的所有元素都应在同一个文件中定义。7.2宏指令(2)调用宏:在定义了宏以后,就可以在源程序中将宏的名字作为操作码来调用。

格式:

宏名[实参数1][,实参数2]…[,实参数n]6,7.2宏指令(3)展开宏:汇编器在对源文件进行汇编时,对调用的宏进行展开。在展开过程中,汇编器用宏体取代宏调用语句,宏体中的形式参数实际参数代替。

①如果某个形式参数没有对应的实参数为其赋值,该形式参数将被空串(“”)代替。②如果实参数的个数多于形式参数,则余下的实参数将赋给最后一个形式参数(用逗号隔开)。③如果要把一串变量赋给一个形式参数,或者把一个逗号(或分号)传给一个形式参数,就必须用引号将它们引起来。④汇编时,汇编器先用实参数代替形式参数并展开宏,然后把源语句汇编为目标代码,并输出到列表文件中。7,7.2宏指令例6.23

宏定义:

parms .macrox,y,z a=x b=y c=z .endm调用宏:

汇编时展开宏:

parms 100,200

;a=100

;b=200

;c=“”

parms

“100,200,300”,55,66,77

;a=“100,200,300”

;b=55

;c=66,778

.C

——C源文件

.ASM

——汇编文件

.CMD

——命令文件.H

——头文件.PRJ

——工程文件

.LST——列表文件

.MAP——映射文件

.OBJ——目标文件

.OUT——可执行文件

7.3通用目标文件格式通用目标文件格式允许用户编写汇编语言程序时使用代码块和数据块,这些块被称为段。用汇编器可以将汇编语言源程序汇编为目标文件,用连接器将若干个目标文件连接成一个可被DSP芯片执行的可执行文件。这些目标文件的格式称为通用目标文件格式(COFF,CommonObjectFileFormat)。DSP系统中常用的文件后缀9

COFF目标文件总是包括3个默认的段:

▲文本段:用.text定义,通常包括可执行代码。

数据段:用.data定义,通常包括已初始化的数据。

预留段:用.bss定义,通常保留用于未初始化变量的空间。用.usect,.sect或.asect伪指令可创建命名段。这些命名段可以像.text,.data一样被使用。

COFF有两种基本类型的段:①已初始化的段——包含数据或代码。用.text和.data伪指令定义的段和用.sect或.asect伪指令创建的命名段均为已初始化的段。②未初始化的段——在内存映射中为未初始化数据保留空间。.bss段和用.usect伪指令创建的命名段是未初始化的段,在目标文件中这些段没有实际内容。段7.3通用目标文件格式目标文件的最小单位被称为段,它是在存储器中占有连续空间的代码块或数据块。107.3通用目标文件格式▲

汇编器在汇编过程中建立这些段,连接器把段重定位到目标存储器中▲

所有的段都是独立的、可定位的▲

相同的段将按先后次序定位在连续的区域内▲

未初始化段被定位到RAM内;初始化段可单独定位在RAM或ROM内,并且在连接时还可引用其他段内定义的符号汇编器为每个段设置了一个独立的程序计数器,这些计数器称为段程序计数器(SPC,SectionProgramCounters)。可以用段程序计数器排列伪指令.align或.even,强迫SPC指向预定的位置。段段程序计数器117.3通用目标文件格式连接器命令文件和连接器伪指令▲连接器通过连接COFF目标文件建立可执行文件,▲目标文件中的段是连接时的重要依据。▲连接器可把段定位到用户系统已配置的存储器中。▲连接器命令文件(.cmd)则给出连接器在连接时的有关信息▲

DSP芯片的存储器配置随应用的不同而不同. 用连接器伪指令

MEMORY(存储器伪指令)可以确定目标系统的各种内存配置。▲当MEMORY决定了存储器模式后,可以用连接器伪指令SECTIONS

(段伪指令)确定连接器组合输入段的方法和输出段在存储器中的位置。▲如果不使用这两条伪指令,连接器则用默认存储器的定位方式来组合段,并把它们定位到存储器中。127.3通用目标文件格式连接器命令文件和连接器伪指令连接器命令文件.cmd连接器命令文件允许用户把连接信息放置在文件中。命令文件是ASCII文件,可以包含下列各项中的某一项:▲输入文件名。该输入文件可以是目标文件、归档库或其他命令文件。▲连接器选项。在命令文件中可以用命令行上的连接器选项。▲MEMORY和SECTIONS连接器伪指令。▲注释。用户可以使用/*和*/定界符把注释加到命令文件中。▲赋值语句。该语句定义并赋值给全局符号。137.3通用目标文件格式连接器命令文件和连接器伪指令连接时给符号赋值▲赋值语句的语法:连接器中赋值语句的语法类似于C语言中赋值语句语法。符号=表达式 ;把表达式的值赋予符号符号+=表达式 ;把表达式的值加到符号上符号-=表达式 ;从符号减去表达式的值符号*=表达式 ;符号乘以表达式符号/=表达式 ;符号除以表达式

▲把SPC赋予符号“.”:“.”表示定位期间SPC的当前值。“.”符号仅可用在SECTIONS伪指令内的赋值语句中,用来表示段的当前运行地址。147.3通用目标文件格式连接器命令文件和连接器伪指令▲赋值表达式:连接器表达式必须遵循以下规则:√

表达式可包含全局符号、常数,以及表8-3-1所列的C语言运算符。√

所有数被当做长整数(32位)处理。√

连接器用和汇编器相同的方式识别常数。见表8-3-2.√表达式中的符号只具有符号的地址值,不进行类型检查。√

连接器表达式可以是绝对的或可重定位的。157.3通用目标文件格式连接器命令文件和连接器伪指令▲MEMORY伪指令——确定在目标系统中具有物理位置且可被程序使用的存储器范围。MEMORY伪指令的一般语句形式为:MEMORY{PAGE0:存储器名1[(属性)]:ORIGIN=常数,LENGTH=常数

PAGEn:存储器名n[(属性)]:ORIGIN=常数,LENGTH=常数

}167.3通用目标文件格式连接器命令文件和连接器伪指令PAGE:

√定义一个存储器空间,用户可以定义多达255页。√

PAGE0定义程序存储器,PAGE1定义数据存储器,PAGE2定义I/O空间。√如果用户没有使用PAGE选项,那么连接器把段定位到PAGE0。√每个PAGE代表一个完全独立的地址空间。√在PAGE0上已配置的存储器可以和在PAGE1上已配置的存储器重叠。存储器名:√命名存储器范围。由1~8个字符组成。√名字对于连接器没有特殊的意义,仅指明存储器的区域。√在不同页上存储器范围可以有相同的名字,√在同一页,所有的存储器范围不能有相同的名字,且不能重叠。177.3通用目标文件格式连接器命令文件和连接器伪指令属性:可选项,当被使用时,必须用括号括起来。属性把输出段的定位限制在某些存储器范围内。如果用户不使用任何属性,则输出段即可以定位到任何范围内。有效的属性包括:R——存储器可读;W——存储器可写;X——储器可以包含可执行代码;I——存储器可被初始化。ORIGIN:指定存储器的起始地址,也可以写成org或o。这个值是以字节规定的16位常数,也可以是十进制、八进制或十六进制。

LENGTH:指定存储器的长度,也可以写成len或l。数值的表示与origin相同▲

当用户使用MEMORY伪指令时,要确信已指定了所有可用于装载代码的存储器范围。▲

连接器不把程序放到未配置的存储器中。注意:187.3通用目标文件格式连接器命令文件和连接器伪指令例6.24

MEMORY指令举例

/*SampleCommandfilewithMEMORYdirective*/file1.objfile2.obj-oprog.out

MEMORY{PAGE0:ROM:ORIGIN=0C00h,LENGTH=1000hPAGE1:SCRATCH:ORIGIN=60h,LENGTH=20hRAM:ORIGIN=200h,LENGTH=200h}该例定义了一个存储器系统:具有程序存储器中地址为0C00h,长度为4K字的ROM;数据存储器中地址为60h,长度为32字的RAM;数据存储器中地址为200h,长度为512字的RAM。197.3通用目标文件格式连接器命令文件和连接器伪指令▲

SECTIONS伪指令

——

描述输入段怎样被组合到输出段内;定义在执行程序中的输出段;规定输出段在存储器中的位置;允许重新命名输出段。SECTIONS伪指令的一般语法形式是:SECTIONS{

段名1:[特性1,特性2,……]

段名2:[特性1,特性2,……]……………}指令中的每一行从段名开始定义输出段,输出段是输出文件内的段。在段名之后是特性列表(以逗号隔开),定义段的内容以及它是怎样被分配的。207.3通用目标文件格式连接器命令文件和连接器伪指令特性列表的选项(段所具备的特性)有以下几种。▲

装载地址:规定段将被装载在存储器中的位置。

语法:load=allocation或allocation或{}>allocationallocation是MEMORY伪指令所定义的范围内地址。▲

运行地址:定义段在存储器内运行的位置。

语法:run=allocation或 run>allocation

如果在一个段中load和run的地址相同,run可以省略。连接器为每个输出段分配两个目标存储器地址:装载地址和运行地址。通常这两个地址是相同的。但有时用户可能把代码装入存储器的一个区域却在另一个区域运行它。例如在引导加载程序,用load设置它的装载地址,用run设置它的运行地址。217.3通用目标文件格式连接器命令文件和连接器伪指令▲

调准地址:规定段应在地址边界上开始。调准可以使连接器把输出段放在位于n字边界的地址,其中n是2的幂。

语法:align=n或 align=(n)

如.textalign=128,即将.text段定位于页边界。▲

块地址:规定段必须装在两个地址边界之间,它把段定位在大小为n的块内任何地方,如果段大于块,那么段将从该边界开始。和调准一样,n必须是2的幂。

语法:block=n或block(n)

.bssload=block(0x80)。定位.bss段使其包含在单个128字的页内或者从新页开始。用户可以单独使用调准或块,也可以和装入地址、运行地址结合在一起使用,但是调准和块不能一起使用。227.3通用目标文件格式连接器命令文件和连接器伪指令▲

输入段:定义组成输出段的输入段。

语法:{input_sections}

输入文件中的段组合起来形成输出段,连接器按照所列出的输入段的次序连接并组合它们。输出段的大小是组成它的输入段的大小之和。通用类型的段的规格说明中没有输入段。如:SECTIONS{.text:.data:.bss:}

此时连接器从输入文件取出所有.text段并把它们组合到.text输出段内。连接器按照它在输入文件中遇到的次序连接.text输入段,对.data和.bss段的操作与.text相同。用户也可以明确规定组成输出段的输入段,每个输入段用它的文件名和段名来标志。237.3通用目标文件格式连接器命令文件和连接器伪指令例6.25

SECTIONS{.text {f1.obj(.text) f2.obj(sec1) f3.obj f3.obj(.text,sec2)}

}

输入段不必相互同名也不必和输出段同名。如果列举输入文件时不带段,那么它所有的段将被包含在输出段之内。247.3通用目标文件格式连接器命令文件和连接器伪指令

段类型:定义特殊段类型的标志。语法:type=COPY

type=DSECT

或type=NOLOAD

用户可以把这3种特殊的类型赋予输出段。用COPY和DSECT创建的段是一个虚段,它不包括在输出段存储器分配内,也不占据存储器空间,不包括在存储器映象列表中。但在虚段中定义的全局符号可以被其他输入段引用,COPY段可以将段的内容、重定位信息及行号信息放在输出模块中,而DSECT段则不放置。NOLOAD创建的段不将段的内容、重定位信息及行号信息放在输出模块中,但连接器为其分配空间并包括在存储器映象列表中。257.3通用目标文件格式连接器命令文件和连接器伪指令▲

填充值:定义用于填充初始化空位的数值。

语法:file=value

name:…{…}=value

当初始化输出段内有空位存在时,连接器必须提供原始数据以填充它。连接器用16位数值填充空位,该数值在存储器内复制直至它填满空位为止。267.4通用目标文件格式连接器命令文件和连接器伪指令例6.26

SETIONS伪指令的使用file1.objfile2.obj -oprog.out

SECTIONS{.text:load=ROM run=0800h.const:load=ROM.bss:load=RAMvectors:load=0FF80h {t1.obj(.intvec1) t2.obj(.intvec2)

endvec=. }.data:align=16}277.4通用目标文件格式连接器命令文件和连接器伪指令▲

连接器举例

例6.27是一个名为demo.cmd的连接器命令文件,它连接了3个目标文件:demo.obj,fft.obj和tables.obj,并创建了一个名为demo.out的可执行程序。假设目标存储器具有下列配置。程序存储器:

地址范围

内容0xF0000~0x3FFFBF片内ROM0x3FFFC0~0x3FFFFF中断向量表数据存储器:

地址范围

内容0x000040~0x0001FF 堆栈0x000200~0x0007FF RAM_10x3ED000~0x3EFFFF RAM_228例6.27

命令文件exmp.cmd

/** 定义连接器选项 **/-e SETUP/*定义程序入口 */-o demo.out

/*命名输出文件*/-m demo.map

/*创建一个输出列表文件*/

/** 定义输入文件 **/demo.obj

/*连接三个目标文件*/fft.objtables.obj/** 定义存储器配置 **/MEMORY{PAGE0:ROM(R):ORIGIN=3F0000h,LENGTH=0FFC0hVECTORS(R):ORIGIN=3FFFC0h,LENGTH=0040hPAGE1:STACK(RW):ORIGIN=000040h,LENGTH=01C0hRAM_2(RW)

:ORIGIN=000200h,LENGTH=0600hRAM_1(RW)

:ORIGIN=3ED000h,LENGTH=3000h}

29SECTIONS{vectors:{}>VECTORS,PAGE=0 .text:load=ROM,PAGE=0 .data:file=07A1Ch,load=RAM_1,PAGE=1

{tables.obj(.data)

fft.obj(.data)+=100h;/*创建一个长度为100的空间,用07A1Ch填充*/

}

var_defs:{}>RAM_2page=1/*包含在dmo.obj文件中var_defs段的变量连接到数据块RAM_2中*/

.bss:{}>RAM_1,page=1,fill=0FFFFh/*.bss的填充和链接*/

}7.4通用目标文件格式连接器命令文件和连接器伪指令307.4通用目标文件格式连接器命令文件和连接器伪指令▲

TMS320C228x器件的默认定位MEMORY{PAGE0:PROG:ORIGIN=0x000040H,LENGTH=0x3FFFC0HPAGE1:DATA:ORIGIN=0x000000H,LENGTH=0x010000HPAGE1:DATA1:ORIGIN=0x010000H,LENGTH=0x3F0000H}

SECTIONS{.text:PAGE=0 .data:PAGE=0.cinit:PAGE=0/*仅在C程序中使用*/ .bss:PAGE=1 }用户没有使用MEMORY和SECTIONS的情况下,存储器使用该默认定位317.4程序举例▲

公用文件程序设计时,需在多个模块中使用相同设置和中断处理:

将芯片中映射至I/O空间的寄存器地址及标号、预置变量和常数的空间等设置语句集中在一个文件中,称为I/O寄存器头文件(如init.h);

将转移中断矢量地址的指令集中在一个文件中,称为中断矢量头文件(如vector.h);

将定义程序、数据和I/O空间地址块大小和位置的伪指令集中在一个文件中,称为命令文件(如F206.cmd)。

这3个文件称为公用文件。

32

用.copy或.include伪指令将I/O寄存器头文件和中断矢量头文件复制到该应用程序中,形成一个汇编源程序(如

delay.asm)

由汇编器进行汇编后生成一个目标文件(如delay.obj

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论