嵌入式系统及应用-Chapter06-汇编语言程序设计.ppt_第1页
嵌入式系统及应用-Chapter06-汇编语言程序设计.ppt_第2页
嵌入式系统及应用-Chapter06-汇编语言程序设计.ppt_第3页
嵌入式系统及应用-Chapter06-汇编语言程序设计.ppt_第4页
嵌入式系统及应用-Chapter06-汇编语言程序设计.ppt_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统及应用 第六章ARM汇编语言程序设计 ARM伪指令 汇编程序设计 ARM伪指令 伪指令不像机器指令那样在处理器运行期间由机器执行 而是在汇编时会被合适的机器指令代替 实现真正机器指令操作 地址读取伪指令 ADR伪指令小范围的地址读取伪指令 ADR指令将基于PC相对偏移的地址值读取到寄存器中 在汇编编译源程序时 ADR伪指令被编译器替换成一条合适的指令 通常 编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能 指令格式 ADR cond register exper 地址读取伪指令 ADRL伪指令中等范围的地址读取伪指令 ADRL指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中 比ADR伪指令可以读取更大范围的地址 在汇编编译源程序时 ADRL伪指令被编译器替换成两个条合适的指令 指令格式ADRL cond register exper 地址读取伪指令 LDR伪指令大范围的地址读取伪指令 LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器 指令格式LDR cond register expr label expr举例LDRR0 0 x123456LDRR0 DATA BUFFER 0 x10 LTORG NOP伪指令 空操作伪指令 无操作 用于实现延时 举例 DELAY1NOPNOPNOPSUBSR1 R1 1BNEDELAY1 变量定义伪指令 全局变量声明GBLAvariable 全局数值变量GBLLvariable 全局逻辑变量GBLSvariable 全局字符串变量局部变量声明LBLAvariable 局部数值变量LBLLvariable 局部逻辑变量LBLSvariable 局部字符串变量 变量赋值伪指令 给变量复制 SETA伪指令用于给一个全局 局部的算术变量赋值 SETL伪指令用于给一个全局 局部的逻辑变量赋值 SETS伪指令用于给一个全局 局部的字符串变量赋值 变量定义 赋值伪指令举例 GBLLCodeDbgCodeDbgSETL TRUE GBLAByteNoByteNoSETA8 GBLSErrStrErrStrSETS Nosemaphone RLIST伪指令 RLIST为一个通用寄存器列表定义名称 nameRLIST reglist 举例 LoRegRLIST R0 R7 数据定义伪指令 数据定义伪指令用于数据表定义 文字池定义 数据空间分配等 声明一个文字池 LTORG分配一块内存空间 并用0初始化 SPACE分配一段字节的内存单元 并用指定的数据初始化 DCB分配一段字的内存单元 并用指令的数据初始化 DCD和DCDU LTORG伪指令 LTORG用于声明一个文字池 literal pool 在使用LDR伪指令时 要在适当的地址加入LTORG声明文字池 这样就会把要加载的数据保存在文字池内 再用ARM的加载指令读出数据 LTORG举例 LDRR0 0 x12345678ADDR1 R1 R0MOVPC LRLTORG SPACE伪指令 SPACE用于分配一块内存单元 并用0初始化 与SPACE同义 label SPACEexpr举例 DataBufSPACE1000 分配1000字节 DCB伪指令 DCB用于分配一段字节内存单元 并用伪指令中的expr初始化 一般可用来定义数据表格 或文字符串 与DCB同义 label DCBexpr expr expr 举例 DISPTABDCB0 x33 0 x43 0 x53DCB0 x10 0 x20 0 x30ERRSTRDCB Senddataerror 0 DCD伪指令 DCD用于分配一段字内存单元 并用伪指令中的expr初始化 与DCD同义 label DCDexpr expr expr 举例 VectorsLDRPC ResetAddrLDRPC UndefinedAddrResetAddrDCDResetUndefinedAddrDCDUndefinedReset 汇编控制伪指令 汇编控制伪指令用于条件汇编 宏定义 重复汇编控制等 条件汇编控制 IF ELSE和ENDIF宏定义 MACRO和MEND重复汇编 WHILE及WEND IF ELSE和ENDIF伪指令 IF ELSE和ENDIF伪指令能够根据条件把一段代码包括在汇编程序内或将其排除在程序之外 IFlogical expr ELSE ENDIF MACRO和MEND伪指令 MACRO和MEND伪指令用于宏定义 MACRO标识宏定义的开始 MEND标识宏定义久的结束 用MACRO及MEND定义的一段代码 称为宏定义体 MACRO label macroname para1 para2 宏体定义MEND MACRO和MEND伪指令 举例 MCARO IRQ LabelHANDLER IRQ ExceptionEXPORT IRQ LableIMPORT IRQ Exception IRQ LableSUBLR LR 4STMFDSP R0 R3 R12 LR MRSR3 STSRSTMFDSP R3 MEND DCD伪指令 WHILE和WEND伪指令用于根据条件重复汇编相同的或几乎相同的一段源程序 WHILElogical expr WEND举例 WHILEno 5noSETAno 1 WEND 杂项伪指令 边界对齐 ALIGN段定义 AREA指令集定义 CODE16和CODE32汇编结束 END程序入口 ENTRY常量定义 EQU声明符号可以被外部引用 EXPORT和GLORBAL声明一个外部符号 IMPORT和EXTERN包含文件 GET和INCLUDE包含不被汇编的文件 INCBIN ALIGN伪指令 ALIGN伪指令通过添加补丁字节使当前位置满足一定的对齐方式 ALIGN expr 举例 ByteBufDCB0 x10ALIGN4 AREA伪指令 AREA伪指令用于定义一个代码段或数据段 ARM汇编程序设计采用分段式设计 一个ARM源程序至少需要一个代码段 大的程序可以包含多少个代码段及数据段 AREAsectionname attr attr 举例 AREAExample CODE READNOLY AREA伪指令 ALIGN 定义对齐方式CODE 定义代码段COMDEF 定义一个可包含代码和数据的通用段COMMON 定义一个通用的段DATA 定义数据段NOINIT 无需初始化READONLY 指定本段为只读 代码段的默认属性为READONLY READWRITE 指定本段为可读可写 数据段的默认属性为READWRITE CODE16和CODE32伪指令 CODE16伪指令指示汇编编译器后面的指令为16位的Thumb指令 CODE32伪指令指示汇编编译器后面的指令为32位的ARM指令 CODE16CODE32举例 AREAExampleCODE READONLYCODE32 END伪指令 END伪指令用于指示汇编编译器源文件已结束 每一个汇编源文件均要使用一个END伪指令 指示本源程序结束 END举例 汇编文件内容END ENTRY伪指令 ENTRY伪指令用于指定程序的入口点 ENTRY举例 AREAEXample CODE READONLYENTRYCODE32STARTMOVR1 0 x10 EQU伪指令 EQU伪指令为数字常量 基于寄存器的值和程序中的标号定义一个名称 与EQU同义 nameEQUexpr type 举例 T bitEQU0 x20ABCDEQUlabel 8 EXPORT和GLOBAL伪指令 EXPORT声明一个符号可以被其它文件引用 相当于声明了一个全局变量 GLOBAL与EXPORT相同 EXPORTsymbolGLOBALsymbol举例 EXPORTInitStackGLOBALVectors IMPORT和EXTERN伪指令 IMJPORT伪指令指示编译器当前的符号不是在本源文件中定义的 而是在其他源文件中定义的 在本源文件中可能引用该符号 EXTERN与IMPORT相同 IMPORTsymbolEXTERNsymbol举例 IMPORTInitStackEXTERNVectors GET和INCLUDE伪指令 GET伪指令将一个源文件包含到当前源文件中 并将被包含的文件在具当前位置进行汇编处理INCLUDE与GFT同义 GETfilenameINCLUDEfilename举例 INCLUDEs3c44b0 inc INCBIN伪指令 INCBIN伪指令将一个文件包含到当前源文件中 而被包含的文件不进行汇编处理 INCBINfilename举例 INCBINcharlib bin ARM汇编程序设计 文件格式编写规范子程序调用数据块拷贝查表操作完整的例子 文件格式 汇编规范 标号必须在一行的顶格书写 其后面不要添加 而指令均不能顶格书写 ARM汇编器对标识符大小写敏感 书写标号及指令时字母大小写要一致 注释使用 注释内容由 开始到此行结束 注释可以在一行的顶格书写 汇编规范 正确的例子 Str1SETS Mystring 0 USR STACKEQU64STARTLDRR0 0 x11223456 地址送R0MOVR1 0LOOPMOVR2 2 汇编规范 不正确的例子 STARTMOVR0 1ABC MOVR1 2MOVR2 3loopMovR2 3BLoop 子程序调用 用BL指令进行调用 该指令会把返回的PC值保存在LR举例 BLDELAY 调用子程序 DELAY MOVPC LR 子程序返回 数据比较跳转 汇编程序可以使用CMP指令进行两个数据比较 然后调用相应的ARM条件码 实现跳转 举例CMPR5 10BEQDOEQUAL CMPR1 R2ADDHIR1 R1 10ADDLSR1 R1 5 ANDSR1 R1 0 x80BNEWAIT 循环 MOVR1 10 循环次数LOOP 循环体SUBSR1 R1 1BNELOOP 数据块复制 LDRR0 DATA DSTLDRR1 DATA SRCMOVR10 10LOOPLDMIAR1 R2 R9 STMIAR0 R2 R9 SUBSR10 R10 1BNELOOP 栈操作 ARM使用存储器访问指令LDM STM实现栈操作 用于子程序寄存器保存 注意 使用堆栈时 要先分配好堆栈空间 设置好寄存器R13 即堆栈指针SP 否则操作失败 举例STMFDSP R0 R7 LR BLDELAY LDMFDSP R0 R7 PC 散转 CMPR0 MAXINDEXADDLOPC PC R0 LSL 2BERRORBFUN1 散转表BFUN2BFUN3 查表操作 LDRR3 DIS TABLDRR2 R3 R5 LSL 2 下表是0 F的字模DISR TABDCD0 xC0 0 xF9 0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论