原创 ARM汇编语言

2007-1-4 23:49 3492 4 4 分类: MCU/ 嵌入式

1.       数据定义伪操作


数据定义伪操作,用于数据缓冲池定义,数据表定义,数据空间分配等,包括以下的伪操作。


1.1   LTORG


LTORG用于声明一个数据缓冲池,(也称为文字池)的开始。在使用伪指令LDR时,常常需要在适当的地方加入LTORG声明数据缓冲池,LDR加载的数据暂时放于数据缓冲池。


语法 LTORG


使用说明:


当程序中使用LDR之类的指令时,数据缓冲池的使用可能越界。为防止越界发生,可使用LTONG伪操作定义数据缓冲池。通常大的代码段可以使用多个数据缓冲池。ARM汇编编译器一般把数据缓冲池放在代码段的最后面,即下一代码段开始之前,或者END伪操作之前。LTORG伪操作通常放在无条件跳转指令之后,或者子程序返回指令之后,这样处理器就不会错误的将数据缓冲池中的数据当作指令来执行。


举例:


AREA   Example ,CODE,READONLY;  //声明一个代码段,名称为Example,属性为只读


Start    BL  funcl


         ….


Funcl;                              //子程序


LDR  R1=0x800;                  //0X800加载到R1


MOV  PCLR                   //子程序结束


LTORG                          //定义数据缓冲池


Data   SPACE 40                 //从当前开始分配40字节的内存单元并初始化为0


END                            //程序结束


1.2   MAP


MAP用于定义一个结构化的内存表(StorageMAP)的首地址。此时,内存表的位置计数器{VAR}(汇编器的内置变量)设置成该地址值。MAP可以用”^”代替。


语法:MAP  expr {,base-register}


其中,expr为数字表达式或者是程序中已经定义过的标号。Base-register为一个寄存器。当指令中没有Base-register时,expr为结构化内存表的首地址。此时,内存表的位置计数器{VAR}设置成该地址值。当指令中包含这一项时,结构化内存表的首地址为exprBase-register寄存器内容的和。


使用说明:MAP伪操作和FIELD伪操作配合使用来定义结构化的内存表结构。


举例:MAP伪操作


MAP  fun  ;fun就是内存表的首地址


MAP   0x100,R9  ;内存表的首地址为 R9+0x100


1.3   FIELD


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


语法:{label} FIELD expr


其中:{label}为可选的。当指令中包含这一项时,label的值为当前内存表的位置计数器{VAR}的值。汇编编译器处理了这条FIELD伪操作后。内存表计数器的值将加上expr.expr表示本数据域在内存中所占的字节数。


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


MAP伪操作中的Base-registe寄存器值队以其后所有FIELD伪操作定义的数据域是默认使用的,直到遇到新的包含Base-registe项的MAP伪操作


需要特别注意的是,MAP伪操作和FIELD伪操作仅仅是定义数据结构,他们并不实际分配内存单元。由MAP伪操作和FIELD伪操作配合定义的内存表有3种:基于绝对地址的内存表,基于相对地址的内存表和基于PC的内存表。


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


用伪操作序列定义一个内存表,其首地址为固定的地址81920X2000),该内存表中包括5个数据域。Consta长度为4个字节;constb长为4个字节,x长为8字节;y长为8字节;string长为16字节。这种内存表成为基于绝对地址的内存表。


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


Consta FIELD 4 ; //consta 长为4字节,相对位置为0


Constb FIELD 4; //constb长为4字节,相对位置为4


X   FIELD  8; // X长为8字节,相对位置为8<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


Y    FIELD 8; // y长为8字节,相对位置为16


String FIELD 16 ;// String16字节,相对位置为24


在指令中,可以这样引用内存表中的数据域;


LDR R0consta //consta地址处对应内存加载到R0


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


举例:相对绝对地址的内存表


下面的伪操作序列定义一个内存表,其首地址为0R9寄存器值得和,该内存表中包含5个数据域。这种表称为相对地址的内存表。


MAP 0R9//内存表的首地址寄存器R9的值


Consta FIELD 4 ; //consta 长为4字节,相对位置为0


Constb FIELD 4; //constb长为4字节,相对位置为4


X   FIELD  8; // X长为8字节,相对位置为8


Y    FIELD 8; // y长为8字节,相对位置为16


String FIELD 16;// String16字节,相对位置为24


可以通过下面的指令访问地址范围超过4KB的数据;


ADR  R9 Field ;  //伪指令


LDR  R5Constb//相当于LDR R5[R9#4]


在这里,内存表中的数据都是相对于R9寄存器的内容,而不是相对于一个固定的地址。通过在LDR中指定不同的基址寄存器的值,定义的内存表结构可以在程序中有多个实例。可多次使用LDR指令,用以实现不同的程序实例。


举例:基于PC的内存表


Data   SPACE 100 ; //分配100字节的内存单元,并初始化为0


MAP Data//内存表的首地址为Datastruc内存单元


Consta FIELD 4 ; //consta 长为4字节,相对位置为0


Constb FIELD 4; //constb长为4字节,相对位置为4


X   FIELD  8; // X长为8字节,相对位置为8


Y    FIELD 8; // y长为8字节,相对位置为16


String FIELD 16;// String16字节,相对位置为24


可以通过下面的指令访问范围不超过4kb的数据;


LDR R5constb ;相当于 LDR R5,[PC,offset]


 


 


 


 


 


 


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /1 下一条