您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 第五课 ARM汇编语言程序设计基础
汇编语言程序的结构CODE32AREAcodesec,CODE,READONLYmainPROCSTMFDSP!,{LR}ADRR0,strhelloBL_printfBLwelcomefunLDMFDSP!,{LR}strhello;32位ARM指令段代码段属性只读;函数main;相关寄存器入栈;strhello地址;调用库函数;调用子函数welcomefun;相关寄存器出栈DCB“Helloworld!\n\0”;定义14字节的字节空间ENDP;mainPROC结束welcomefunSTMFDSP!,{LR};子函数welcomefun;相关寄存器入栈ADRR0,adrstrarm;adrstrarm的地址LDRR0,[R0,#0];strarm的值存入r0BL_printf;调用库函数LDMFDSP!,{LR};相关寄存器出栈adrstrarmDCDstrarm;保存strarm的地址AREAconstdatasec,DATA,READONLY,ALIGN=0strarmDCB“WelcometoARMworld!\n\0”;存放字符串EXPORTmain;全局标号main,供外部调用...END;程序结束数据段指定数据段单字节对齐ARM汇编程序中每一行的通用格式为:{标号}指令|伪操作|伪指令操作数{;注解}。在ARM汇编语言源程序中,除了标号和注释外,指令、伪指令和指示符都必须有前导空格,而不能顶格书写。如果每一行的代码太长,可以使用字符“\”将其分行书写,并允许有空行。指令、伪操作和寄存器名既可以用大写字母,也可以用小写字母,但不能混用。注释从“;”开始,到该行结束为止。标号代表一个地址,段内标号的地址值在汇编时确定,段外标号的地址值在链接时确定。ARM汇编程序设计ARM汇编语句格式;R0=0x1123456ARM汇编语句格式;标号start没有顶格写;标号后不允许带:;命令不允许顶格书写;指令中大小写不可混合;标号Loop不存在伪操作、宏指令及伪指令的概念伪操作是ARM汇编语言程序里的一些特殊指令助记符,主要是为完成汇编程序做各种准备工作,在源程序进行汇编时由汇编程序处理,而不是在处理器运行期间由机器执行。伪指令也是ARM汇编语言程序里的特殊指令助记符,也不在处理器运行期间由机器执行,它们在汇编时将被合适的机器指令代替成ARM或Thumb指令从而实现真正指令操作。宏指令是一段独立的程序代码,它通过伪操作来定义。通过宏名来调用宏,并可以设置相应的参数。宏定义本身不会产生代码,只是在调用它时把宏体插入到源程序中。伪操作符号定义(SymbolDefinition)伪操作数据定义(DataDefinition)伪操作汇编控制(AssemblyControl)伪操作其他(Miscellaneous)伪操作1、符号定义伪操作伪操作语法格式作用GBLAGBLAVariable声明一个全局的算术变量,并将其初始化成0。GBLLGBLLVariable声明一个全局的逻辑变量,并将其初始化成{FALSE}。GBLSGBLSVariable声明一个全局的字符串变量,并将其初始化成空串“”。LCLALCLAVariable声明一个局部的算术变量,并将其初始化成0。LCLLLCLLVariable声明一个局部的逻辑变量,并将其初始化成{FALSE}。LCLSLCLSVariable声明一个局部的串变量,并将其初始化成空串“”。SETASETAVariableexpr给一个全局或局部算术变量赋值。SETLSETLVariableexpr给一个全局或局部逻辑变量赋值。SETSSETSVariableexpr给一个全局或局部字符串变量赋值。RLISTnameLIST{listofregisters}为一个通用寄存器列表定义名称。CNnameCNexpr为一个协处理器的寄存器定义名称。CPnameCPexpr为一个协处理器定义名称。DN/SNnameDN/SNexprDN/SN为一个双精度/单精度的VFP寄存器定义名称。FNnameFNexpr为一个FPA浮点寄存器定义名称。符号定义伪操作举例GBLAarithmetic;定义变量arithmiticSETA0xEF;赋值GBLLlogicallogicalSETL{TRUE};{}GBLSstringstringSETS“haha”;””成对出现:定义+赋值符号定义伪操作举例LCLAarithmeticarithmiticSETA0xEFLCLLlogicallogicalSETL{TRUE}LCLSstringstringSETS“haha”RLIST可为要用LDM或STM指令传送的一组寄存器指定名称。ContextRLIST{r0-r6,r8,r10-r12,r15}例如:PblockRLIST{R0-R3,R7,R5,R9};将寄存器列表名称定义为pblock,可在ARM指令;LDM/STM中通过该名称访问寄存器列表。STMFDSP!,pblock;由高到低访问,R9先入栈STMFASP!,pblock;由低到高访问,,R0先入栈STMSP!,pblock;出错在LDM/STM指令中,列表中的寄存器根据寄存器的编号确定其访问次序,与列表中的寄存器排列次序无关。低编号寄存器对应低地址存储单元,高编号寄存器对应高地址存储单元。程序中的变量代换程序中的变量可通过代换操作取得一个常量。代换操作符为“$”。如果在数字变量前面有一个代换操作符“$”,编译器会将该数字变量的值转换为十六进制的字符串,并将该十六进制的字符串代换“$”后的数字变量。如果在逻辑变量前面有一个代换操作符“$”,编译器会将该逻辑变量代换为它的取值(真或假)。如果在字符串变量前面有一个代换操作符“$”,编译器会将该字符串变量的值代换“$”后的字符串变量。LCLSS1;定义局部字符串变量S1和S2LCLSS2S1SETS“Test!”S2SETS“Thisisa$S1”;字符串变量S2的值为“ThisisaTest!”伪操作符号定义(SymbolDefinition)伪操作内存分配(数据定义)(DataDefinition)伪操作汇编控制(AssemblyControl)伪操作其他(Miscellaneous)伪操作2、数据定义伪操作-列表伪操作语法格式作用MAPMAPexpr{,base-register}定义一个结构化的内存表的首地址=expr{+BR}FIELD{label}FIELDexpr定义一个结构化内存表中的数据域长度expr(B)。SPACE{label}SPACEexpr分配一块连续内存单元expr(B),并用0初始化。DCB{label}DCBexpr{,expr}分配一段字节内存单元,并用expr初始化。DCD/DCDU{label}DCDexpr{,expr}…分配一段字内存单元。DCDO{label}DCDOexpr{,expr}…分配一段字对齐的字内存单元。DCFD/DCFDU{label}DCFD{U}fpliteral{,fpliteral}…为双精度的浮点数分配字对齐的内存单元。DCFS/DCFSU{label}DCFS{U}fpliteral{,fpliteral}…为单精度的浮点数分配字对齐的内存单元。DCI{label}DCIexpr{,expr}…在ARM代码中分配一段字对齐的内存单元;在Thumb代码中,分配一段半字对齐的半字内存单元。DCQ/DCQU{label}DCQ{U}{﹣}literal{,{﹣}literal}…分配一段以双字(8个字节)为单位的内存DCW/DCWU{label}DCW{U}expr{,expr}…DCW用于分配一段半字对齐的半字内存单元。2、数据定义伪操作-数据内存表MAP8192constaFIELD4MAP0,R9xFIELD8yFIELD8MAPDatastringFIELD16MAP、FIELD语法格式MAPexpr{,base-register};定义一个结构化的内存表的首地址=expr{+base-register}{label}FIELDexpr;定义一个结构化内存表的数据域长度为expr字节。2、数据定义伪操作-数据内存表MAP8192constaFIELD4constbFIELD4xFIELD8yFIELD8stringFIELD16使用:LDRR0,consta;LDRR0,[8192]MAP、FIELD基于绝对地址的内存表举例2、数据定义伪操作-数据内存表MAP0,R9constaFIELD4constbFIELD4xFIELD8yFIELD8stringFIELD16使用:LDRR0,constb;LDRR0,[R9,#4]MAP、FIELD基于相对地址的内存表举例内存表中各数据域的实际内存地址不是基于一个固定的地址,而是基于LDR指令执行R9寄存器中的内容。;内存表的首地址为0+R92、数据定义伪操作——连续内存分配DataSPACE100;分配100字节的内存单元,并初始化为0{label}SPACEexpr语法格式2、数据定义伪操作-字节内存分配伪操作语法格式作用MAPMAPexpr{,base-register}定义一个结构化的内存表的首地址=expr{+BR}FIELD{label}FIELDexpr定义一个结构化内存表中的数据域长度expr(B)。SPACE{label}SPACEexpr分配一块连续内存单元expr(B),并用0初始化。DCB{label}DCBexpr{,expr}分配一段字节内存单元,并用expr初始化。DCD/DCDU{label}DCDexpr{,expr}…分配一段字内存单元。DCDO{label}DCDOexpr{,expr}…分配一段字对齐的字内存单元。DCFD/DCFDU{label}DCFD{U}fpliteral{,fpliteral}…为双精度的浮点数分配字对齐的内存单元。DCFS/DCFSU{label}DCFS{U}fpliteral{,fpliteral}…为单精度的浮点数分配字对齐的内存单元。DCI{label}DCIexpr{,expr}…在ARM代码中分配一段字对齐的内存单元;在Thumb代码中,分配一段半字对齐的半字内存单元。DCQ/DCQU{label}DCQ{U}{﹣}literal{,{﹣}literal}…分配一段以双字(8个字节)为单位的内存DCW/DCWU{label}DCW{U}expr{,expr}…DCW用于分配一段半字对齐的半字内存单元。2、数据定义伪操作-字节内存分配DCBStringDCB“student”;以字节为单位“=”是DCB的同义词{label}DCBexpr{,expr}语法格式2、数据定义伪操作-字内存分配DCDaddrMOVR0,R1…Data1DCD1,5,20{label}DCDexpr{,expr}语法格式2、符号和数据定义伪操作-说明变量:通常具有“值可变”和“分配内存”两个特性。变量供指令使用。例如用DCB/D定义的符号伪变量:只具有“值可变”一个特性。供编译器使用,在程序编译后,所有的伪变量将被真值替换。例如用GBLx定义的符号。实例:GBLAarithmeticarithmiticSETA0xEFMOVR0,#arithmetic编译后只有一行代码为:MOVR0,#0xEF伪操作符号定义(SymbolDefinition)伪操作内存分配(数据定义)(DataDefinition)伪操作汇编控制(AssemblyControl)伪操作其他(Miscellaneous)伪操作3、汇编控制伪操作伪操作语法格式作用IFELSEENDIFIFlogicalexpression…{ELSE…}ENDIF能够根据条件把一段源代码包括在汇编语言程序内或者将其排除在程序之外。WHILEWENDWHILElogicalexpression…WEND能够根据条件重复汇编
本文标题:第五课 ARM汇编语言程序设计基础
链接地址:https://www.777doc.com/doc-5532064 .html