《ARM汇编程序基本知识》由会员分享,可在线阅读,更多相关《ARM汇编程序基本知识(4页珍藏版)》请在金锄头文库上搜索。
1、ARM汇编程序基本知识1汇编程序的基本组成ARM汇编语言程序中,程序是以程序段为单位组织代码的。段是相对独立的指令或者代码序列,拥有特定的名称。段的种类有代码段、数据段和通用段,代码段的内容为执行代码,数据段存放代码运行时需要用到的数据,通用段不包含用户代码和数据,所有通用段共用一个空间。段使用AREA伪操作来定义,并且说明相关属性,如代码段定义AREAInit,CODE,READONLY数据段定义AREAStack1,DATA,READWRITE,NOINIT,ALIGN=3一个汇编程序至少应该有一个代码段,可以有零或者多个数据段。在格式上,一个汇编程序需要至少有一个ENTRY(关于ENTR
2、Y具体内容看伪操作符ENTRY),还需要在汇编源文件结束处,写上END表示该源文件的结束。如一个基本的汇编源程序AREAInit,CODE,READONLY;定义一个代码段ENTRY;标记程序入口点StartLDRR0,0x3FF5000标号Start可以要,也可以不要LDRR1,0XffSTRR1,R0LDRR0,=0x3FF5000LDRR1,0x01STRR1,R0END;END伪操作表示本源文件结束当汇编程序较长时,可以分割为多个代码段和多个数据段,多个段在程序编译链接时,最终形成一个可执行的映像文件。一个可执行映像文件通常由以下几部分组成丄一个或者多个代码段,代码段属性为只读(只读数
3、据也放在代码段?R0)丄零个或者多个初始化数据的数据段,可读写(存放初始化了的变量数据,RW)丄零个或者多个不包含初始化数据的数据段,可读写(所有未初始化的变量,也就是ZI)链接器根据系统默认或者用户设定的规则,将各段安排在存储器中的相应位置,因此源程序中段之间的相对位置与可执行映像文件中的段的相对位置一般不会相同。汇编语句应该注意的地方汇编语句格式LABELOPERATION,OPERAND,;COMMENTLABEL必须在一行的开头写。OPERATION包括指令、伪操作、宏指令或伪指令。每一条操作助记符必须全部大写或者全部小写。在写操作助记符前,必须有空格。OPERAND表示操作的对象,可
4、以使常量、变量、标号、寄存器或者表达式,不同的对象之间必须用逗号分开。例子:AREAEX2,CODE,READONLY;操作助记符前面必须有空格GBLADATA;操作助记符前面必须有空格DATASETA,0x20变量名DATA前面不能留空格ADDR0,R1,R2ADDR0,R1,r2addR0,R1,r2AddR0,R1,r2;寄存器小写正确,指令助记符大小写混合错误常用符号汇编语言中,经常使用各种符号表示变量、常量和地址。变量的定义:使用伪操作GBLA、GBLL、GBLS,分别是定义全局的数值变量、逻辑变量和字符变量;LCLA、LCLL、LCLS定义局部的数值变量、逻辑变量和字符变量。相应的
5、变量使用SETA、SETL、SETS来进行赋值。注意字符串长度不应超过512个字节。例子:GBLADATADATASETA0x20LCLSstrlstrlSETS“PEN”LCLLlclcSETLTRUE常量是在运行过程中不能改变的量。ARM支持数值常量、逻辑常量和字符串常量。汇编中使用EQU来定义一个数值常量,如TestEQU10;定义标号Test的值为20.AddrEQU0x55,CODE32;关于EQU的具体使用,看伪操作EQU。数值常量一般为32为的整数,可以使十进制、十六进制,也可以是n进制(n=29)如8_247是一个八进制数。常见的伪操作符符号定义伪操作GBLA、GBLL、GBL
6、SLCLA、LCLL、LCLSSETA、SETL、SETSRLIST其中RLIST用来定义通用寄存器列表名称,使用该伪操作定义的名称可以在ARM指令LDM/STM中使用。在LDM/STM中,访问列表中的寄存器次序为寄存器编号由低到高的顺序。如RegListRLISTr0-r5,r8,门0;将寄存器列表名称定义为RegList在程序中使用STMFDSP!,RegList;存储列表到堆栈LDMIAR5,RegList;加载列表数据定义伪操作DCB分配一片连续的字节存储单元并初始化DCW(DCWU)分配一片连续的半字存储单元并初始化DCD(DCDU)分配一片连续的字存储单元并初始化DCDO、DCI、
7、DCQ(DCQU)DCFS(DCFSU)为单精度浮点数分配一片连续的字存储单元并初始化DCFD(DCFDU)为双精度浮点数分配一片连续的字存储单元并初始化SPACE分配一片连续的存储单元FIELD、MAP、LTORG如:StrDCB“thisisat分配一片连续的字节存储单元并初始化DataDCW1,2,3;分配一片连续的半字存储单元并初始化DataDCD4,5,6;分配一片连续的字存储单元并初始化FdataDCFS2e5,-5e-7分配一片连续的字存储单元并初始化为指定的单精度数DspceSPACE100;分配连续100字节的存储单元并初始化为0控制伪操作IFELSEENDIFWHILEWE
8、NDMACROMEND;MEXIT信息扌报告伪操作ASSERTINFOOPT其他常用伪操作AREAALIGNCODE16/CODE32ENTRYENDEQUEXPORT(GLOBLE)IMPORTEXTERNGET(INCLUDE)INCBINRNROUTAREA格式:AREA段名属性1,属性2,常用属性有:CODE:用于定义代码段,默认为READONLYDATA:定义数据段,默认为READWRITEREADONLY:指定本段为只读READWRITE:指定本段为读写ALIGN:使用方式为ALIGN表达式。在默认时,ELF(可执行链接文件)的代码段和数据段是按字对齐的。表达式的取值范围为031,
9、相应的对齐方式为2次幕。COMMON:定义一个通用的段,不包含任何用户的代码和数据。各源文件中同名的COMMON段共享同一段存储单元。ALIGN格式:ALIGN表达式,偏移量ALIGN伪操作可通过添加填充字节的方式,使当前位置满足一定的对齐方式。例:DATA1DCB“STRIN”;定义后不能保证地址对齐ALIGN4;确保当前地址是4字节对齐例:AREACache,CODE,ALIGN=3;指定本代码段的指令时23=8字节对齐的MOVPC,LR;程序跳转后是4字节对齐,返回后需要继续8字节对齐ALIGN8;当前位置再次满足8字节对齐注意上面,在AREA中使用和单独使用ALIGN的区别,格式和计算
10、方式不一样。ENTRY用于指定汇编程序的入口点。一个程序可以由一个或者多个源文件组成,一个源文件由一个或者多个程序段组成。一个程序至少有一个入口点,也可有多个入口点,但是在一个源文件中,最多只能有一个ENTRY。当有多个ENTRY时,程序的真正入口点由链接器指定。编译程序在编译连接时根据程序入口点进行连接。在只有一个入口点时,编译程序会把这个入口点的地址定义为系统复位后的程序起始点。END在源文件结束处写上,表示源程序的结尾。EXPORT格式:EXPORT标号,WEAK声明一个全局标号,该标号在其他文件中可引用。WEAK表示碰上其他同名标号时,其他标号优先。AREAINIT,CODE,READ
11、ONLYEXPORTStestENDIMPORT格式:IMPORT标号,WEAK表示该引用的标号在其他源文件中,但要在当前文件中引用。WEAK表示找不到该标号时,也不报错,一般讲该标号值置为0如果是B或者BL使用到,则该指令置为NOP。与EXTERN的不同的是,无论当前文件是否引用该标号,该标号都被加入当前源文件的符号表中。AREAINIT,CODE,READONLYIMPORTMAIN;ENDEXTERN和IMPORT一样,不同之处在于,如果当前文件没有引用该标号,该标号不会加入当前源文件的符号表中。GET(或INCLUDE)将一个源文件包含到当前的源文件中,并在当前位置进行编译。AREAINIT,CODE,READONLYGETal.sGETC:/a2.sENDINCBIN将一个目标文件或者数据文件包含到当前,文件内容被原封不动的放在当前位置,编译器不对文件内容进行编译。AREAINIT,CODE,READONLYGETal.s;包含al.s并且对al.s进行编译INCBINC:/d.txt;包含d.txt,不对内容进行编译GETa2.s;包含a2.s,并对内容进行编译ENDRN给一个寄存器定义一个别名。TempRN,RO;将R0定义一个另Ll名Temp