资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,嵌入式系统及应用,第六章,ARM,汇编语言程序设计,ARM,伪指令,汇编程序设计,ARM,伪指令,伪指令不像机器指令那样在处理器运行期间由机器执行,而是在汇编时会被合适的机器指令代替,实现真正机器指令操作;,地址读取伪指令,ADR,伪指令,小范围的地址读取伪指令,.ADR,指令将基于,PC,相对偏移的地址值读取到寄存器中,.,在汇编编译源程序时,ADR,伪指令被编译器替换成一条合适的指令,.,通常,编译器用一条,ADD,指令或,SUB,指令来实现该,ADR,伪指令的功能;,指令格式:,ADRcond,register,exper,地址读取伪指令,ADRL,伪指令,中等范围的地址读取伪指令,.ADRL,指令将基于,PC,相对偏移的地址值或基于寄存器 相对偏移的地址值读取到寄存器中,比,ADR,伪指令可以读取更大范围的地址。在汇编编译源程序时,,ADRL,伪指令被编译器替换成两个条合适的指令。,指令格式,ADRLcond,register,exper,地址读取伪指令,LDR,伪指令,大范围的地址读取伪指令,.LDR,伪指令用于加载,32,位的立即数或一个地址值到指定 寄存器,.,指令格式,LDRcondregister,=,expr/label_expr,举例,LDR R0,=0 x123456LDR R0,=DATA_BUFFER+0 x10.LTORG,NOP,伪指令,空操作伪指令,无操作,用于实现延时;,举例,DELAY1NOP,NOP,NOP,SUBS R1,R1,#1BNE DELAY1,变量定义伪指令,全局变量声明,GBLA variable,:全局数值变量,GBLL variable,:全局逻辑变量,GBLS variable,:全局字符串变量,局部变量声明,LBLA variable,:局部数值变量,LBLL variable,:局部逻辑变量,LBLS variable,:局部字符串变量,变量赋值伪指令,给变量复制:,SETA,伪指令用于给一个全局,/,局部的算术变量赋值,.,SETL,伪指令用于给一个全局,/,局部的逻辑变量赋值,.,SETS,伪指令用于给一个全局,/,局部的字符串变量赋值,.,变量定义,/,赋值伪指令举例,GBLL,CodeDbg,CodeDbg,SETL TRUE.GBLA,ByteNo,ByteNo,SETA 8.GBLS,ErrStr,ErrStr,SETS No,semaphone,.,RLIST,伪指令,RLIST,为一个通用寄存器列表定义名称:,name RLIST,reglist,举例:,LoReg,RLIST R0-R7,数据定义伪指令,数据定义伪指令用于数据表定义,文字池定义,数据空间分配等:声明一个文字池:,LTORG,分配一块内存空间,并用,0,初始化,:SPACE,分配一段字节的内存单元,并用指定的数据初始化:,DCB,分配一段字的内存单元,并用指令的数据初始化:,DCD,和,DCDU,LTORG,伪指令,LTORG,用于声明一个文字池,(literal-pool),在使用,LDR,伪指令时,要在适当的地址加入,LTORG,声明 文字池,这样就会把要加载的数据保存在文字池内,再用,ARM,的加载指令读出数据:,LTORG,举例:,LDR R0,=0 x12345678ADD R1,R1,R0MOV PC,LRLTORG,SPACE,伪指令,SPACE,用于分配一块内存单元,并用,0,初始化,.%,与,SPACE,同义:,label SPACE,expr,举例:,DataBuf,SPACE 1000;,分配,1000,字节,DCB,伪指令,DCB,用于分配一段字节内存单元,并用伪指令中的,expr,初始化,.,一般可用来定义数 据表格,或文字符串,.=,与,DCB,同义:,label DCB,expr,expr,expr,.,举例:,DISPTAB DCB 0 x33,0 x43,0 x53DCB 0 x10,0 x20,0 x30ERRSTR DCB Send data error.,0,DCD,伪指令,DCD,用于分配一段字内存单元,并用伪指令中的,expr,初始化,.&,与,DCD,同义:,label DCD,expr,expr,expr,举例:,VectorsLDR,PC,ResetAddr,LDR,PC,UndefinedAddr,ResetAddr,DCDReset,UndefinedAddr,DCD UndefinedReset.,汇编控制伪指令,汇编控制伪指令用于条件汇编,宏定义,重复汇编控制等:条件汇编控制,:IF,ELSE,和,ENDIF,宏定义,:MACRO,和,MEND,重复汇编,:WHILE,及,WEND,IF,、,ELSE,和,ENDIF,伪指令,IF,ELSE,和,ENDIF,伪指令能够根据条件把一段代码包括在汇编程序内或将其排除 在程序之外:,IF,logical_expr,.ELSE.ENDIF,MACRO,和,MEND,伪指令,MACRO,和,MEND,伪指令用于宏定义,.MACRO,标识宏定义的开始,MEND,标识宏定义久的 结束,.,用,MACRO,及,MEND,定义的一段代码,称为宏定义体:,MACRO$label,macroname,para1para2;,宏体定义,MEND,MACRO,和,MEND,伪指令,举例:,MCARO$,IRQ_Label,HANDLER$,IRQ_Exception,EXPORT$,IRQ_Lable,IMPORT$,IRQ_Exception,$,IRQ_Lable,SUB LR,LR,#4STMFD SP!,R0-R3,R12,LRMRS R3,STSRSTMFD SP!,R3.MEND,DCD,伪指令,WHILE,和,WEND,伪指令用于根据条件重复汇编相同的或几乎相同的一段源程序:,WHILE,logical_expr,WEND,举例:,WHILE no 5no SETA no+1.WEND,杂项伪指令,边界对齐,:ALIGN,段定义,:AREA,指令集定义,:CODE16,和,CODE32,汇编结束,:END,程序入口,:ENTRY,常量定义,:EQU,声明符号可以被外部引用,:EXPORT,和,GLORBAL,声明一个外部符号,:IMPORT,和,EXTERN,包含文件,:GET,和,INCLUDE,包含不被汇编的文件,:INCBIN,ALIGN,伪指令,ALIGN,伪指令通过添加补丁字节使当前位置满足一定的对齐方式:,ALIGN,expr,举例:,.,ByteBuf,DCB0 x10ALIGN 4.,AREA,伪指令,AREA,伪指令用于定义一个代码段或数据段,.ARM,汇编程序设计采用分段式设计,一 个,ARM,源程序至少需要一个代码段,大的程序可以包含多少个代码段及数据段:,AREA,sectionname,attr,attr,举例:,AREA,Example,CODE,READNOLY,AREA,伪指令,ALIGN:,定义对齐方式,CODE,:定义代码段,COMDEF,:定义一个可包含代码和数据的通用段,COMMON,:定义一个通用的段,DATA,:定义数据段,NOINIT,:无需初始化,READONLY,:指定本段为只读,代码段的默认属性为,READONLY,;,READWRITE,:指定本段为可读可写,.,数据段的默认属性为,READWRITE,;,CODE16,和,CODE32,伪指令,CODE16,伪指令指示汇编编译器后面的指令为,16,位的,Thumb,指令;,CODE32,伪指令指示汇编编译器后面的指令为,32,位的,ARM,指令;,CODE16CODE32,举例:,AREA Example CODE,READONLY CODE32,END,伪指令,END,伪指令用于指示汇编编译器源文件已结束,.,每一个汇编源文件均要使用一个,END,伪指令,指示本源程序结束;,END,举例:,.;,汇编文件内容,END,ENTRY,伪指令,ENTRY,伪指令用于指定程序的入口点:,ENTRY,举例:,AREA,EXample,CODE,READONLY,ENTRYCODE32START MOV R1,#0 x10.,EQU,伪指令,EQU,伪指令为数字常量,基于寄存器的值和程序中的标号定义一个名称。*与,EQU,同义:,name EQU,expr,type,举例:,T_bit,EQU 0 x20 ABCD EQU label+8,EXPORT,和,GLOBAL,伪指令,EXPORT,声明一个符号可以被其它文件引用,.,相当于声明了一个全局变量,.GLOBAL,与,EXPORT,相同:,EXPORT symbolGLOBAL symbol,举例:,EXPORT,InitStack,GLOBAL Vectors,IMPORT,和,EXTERN,伪指令,IMJPORT,伪指令指示编译器当前的符号不是在本源文件中定义的,而是在其他源文 件中定义的,在本源文件中可能引用该符号,.EXTERN,与,IMPORT,相同:,IMPORT symbolEXTERN symbol,举例:,IMPORT,InitStack,EXTERN Vectors,GET,和,INCLUDE,伪指令,GET,伪指令将一个源文件包含到当前源文件中,并将被包含的文件在具当前位置进 行汇编处理,INCLUDE,与,GFT,同义:,GET filenameINCLUDE filename,举例:,INCLUDE s3c44b0.inc,INCBIN,伪指令,INCBIN,伪指令将一个文件包含到当前源文件中,而被包含的文件不进行汇编处理:,INCBIN filename,举例:,INCBIN,charlib.bin,ARM,汇编程序设计,文件格式,编写规范,子程序调用,数据块拷贝,查表操作,完整的例子,文件格式,汇编规范,标号必须在一行的顶格书写,其后面不要添加,:,,而指令均不能顶格书写,;,ARM,汇编器对标识符大小写敏感,书写标号及指令时字母大小写要一致,;,注释使用,;,,注释内容由,;,开始到此行 结束,注释可以在一行的顶格书写,;,汇编规范,正确的例子,.Str1 SETS My string.0USR_STACK EQU 64START LDR R0,=0 x11223456;,地址送,R0MOV R1,#0LOOPMOV R2,#2,汇编规范,不正确的例子,.START MOV R0,#1ABC:MOV R1,#2MOV R2,#3loop,Mov,R2,#3B Loop,子程序调用,用,BL,指令进行调用,该指令会把返回的,PC,值保存在,LR,举例,.BL DELAY,;调用子程序,.DELAY.MOV PC,LR,;子程序返回,数据比较跳转,汇编程序可以使用,CMP,指令进行两个数据比较,然后调用相应的,ARM,条件码,实现跳转;,举例,CMP R5,#10BEQ DOEQUAL.CMP R1,R2ADDHI R1,R1,#10ADDLS R1,R1,#5.ANDS R1,R1,#0 x80BNE WAIT,循环,MOV R1,#10;,循环次数,LOOP.;,循环体,SUBS R1,R1,#1BNE LOOP.,数据块复制,LDR R0,=DATA_DSTLDR R1,=DATA_SRCMOV R10,#10LOOP LDMIA R1!,R2-R9STMIA R0!,R2-R9SUBS R10,R10,#1BNE LOOP,栈操作,ARM,使用存储器访问指令,LDM/STM,实现栈操作,用于子程序寄存器保存,.,注意,使用 堆栈时,要先分配好堆栈空间,设置好寄存器,R13(,即堆栈指针,SP),否则操作失败,.,举例,STMFD SP!,R0-R7,LR.BL DELAY.LDMFD SP!,R0-
展开阅读全文