马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
FIFLD用于定义一个结构化内存表的数据域。FIELD可用“#”代替。 语法格式 {lable} FIELD expr 其中:{lable}为可选的。当指令中包含了这一项时,lable的值为当前内存表的位置计数器{VAR}的值。汇编编译器处理了这条FIELD伪操作后,内存表计数器的值加上expr。expr 表示本数据域在内存表中所占的字节数。 使用说明 MAP伪操作和FIELD伪操作配合使用来定义结构化的内存表结构。MAP伪操作定义内存表的首地址;FIELD伪操作定义内存表中各数据域的字节长度,并可为每一个数据域指定一个标号,其他指令可引用该标号。 MAP伪操作中的base-register寄存器值对于其后所有FIELD伪操作定义的数据域是默认使用的,直至遇到新的包含base-register项的MAP伪操作。 需要特备注意的是,MAP伪操作和FIELD伪操作仅仅是定义数据结构,它们并不实际分配内存单元。 由MAP伪操作和FIELD伪操作配合定义的内存表有3种:基于绝对地址的内存表、基于相对地址的内存表和基于PC的内存表。 示例11 基于绝对地址的内存表举例 下面的伪操作序列定义一个内存表,其首地址为固定地址8192(0x2000),该内存表中包含5个数据域:consta长度为4字节;constb长度为4字节;x长度为8字节;y长度为8字节;string长度为16字节。这种内存表称为基址绝对地址的内存表。 MAP 8192 ;内存表的首地址8192(0x2000) consta FIELD 4 ;consta长度为4字节,相对位置为0 constb FIELD 4 ;consta长度为4字节,相对位置为4 x FIELD 8 ;x长度为4字节,相对位置为8 y FIELD 8 ;y长度为4字节,相对位置为16 string FIELD 16 ;string长度为16字节,相对位置为24 在指令中可这样引用内存表中的数据域: LDR R0,consta ;将consta地址处对应的内容加载到R0 上面的指令仅仅可以访问LDR指令前后4KB地址范围的数据域。 示例12 基于相对地址的内存表举例 下面的伪操作序列定义一个内存表,其首地址为0与R9寄存器值的和,该内存表中5个数据域。这种内存表中称为基于相对地址的内存表。 MAP 8192 ;内存表的首地址为R9寄存器的值 consta FIELD 4 ;consta长度为4字节,相对位置为0 constb FIELD 4 ;consta长度为4字节,相对位置为4 x FIELD 8 ;x长度为4字节,相对位置为8 y FIELD 8 ;y长度为4字节,相对位置为16 string FIELD 16 ;string长度为16字节,相对位置为24 可通过下面的指令访问地址范围超过4KB的数据: ADR R9,Field ;伪指令 LDR R5,consta ;相当于LDR R5,[R9,#4] 在这里,内存表中各数据域的世界内存地址是基于R9寄存器的内容,而不是基于一个固定的地址。通过在LDR指令中指定不同的基址寄存器值,定义的内存表结构可在程序中有多个实例。可多次使用LDR指令,用以实现不同的程序实例。 实例13 基于PC的内存表举例 下面的伪操作序列定义以个内存表,其首地址为PC寄存器的值,该内存表中包含5个数据域。这种内存表称为基于PC的内存表。 Data SPACE 100 ;分配100字节的内存单元,并初始化为0 MAP Data ;内存表的首地址为Datastruc内存单元 consta FIELD 4 ;consta长度为4字节,相对位置为0 constb FIELD 4 ;consta长度为4字节,相对位置为4 x FIELD 8 ;x长度为4字节,相对位置为8 y FIELD 8 ;y长度为4字节,相对位置为16 string FIELD 16 ;string长度为16字节,相对位置为24 可通过下面的指令访问地址范围不超过4KB的数据: LDR R5, constb ;相当于“LDR R5,[PC,offset]” 在这里,内存表中各数据域的实际内存地址是基于PC寄存器的值,而不是基于一个固定的地址。PC的值不是固定的,但分配的内存单元时固定的,也就是说,PC的值加上offset的值才是内存单元的值,这样offset的值便不是固定的。在使用LDR指令访问内存表中的数据域时,不必使用基址寄存器。 示例14 特殊内存表举例 当FIELD伪操作中的操作数为0时,其中的标号即为当前内存单元的地址。由于其中操作数为0,汇编编译器处理该条件伪操作后,内存表的位置计数器的值并不改变。可利用这项技术来判断当前内存的使用没有超过程序分配的可用内存。 下面的伪操作序列定义一个内存表,其首地址为PC寄存器的值,该内存表中包含5个数据域:consta长度为4字节;constb长度为4字节;x长度为8字节;y长度为8字节;string长度为maxlen字节。为防止rnaxlen的取值使得内存使用越界,可利用endofstru监视内存的使用情况,保证其不超过endofmen。 start EQU 0x1000 ;分配的内存首地址 end EQU 0x2000 ;分配的内存末地址 MAP start ;内存表的首地址为start内存单元 consta FIELD 4 ;consta长度为4字节,相对位置为0 constb FIELD 4 ;consta长度为4字节,相对位置为4 x FIELD 8 ;x长度为4字节,相对位置为8 y FIELD 8 ;y长度为4字节,相对位置为16 string FIELD 16 ;string长度为maxlen字节,相对位置为24 endalert FIELD 0 ;endalert用于检测内存是否越界 ASSERT endalert<=end ;ASSERT伪操作将在后面介绍 end 凌阳教育,专注嵌入式人才培养多年,完善的培养方案,强大的师资,合理的课程安排,成功从小白蜕变为嵌入式工程师。想了解凌阳教育,或者获得更多嵌入式学习资料的免费下载,请点击www.sunplusedu.com访问凌阳教育官网 |