版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
3ARM伪操作和伪指令第三章ARM指令分类伪操作,宏指令和伪指令ARM汇编语言源程序语句,一般由指令,伪操作,宏指令和伪指令组成.伪操作,是ARM汇编语言程序里的一些特殊的指令助记符,其作用主要是为完成汇编程序做各种准备工作,在源程序运行汇编程序处理,而不是在计算机运行期间有机器执行.也就是说,这些伪操作只是汇编过程中起作用,一旦汇编结束,伪操作的使命也就随之消失.
宏指令,是一段独立的程序代码,可以插在程序中,它通过伪操作来定义,宏在被使用之前必须提前定义好,宏之间可以互相调用,也可自己递归调用.通过直接书写宏名来使用宏.宏定义本身不产生代码,只是在调用它时把宏体插入到原程序中.宏与C语言中的子函数形参和实参的调用相似,但宏的调用与子程序的调用有本质的区别,既宏并不会节省程序的空间,其优点是简化程序代码,提高程序的可读性以及宏内容可以同步修改.
伪操作,宏指令一般与编译程序有关,因此ARM汇编语言的伪操作,宏指令在不同的编译环境下有不同的编写形式和规则.
伪指令也是ARM汇编语言程序里的特殊助记符,也不在处理器运行期间由机器执行,它们在汇编时将被合适的机器指令代替成ARM或Thumb指令,从而实现真正的指令操作.
1.符号定义伪操作符号定义伪指令用于定义ARM汇编程序的变量,对变量进行赋值以及定义寄存器名称。该类伪指令定义如下:全局变量声明:GBLA,GBLL,GBLS局部变量声明:LCLA,LCLL,LCLS变量赋值:SETA,SETL,SETSGBLA,GBLL,GBLS全局变量声明伪操作GBLA伪操作用于声明一个全局的算术变量,并将其初始化为0;GBLL伪操作用于声明一个全局的逻辑变量,并将其初始化为FALSEGBLS为操作用于声明一个全局的字符串变量,并将其初始化为空语法格式:GBLAvariableGBLLvariableGBLSvariable其中,variable定义的全局变量名,在其作用范围内必须唯一,全局变量的作用范围为包含该变量的源程序.举例如下:GBLLcodedbgcodedbgSETL{TRUE}LCLA,LCLL,LCLS局部变量声明伪操作,用于宏定义中.LCLA用于声明一个局部的算术变量,并将其初始化为0;LCLL用于声明一个局部的逻辑变量,并初始化为{FALSE}LCLS用于声明一个局部的字符串变量,并初始化为空.语法格式如下:LBLAvariableLBLLvariableLBLSvariable其中,variable定义的局部变量名,在其作用范围内必须唯一。局部变量的作用范围为包含该局部变量的宏中进行声明和使用。应用举例:MACRO;宏定义的开始SENDDAT$dat;宏名的定义和宏的参数LCLAbitno…BitnoSETA8…MEND;宏定义的结束SETA,SETL,SETS变量赋值伪操作,用于对已定义的全局变量,局部变量赋值SETA用于给一个全局/局部的算术变量赋值SETL用于给一个全局/局部的逻辑变量赋值SETS用于给一个全局/局部的字符串变量赋值格式:Variable_aSETAexpr_aVariable_lSETLexpr_lVariable_sSETSexpr_s例:GBLSErrStr…ErrStrSETS“hello”…2.数据定义伪操作数据定义伪操作用于数据表定义,文字池定义,数据空间分配,声明一个文字池:LTORG定义一个结构化的内存表首地址:MAP定义结构化内存表中的一个数据域:FIELD分配一块内存空间,并用0初始化:SPACE分配一段字节的内存单元,并用指令的数据初始化:DCB分配一段字的内存单元,并用指令的数据初始化:DCD和DCDULTORGLTORG用于声明一个文字池,在使用LDR伪指令时,要在适当的地址加入LTORG声明文字池,这样就会把要加载的数据保存到文字池内,在用ARM的加载指令读出数据.(若没有使用LTORG声明文字池,则汇编器会在程序末尾自动声明)举例:LDRR0,=0X12345678ADDR1,R1,R0;MOVPC,LR;LTORG;声明文字池,此地址存储0X12345678MAPMAP用于定义一个结构化的内存表的首地址.此时,内存表的位置计数器设置成该地址值为指令格式:MAPexpr,{vbase_register}其中,expr为数字表达式或者是程序的标号,当指令中没有vbase_register时,expr即为结构化内存表的首地址.当指令中包含这一项时候,结构化内存表的首地址为expr与vbase_register寄存器值的和.应用举例:MAP0X00,R9;定义内存表的首地址为R9TimerFIELD4;定义数据域Timer,长度为4字节AttribFIELD4;定义数据域Attrib,长度为4字节StringFIELD100;定义数据域String,长度为100字节…ADRR9,DataStart;LDRR0,Attrib;FIELDFIELD用于定义一个结构化内存表中的数据域为指令格式如下:{lable}FIELDexpr其中,lable当指令中包含这一项时,lable的值为当前内存表的位置计数器的值,汇编编译器处理了这条FIELD伪指令后,内存表计数器的值将加上exprexpr表示本数据域在内存表中所占用的字节数SPACESPACE用于分配一块内存单元,并用0初始化,伪指令格式:{lable}SPACEexpr其中,lable内存块起的始地址标号expr所要分配内存的字节数DataBufSPACE1000DCBDCB用于分配一段字节内存单元,并用伪指令中的expr初始化,一般用于定义数据表格,或文字符串伪指令格式如下:{lable}DCBexpr{,expr}{expr}…其中,lable内存块起始地址标号,expr可以为-128-255的数值或字符串,内存分配的字节数由expr个数决定应用举例:DISPTABDCB0X33,0X43,0X76,0X12DCB-130,20,36,55ERRSTRDCB“SENDDATAISERROR”,0DCDDCD用于分配一段内存单元,并用伪指令中的expr初始化,DCD伪指令分配的内存需要字对齐,一般用来定义数据表格或其他常数.伪指令格式如下:{lable}DCDexpr{,expr}{,expr}…其中,lable内存块起始地址标号。expr常数表达式或程序中的标号,内存分配字节数由expr个数决定VectorsLDRPC,ResetvAddrLDRPC,UndefinedAddr…ResetvAddrDCDResetUndefinedAddrDCDUndefined…Reset…Undefined
3.汇编控制伪操作汇编控制伪操作用于条件编译,宏定义,重复汇编控制,该类伪指令如下:条件汇编控制:IF,ELSE和ENDIF宏定义:MACRO和MEND重复汇编:WHILE和WENDIF,ELSE和ENDIFIF,ELSE,和ENDIF伪指令能够根据条件把一段代码包括在汇编程序内或将其排除在程序之外.伪指令格式如下:IFlogical_expr{ELSE}ENDIF其中,logical_expr用于控制的逻辑表达式,若条件成立,则代码段落在源程序中有效,若条件不成立,代码段1无效,同时若使用ELSE伪指令,代码段有效,应用举例如下:…IF{CONFIG}=16BNE_rt_udiv_1LDRR0,=_rt_div0BXR0ELSEBEQ_rt_div0MACRO和MENDMACRO和MEND伪指令用于宏定义。MACRO标识宏定义的开始,MEND标识宏定义的结束。用MACRO和MEND定义的一段代码,成为宏定义体,这样在程序中就可以通过宏指令多次调用该代码段。MACRO{$lable}macroname{$parameter}{$parameter}……;宏定义体MEND其中,$lable宏指令被展开时候,lable可被替换成相应的符号,通常为一个标号前使用$标识被汇编时将使用相应的值替代$后的符号,macroname为所定义的宏的名称。$parameter当宏指令被展开时将被替换成相应的值,类似于函数中的形式参数。宏的使用,首先要使用MACRO和MEND伪指令定义宏,包括宏定义体代码。在MACRO伪指令之后的第一行声明宏的原型,其中包含该宏定义的名称,及需要的参数。在汇编程序中可以通过该宏定义的名称来调用它。当源程序被汇编时候,汇编器将展开每个宏调用,用宏定义体代替源程序中的宏定义的名称,并用实际的参数值代替宏定义时的形式参数。无参数宏应用举例MACROCSI_SETBLDRR0,=RpdatgLDRR1,[R0]ORRR1,R1,#0x0xSTRR1,[R0]MEND带参数的宏定义程序举例:MACRO$IRQ_LableHANDLER$IRQ_ExceptionEXPORT$IRQ_LableIMPORT$IRQ_Exception$IRQ_LableSUBLR,LR,#4STMFDSP!,{R0-R3,R12,LR}MRSR3,CPSRSTMFDSP!,{R3}…MENDWHILE和WENDWHILE和WEND伪指令用于根据条件重复汇编相同的或几乎相同的一段源程序.伪指令格式:WHILElogical_expr;指令或伪指令代码段WEND其中,logical_expr用于控制的逻辑表达式,若条件成立,则代码段在汇编源程序中有效,并不断重复这段代码直到条件不成立应用举例如下:WHILEno<5noSETAno+1…WEND4.杂项伪操作杂项伪操作在汇编程序设计较为常用,如段定义操作,入口点设置伪操作,包含文件伪操作等。该类伪指令如下:边界对齐:ALIGN段定义:AREA指令集定义:CODE16和CODE32程序入口:ENTRY程序结束:END常量定义:EQU声明一个符号可以被其他文件引用:EXPORT和GLOBAL声明一个外部符号:IMPORT和EXTERN包含文件:GET和INCLUDEALIGNALIGN伪指令通过添加补丁字节使当前位置满足一定的对齐方式ALIGN{expr{,offset}}其中,expr数字表达式,用于指定对齐的方式。取值为2的n次幂,如1,2,4,8等,不能为0,没有expr,则默认为字对齐方式。Offset数字表达式,当前位置对齐到下面形式的地址处:offset+n×expr伪指令应用举例:通过ALIGN伪指令使程序中的地址标号字对齐:AREAExample,CODE,READONLY…SARTLDRR0,=Sdfjk…MOVPC,LRSdfjkDCB0X58ALIGNMOVR1,R3;…
在段定义AREA中,也可使用ALIGN伪指令对齐,AREAMyStack,DATA,NOINIT,ALIGN=2IrqStackSpaceSPACEIRQ_STACK_legth*4FiqStackSpaceSPACEFIQ_STACK_LEGTH*4AbtStackSpaceSPACEABT_STACK_LEGTH*4UndtStackSpaceSPACEUND_STACK_LEGTH*4AREAAREA伪指令用于定义一个代码段或数据段,ARM汇编程序设计采用分段式设计,一个ARM源程序至少需要一个代码段,大的程序可以包含多个代码段和数据段,伪指令格式:AREAsectionname{,attr}{,attr}…其中,sectionname所定义的代码段或数据段的名称,如果该名称是以数字开头的,则该名字必须用“︱︱”括起来,如︱1_datasec︱,还有些代码段具有约定的名字,如︱text︱表示C语言编译器产生的代码段或者C语言库相关的代码段。Attr表示代码段或数据段的属性。在AREA伪指令中,各属性之间用逗号隔开,各属性如下:ALIGN=expr。默认的情况下,ELF的代码段和数据段是4字节对齐的,expr可以取0-31的数值。CODE定义代码段,默认属性为READONLY;DATA定义为数据段,默认属性为READWRITE;NOINIT指定本数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或者将内存单元值初始化为0;READONLY,指定本段为只读,代码段的默认属性为READONLYREADWRITE,指定本段为可读可写,数据段的默认属性为READWRITE为指令应用举例如下:AREAExample,CODE,READONLYCODE16和CODE32CODE16伪指令指示汇编编译器后面的指令为16位的Thumb指令CODE32伪指令指示汇编编译器后面的指令为32位的ARM指令伪指令格式:CODE16CODE32CODE16和CODE32伪指令只是指示汇编编译器后面的指令的类型,伪指令本身并不进行程序状态的切换,要进行状态切换,可以使用BX指令操作.为指令应用举例:AREAExample,CODE,READONLYCODE32…使用CODE16和CODE32定义Thumb指令及ARM指令并用BX指令进行切换.AREAArmThumb,CODE,READONLYCODE32ADRR0,ThumbStart+1BXR0CODE16ThumbStartMOVR0,#10…ENDENDEND指令用于指示汇编编译器源文件已结束。每一个汇编源文件均要使用一个END伪指令,指示本源程序结束。伪指令格式:ENDENTRYENTRY伪指令用于指定程序的入口点。伪指令格式:ENTRY一个程序(可以包含多个源文件)中至少要有一个ENTRY,可以有多个ENTRY,但一个源文件中最多只有一个ENTRY伪指令应用举例如下:AREAExample,CODE,READONLYENTRYCODE32STARTMOVR1,#0X5FEQUEQU伪指令为数字常量,基于寄存器的值和程序中的标号定义一个名称.指令格式如下:NameEQUexpr{,type}其中,name要定义的常量的名称expre基于寄存器的地址值,程序中的标号,32位地址常量或32位常量Type当expr为32位常量时,可用type指示expr表示的数据类型,伪指令应用举例:T_bitEQU0X20PLLCONEQU0XE01FC080ABCEEQUlable+8EXPORT和GLOBALEXPORT声明一个符号可以被其他文件引用,相当于声明了一个全局变量.GLOBAL与EXPORT相同。指令格式:EXPORTsymbol{[WEAK]}GLOBAL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论