凌阳教育的个人空间 https://blog.eetop.cn/204849 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

数据定义伪操作之二

已有 552 次阅读| 2016-1-26 15:24 |个人分类:linux技术

FIFLD用于定义一个结构化内存表的数据域。FIELD可用“#”代替。

语法格式

{lable}   FIELD    expr

其中:{lable}为可选的。当指令中包含了这一项时,lable的值为当前内存表的位置计数器{VAR}的值。汇编编译器处理了这条FIELD伪操作后,内存表计数器的值加上exprexpr

表示本数据域在内存表中所占的字节数。

使用说明

MAP伪操作和FIELD伪操作配合使用来定义结构化的内存表结构。MAP伪操作定义内存表的首地址;FIELD伪操作定义内存表中各数据域的字节长度,并可为每一个数据域指定一个标号,其他指令可引用该标号。

MAP伪操作中的base-register寄存器值对于其后所有FIELD伪操作定义的数据域是默认使用的,直至遇到新的包含base-register项的MAP伪操作。

需要特备注意的是,MAP伪操作和FIELD伪操作仅仅是定义数据结构,它们并不实际分配内存单元。

MAP伪操作和FIELD伪操作配合定义的内存表有3种:基于绝对地址的内存表、基于相对地址的内存表和基于PC的内存表。

示例11   基于绝对地址的内存表举例

下面的伪操作序列定义一个内存表,其首地址为固定地址81920x2000),该内存表中包含5个数据域:consta长度为4字节;constb长度为4字节;x长度为8字节;y长度为8字节;string长度为16字节。这种内存表称为基址绝对地址的内存表。

MAP              8192              ;内存表的首地址81920x2000

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       R0consta            ;将consta地址处对应的内容加载到R0

上面的指令仅仅可以访问LDR指令前后4KB地址范围的数据域。

示例12   基于相对地址的内存表举例

下面的伪操作序列定义一个内存表,其首地址为0R9寄存器值的和,该内存表中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       R9Field             ;伪指令

LDR       R5consta            ;相当于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[PCoffset]

在这里,内存表中各数据域的实际内存地址是基于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访问凌阳教育官网


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 1

    获赞
  • 3

    评论
  • 3815

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-26 09:04 , Processed in 0.015255 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部