ARM汇编程序设计.ppt_第1页
已阅读1页,还剩64页未读 继续免费阅读

下载本文档

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

文档简介

ARM嵌入式系统第5章ARM汇编程序设计 5 1汇编语言源程序 助记符伪指令宏指令 汇编指令和机器指令是 一一对应 的汇编语言程序需由汇编程序将其汇编为机器语言程序 才能被计算机执行 汇编语言大体上包括了汇编指令 系统调用和中断 伪指令和宏指令 汇编语言是强烈依赖硬件和汇编环境的 学习和使用汇编语言程序设计的原因 指令语句 instructions 完成一定操作功能 能够翻译成机器代码的语句 伪指令语句 directives 指示性语句 为汇编程序在翻译汇编语言源程序时提供有关信息 并不翻译成机器代码 宏指令语句 marcos 可看成是由若干条指令语句形成的语句 一条宏指令语句的功能相当于若干条指令语句的功能 ARM程序设计基础 伪指令宏与宏指令ARM汇编语言规范 语句 表达式和运算符 ARM汇编语言的程序格式 5 2伪指令 段定义标号符号定义伪指令数据定义伪指令汇编控制伪指令其他伪操作 汇编语言程序示例 AREABlock CODE READONLYnumEQU10ENTRYstartLDRR0 srcLDRR1 dstMOVR2 numblockcopyLDRR3 R0 4STRR3 R1 4SUBSR2 R2 1BNEblockcopyB AREABlockData DATA READWRITEsrcDCD0 1 2 3 4 5 6 7 8 9dstSPACE10 4END 符号定义伪指令 定义全局变量 GBLA GBLL和GBLS定义局部变量 LCLA LCLL和LCLS变量赋值 SETA SETL SETS通用寄存器列表定义名称 RLIST GBLA GBLL和GBLS GBLA GBLL和GBLS语法格式 GBLA GBLL或GBLS 全局变量名GBLAobjectsize 全局的数字变量objectsize 为0ObjectsizeSETA0 xff 将该变量赋值为0 xffSPACEobjectsize 引用该变量GBLLstatusB 全局的逻辑变量statusB 为 False statusBSETL TRUE 将该变量赋值为真全局 作用范围为包含该变量的源程序 LCLA LCLL和LCLS LCLA LCLL和LCLS语法格式 LCLA LCLL或LCLS 局部变量名MACRO 声明一个宏 labelmessage a 宏的原型LCLSerr 声明一个局部变量err 为空串errSETS errorno 向该变量赋值 label 代码INFO0 err CC STR a 使用该串变量MEND 宏定义结束局部 作用范围为包含该局部变量的宏代码的一个实例 SETA SETL SETS SETA SETL和SETS语法格式 变量名SETA SETL或SETS 表达式在向变量赋值前 必须先声明该变量 RLIST RLIST语法格式 名称RLIST 寄存器列表 ContextRLIST r0 r6 r8 r10 r12 r15 将寄存器列表名称定义为Context 可在ARM指令LDM STM中通过该名称访问寄存器列表 排列顺序无关 数据定义伪指令 DCBDCW DCWU DCD DCDU DCFD DCFDU DCFS DCFSU SPACEMAPFIELD DCB 语法格式 标号 DCB表达式表达式取值范围 128 127 0 255的数字或字符串 DCB NullstringDCB Nullstring 0 构造一个以0结尾的字符串 DCW 或DCWU 语法格式 标号 DCW 或DCWU 表达式DCW 半字对齐DCWU 不严格半字对齐 表达式取值范围 32768 32767 0 65535data1DCW 128 num1 8 num1必须是已经定义过的 DCD 或DCDU 语法格式 标号 DCD 或DCDU 表达式DCD 其值为1 5 20data2DCDmemaddr 4 分配一个字单元 其值为程序中标号memaddr加4个字节 DCFD 或DCFDU 语法格式 标号 DCFD 或DCFDU 表达式每个双精度的浮点数占据两个字单元 DCFD 字对齐DCFDU 不严格字对齐DCFD1E308 4E 100DCFDU100000 1 3 1E26 DCFS 或DCFSU 语法格式 标号 DCFS 或DCFSU 表达式每个单精度的浮点数占据一个字单元 DCFS 字对齐DCFSU 不严格字对齐DCFS1E3 4E 9DCFSU1 0 1 3 1E6 SPACE 语法格式 标号 SPACE表达式分配一片连续的存储区域并初始化为0 其中 表达式为要分配的字节数 SPACE DatastrucSPACE280 分配连续280字节的存储单元并初始化为0 LTORG 语法格式 标号 LTORG说明某个存储区域是用来暂存数据的数据缓冲区 文字池或数据缓冲池 大的代码段也可以使用多个数据缓冲池 当程序中使用LDR之类的指令访问数据缓冲池时 为防止越界产生 通常把数据缓冲池放在代码段的后面 或者放在无条件跳转指令或子程序返回指令之后 使得处理器不会错误的将数据缓冲池中的数据当做指令来执行 AREAExample CODE READONLYStartBLFunc1 Func1LDRR1 0 x800MOVPC LRLRORGDataSPACE40END MAP 语法格式 MAP表达式 基址寄存器 用于定义一个结构化的内存表的首地址 MAP 通常与FIELD伪指令配合使用来定义结构化的内存表 MAPfun 定义结构化内存表 fun就是内存表的首地址MAP0 x80 R9 定义结构化内存表首地址的值为0 x80 R9 FILED 语法格式 标号 FIELD表达式定义一个结构化内存表中的数据域 FILED也可用 代替 MAP0 定义结构化内存表首地址为0constaFIELD4 consta的长度为4字节 相对位置为0 x0constbFIELD4 constb的长度为4字节 相对位置为0 x4xFIELD8 x的长度为8字节 相对位置为0 x8yFIELD8 y的长度为8字节 相对位置为0 x10stringFIELD256 y的长度为256字节 相对位置为0 x18MOVR9 4096LDRR5 R9 constb 将内存表中数据域constb读取到R5中 汇编控制伪指令 汇编控制 AssemblyControl 伪指令用于控制汇编程序的执行流程 常用的汇编控制伪操作包括以下几条 IF ELSE ENDIFWHILE WEND IF ELSE ENDIF 语法格式 IF逻辑表达式指令序列1ELSE指令序列2ENDIF示例 IFVersion 1 0 指令 伪指令ELSE 指令 伪指令ENDIF WHILE WEND 语法格式 WHILE逻辑表达式指令序列WEND示例 countSETA1WHILEcount 4countSETAcount 1 codeWEND 其他常用的伪操作 AREACODE16 CODE32ENTRYENDEQUIMPORTGET 或INCLUDE AREA 语法格式 AREA段名属性1 属性2 定义一个代码段或数据段 常用的属性如下 CODE 用于定义代码段 默认为READONLY DATA 用于定义数据段 默认为READWRITE READONLY 指定本段为只读 代码段默认为READONLY READWRITE 指定本段为可读可写 数据段的默认属性为READWRITE 示例 AREAExample CODE READONLY code CODE16 CODE32 语法格式 CODE16 或CODE32 CODE16 其后的指令序列为16位的Thumb指令 CODE32 其后的指令序列为32位的ARM指令 示例 AREAChangeState CODE READONLYCODE32 指示下面的指令为ARM指令LDRr0 start 1BXr0 切换到Thumb状态 并跳转到start处执行CODE16 指示下面的指令为Thumb指令startMOVr1 10 ENTRY 语法格式 ENTRYENTRY伪操作用于指定汇编程序的入口点 在一个源文件里最多只能有一个ENTRY 可以没有 在一个完整的汇编程序中至少要有一个ENTRY 当有多个ENTRY时 程序的真正入口点由链接器指定 示例 AREAexample CODE READONLYENTRY 应用程序的入口点 END 语法格式 ENDEND伪指令用于通知编译器已经到了源程序的结尾 示例 AREAexample CODE READONLY END EQU 语法格式 名称EQU表达式 类型 EQU 示例 abcdEQU2 定义abcd符号的值为2abcdEQUlabel1 16 定义abcd符号的值 label1 16 IMPORT 语法格式 IMPORT标号 WEAK 用于通知编译器要使用的标号在其他的源文件中定义 但要在当前源文件中引用 示例 AREAInit CODE READONLYIMPORTMain 通知编译器当前文件要引用标号Main 但Main在其他源文件中定义 END GET 或INCLUDE 语法格式 GET文件名用于将一个源文件包含到当前的源文件中 并将被包含的源文件在当前位置进行汇编处理 可以使用INCLUDE代替GET 使用方法与C语言中的 include 相似 示例 AREAexample CODE READONLYGETfile1 s 包含源文件file1 sGETC project file2 s 包含源文件file2 sGETC Programfiles file3 s 包含源文件file3 s 5 3宏和宏指令 宏 在汇编程序中可以用伪指令MACRO MEND为一个程序段定义一个名称 在往后的程序中就可以通过这个名称来使用它所代表的程序段 在源程序被汇编时 该名称将被替换为它所代表的程序段 宏指令 在ARM中 还有一种汇编器内置的无参数和标号宏 我们把其称为宏指令 在汇编的时候 这些宏指令也是被替换成一条或两条真正的ARM或Thumb指令 ADR ADRL LDR MACRO MEND 语法格式 MACRO 标号宏名 参数1 参数2 宏名为宏的名称 为宏在程序中引用名 参数1 参数2 为宏中可以使用的参数 指令序列 宏定义体MEND规定 标号为主标号 宏内的所有其他的标号必须由主标号组成 宏中的所有标号必须在前面冠以符号 宏中的参数在汇编时被相应的值替换 示例 在ARM中完成测试 跳转操作需要两条指令 定义一条宏指令完成测试 跳转操作MACRO labelTestAndBranch dest reg cc label A1CMP reg 0B cc destMEND MACRO MEND 在程序中调用该宏testTestAndBranchNonZero r0 NE NonZero 程序被汇编后 宏展开的结果testCMPr0 0BNENonZero NonZero MEXIT 语法格式 MEXITMEXIT用于从宏定义中跳转出去 宏指令 ADRADRLLDRNOP ADR 小范围的地址读取伪指令 语法格式ADR cond register exprcond 可选的指令执行条件register 目标寄存器expr 基于PC或寄存器的地址表达式 取值范围 地址非字对齐 255 255地址字对齐 1020 1020将基于PC或寄存器的地址值读取到寄存器中 ADR伪指令被替换成一条合适的指令 ADD指令或SUB指令 如果不能用一条来实现ADR伪指令的功能 编译器将报告错误 ADR 小范围的地址读取伪指令 示例 startMOVr0 10 PC值为当前指令地址值加8字节ADRr4 start 本ADR伪指令将被编译器替换成 SUBr4 pc 0 xc ADRL 中等范围的地址读取伪指令 语法格式ADRL cond register exprcond 可选的指令执行条件register 目标寄存器expr 基于PC或寄存器的地址表达式 取值范围 地址非字对齐 64KB 64KB地址字对齐 256KB 256KB将基于PC或寄存器的地址值读取到寄存器中 ADRL伪指令被替换成两条合适的指令 如果不能用两条来实现ADRL伪指令的功能 编译器将报告错误 ADRL 中等范围的地址读取伪指令 示例 startMOVr0 10 PC值为当前指令地址值加8字节ADRLr4 start 60000 本ADRL伪指令将被编译器替换成下面两条指令 ADDr4 pc 0 xe800 ADDr4 r4 0 x254 60000 0 xEA60 LDR 大范围的地址读取伪指令 语法格式LDR cond register expr label expr cond 可选的指令执行条件register 目标寄存器expr 32位常数当expr没有超过MOV或MVN指令中的地址取值范围时 编译器用合适的MOV或MVN指令代替该LDR伪指令反之 编译器将该常数放在数据缓冲池中 同时用一条基于PC的LDR指令读取该常数 LDR伪指令处的PC值到数据缓冲池中目标数据所在地址的偏移量要小于4KB 将32位常数或者地址值读取到寄存器中 LDR 大范围的地址读取伪指令 示例1 将0 xff0读取到R1中LDRR1 0 xFF0 汇编后将得到MOVR1 0 xFF0示例2 将0 xfff读取到R1中LDRR1 0 xFFF LDRR1 PC OFFSET TO LPOOL LPOOLDCD0 xFFF示例3 将外部地址ADDR1读取到R1中LDRR1 ADDR1 LDRR1 PC OFFSET TO LPOOL LPOOLDCDADDR1 NOP 空操作伪指令 语法格式NOP 5 4汇编语言的语句格式 ARM Thumb 汇编语言的语句格式为 标号 指令或伪指令 注释 标号 从一行的行头开始 不能包含空格指令或伪指令 指令的前面必须有空格或符号注释 以 开头每一条指令的助记符可以全部用大写 或全部用小写 但不允许在一条指令中大 小写混用 语句之间可以插入空行 如果一条语句太长 可将该长语句分为若干行来书写 在行的末尾用 表示下一行与本行为同一条语句 ARM汇编语言中的符号 命名规则 符号由大小写字母 数字以及下划线组成符号是区分大小写的符号中的所有字符都是有意义的符号在其作用范围内必须唯一 即在其作用范围内不可有同名的符号程序中的符号不能与系统内部变量或者系统预定义的符号同名程序中的符号通常不要与指令助记符或者伪操作同名 当同名时 用双竖线将符号括起来 数字常量 数字常量是32位的整数无符号数 0 232 1有符号数时 231 231 1 EQU 定义数字常量 变量 变量有数字变量 逻辑变量和字符串变量数字变量的大小不应超出数字变量所能表示的范围逻辑变量只有两种取值情况 真 true 或假 false 字符串变量的长度不应超出字符串变量所能表示的范围GBLA GBLL GBLS 声明全局变量LCLA LCLL LCLS 声明局部变量SETA SETL和SETS 赋值 标号 表示程序中的指令或着数据地址的符号 目标地址标号 基于PC的标号位于目标指令前或者程序中数据定义伪操作前的标号 汇编时将被处理成PC值加上或减去一个数字常量 常用于表示跳转指令的目标地址 或者代码段中的少量数据 数据或数据区首地址标号 基于寄存器的标号写在数据或数据区定义伪指令前面的标号 这种标号常在寄存器间接寻址方式中作为地址寄存器的首地址 在偏移量的配合下对数据表中的数据进行读 写操作 绝对地址 32位数字量 LDRR0 0 x3FF5000target1LDRR1 0 xFFSTRR1 R0 LDRR0 0 x3FF5008LDRR1 0 x01STRR1 R0 Btarget1 ARM汇编语言中的表达式 表达式由符号 数值 单目或多目操作符以及括号组成 在一个表达式内各种元素的优先级 括号内的表达式优先级最高各种操作符有一定的优先级相邻的单目操作符的执行顺序为由右到左 单目操作符优先级高于其他操作符优先级相同的双目操作符执行顺序为由左到右 数字逻辑字符串 表达式 常量变量运算符括号 数字表达式 整数数字量示例 aSETA34906AddrDCD0 xA10EDCD2 11001010c3SETA8 74007DCQ0 x123456789abcdef 数字表达式 浮点数字量单精度浮点数表示范围 3 4e 38 1 18e 38双精度浮点数表示范围 1 8e 308 2 23e 308示例 DCFD1E308 4E100DCFS1 0DCFD3 725e15DCFS0 x7FC00000DCFD FFF0000000000000 数字表达式 操作符NOT按位取反 NOT A 及MOD算术操作符A B A B A B A B A MOD BROL ROR SHL及SHR移位 循环移位 操作A ROL B A ROR B A SHL B A SHR BAND O

温馨提示

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

评论

0/150

提交评论