




已阅读5页,还剩38页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
汇编语言源程序 指令 伪指令 宏 汇编 目标程序 机器码 ARM汇编器 ARM支持的伪指令符号定义数据定义汇编控制宏 宏指令ARM汇编语言程序设计语法规范程序结构与C C 混合编程C与汇编之间函数调用C C 内嵌汇编指令 汇编语言是一种面向CPU指令系统的程序设计语言 汇编语言具有以下两个特点 使用指令系统的助记符来表示操作码 易记 易读 易修改 采用符号地址表示操作数地址 给编程带来很大方便 汇编语言的最大优点是高效率 最快的运行速度和最省的空间占用 伪指令是为方便编程而设计 并可表达程序信息 如内存分配 指定数据类型 说明程序结构等 伪指令供汇编器使用 没有机器码 不由机器执行 9 1ARM汇编器伪指令 符号定义伪指令 说明定义全局变量 则在整个程序范围内变量名必须唯一定义局部变量 则在其作用范围内变量名必须唯一 指令格式 GBLA GBLL GBLSvariableLCLA LCLL LCLSvariablevariableSETA SETL SETSexprnameRLISTreglist 包含该变量的宏 变量名 表达式 已经定义的变量名 GBLATest1 声明全局数字变量Test1 Test1SETA0 xaa 赋值为0 xaaGBLLTest2 声明全局逻辑变量Test2 赋值为 真 Test2SETL TRUE GBLSTest3 声明全局字符串变量为Test3 Test3SETS Testing 赋值为 Testing LCLATest4 声明局部数字变量Test4 赋值为0 xaaTest4SETA0 xaaRegListRLIST R0 R5 R8 R10 声明寄存器列表RegList LDM STM指令可通过该名称访问寄存器列表 例 注意 符号定义 与 数据定义 的区别 数据定义伪指令 指令格式 label 助记符expr label 助记符expr 程序标号 指令格式 label SPACEexpr label FIELDexprMAPexpr base register 内存表首地址 expr 基址寄存器 当前数据域的长度 要分配的字节数 例 FDataDCFS2E5 5E 7 分配字单元初始化为单精度数DCFSU20 5 5E7 同上 不要求字对齐DDataDCFD3E112 5 6E 12 分配字单元初始化为双精度数Data1DCD5 6 7 分配字单元并初始化Data2DCDData1 10StrDCB Howareyou 分配字节单元并初始化DataSpaceSPACE100 为DataSpace分配100字节并初始化0MAP0 x100 R0 定义结构化内存表首地址为0 x100 R0aFIELD16 定义a的长度16字节 位置0 x100 R0bFIELD32 定义b的长度32字节 位置0 x110 R0sFIELD256 定义s的长度256字节 位置0 x130 R0 汇编控制伪指令 IFlogicalexpressioninstructionsordirectives ELSEinstructionsordirectives ENDIF WHILElogicalexpressioninstructionsordirectivesWEND 条件分支 循环 可嵌套 其他常用伪指令 AREAinit CODE READONLY ALIGN 3ENTRY END 23 8字节对齐 TestEQU50 定义常量Test的值为50AddrEQU0 x55 CODE32 定义标号Addr的值为0 x55 且该处为 32位的ARM指令 例 AREAInit1 CODE READONLYEXPORTMain 源文件1声明一个可全局 引用的标号MainENDAREAInit2 CODE READONLYIMPORTMain 源文件2需要引用在别处 定义的标号MainEND AREAInit CODE READONLYGETC a2 s 通知编译器此处插入源 文件C a2 sINCBINa1 dat 通知编译器此处插入数 据文件a1 datINCBINC a2 obj 通知编译器此处插入目 标文件C a2 obj END 宏与宏指令 宏是一段代码的组合 称为宏指令 程序中可通过宏指令多次调用该段代码 由于汇编时要展开宏 所以宏指令能简化源程序的书写但不能节省存储空间 与子程序区别 MACRO label 宏名 parameter1 parameter2 代码序列MEND 宏体 汇编中通过宏名调用宏 并用实际参数替换形式参数 形式参数 例 根据寄存器测试结果转移 MACRO 宏定义开始 lableTestAndBranch dest reg cc lableCMP reg 0B cc destMEND 宏定义结束 reg待测试寄存器 cc转移条件 dest转移目标 调用宏abcTestAndBranchNonZero R0 NE NonZero abcCMPR0 0BNENonZero NonZero MACRO 宏定义开始 lablexmac p1 p2 宏的名称为xmac 有两个参数 p1和 p2 lable loop1 lable loop1为宏定义体的内部标号 BGE lable loop1 lable loop2 lable loop2为宏定义体的内部标号BL p1 参数 p1为一个子程序的名称BGT lable loop2 ADRr1 p2 MEND 宏定义结束 abc loop1 BGEabc loop1abc loop2BLsubr1BGTabc loop2 ADRr1 de abcxmacsubr1 de 宏调用 其中宏标号为abc 参数为subr1 de 展开 9 2汇编语言语句格式 程序中的常量 变量程序中常用符号代表地址 常量和变量 符号 指令 伪指令 注释 通常 标号代表指令的地址 符号代表数据的地址 符号区分大小写 符合的唯一性 避免与系统保留字 与指令 伪指令冲突 数字常量 32位 作为无符号数0 232 1 带符号数 231 231 1变量 先GBLx或LCLx声明 再用SETx赋值 表达式与运算符 表达式由常量 变量 运算符和括号组成 字符串运算符 9 3ARM汇编语言程序结构 ARM Thumb 汇编语言程序中 以程序段 代码段和数据段 为单位组织代码 一个汇编程序至少应该有一个代码段 当程序较长时 可以分割为多个代码段和数据段 多个段在程序编译连接时最终形成一个可执行的映象文件 可执行映象文件通常由以下几部分构成 一个或多个代码段 代码段的属性默认为READONLY 零个或多个数据段 数据段可以是被初始化的或没有初始化的 属性默认为READWRITE AREAInit CODE READONLY 定义代码段和属性ENTRY 程序入口START 标号第一条可执行语句位置LDRR0 0 x3FF5000 R0 0 x3FF5000LDRR1 0 xFFSTRR1 R0 0 x3FF5000 0 xFF LDRR0 0 x3FF5008LDRR1 0 x01STRR1 R0 0 x3FF5008 0 x01 END 示例汇编语言源程序的基本结构 子程序及其调用 子程序调用与返回BL子程序名说明 将当前PC送R14保存 转移到子程序名 标号 执行 将R14恢复到PC实现返回 AREAInit CODE READONLYENTRYSTART BLsub next 调用子程序 Sub next 子程序开始 MOVPC LR 子程序返回END 为避免因子程序使用寄存器而破坏里面原有 主程序 数据 在子程序开始使用寄存器之前应保存其中内容 RELAYSTMFDR13 R0 R12 LR 压入堆栈 子程序代码LDMFDR13 R0 R12 PC 弹出堆栈并实现子程序的返回 AREABlock CODE READONLYnumEQU20 设置将要复制的字数ENTRYStartLDRR0 src R0指向源数据区srcLDRR1 dst R1指向目标数据区dstMOVR2 num R2保存将要复制的字数MOVSP 0 x400 设置堆栈指针 R13 BlockcopyMOVSR3 R2 LSR 3 需要进行的以8个字为单位的复制次数BEQCopywords 对于剩下不足8个字的数据 跳转到 CopywordsSTMFDSP R4 R11 将工作寄存器R4 R11压入堆栈保存OctcopyLDMIAR0 R4 R11 从源数据区读取8个字的数据 放入8个寄存器中STMIAR1 R4 R11 将8个寄存器中的数据写入目标数据区中SUBSR3 R3 1 将块复制次数减1BNEOctcopy 循环操作 直到完成以8个字为单位的块复制LDMFDSP R4 R11 从堆栈弹出恢复工作寄存器R4 R11 CopywordsANDSR2 R2 7 剩下不足8个字的数据的字数BEQStop 如果剩下数据的字数为0 则数据复制完成WordcopyLDRR3 R0 4 从源数据区读取1个字的数据 放到R3寄存器中STRR3 R1 4 将R3寄存器中的数据写入目标数据区中SUBSR2 R2 1 将字数减1BNEWordcopy 循环操作 直到完成以字为单位的数据复制StopMOVR0 0 x18 为软中断准备参数LDRR1 0 x20026 SWI0 x123456 从应用程序中退出AREABlockData DATA READWRITE 定义数据区BlockDatasrcDCD1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 定义源数据区srcdstDCD0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 定义目标数据区dstEND 结束汇编 AREABlock CODE READONLYnumEQU20 设置将要复制的字数ENTRYStartLDRR0 src R0指向源数据区srcLDRR1 dst R1指向目标数据区dstMOVR2 num R2保存将要复制的字数WordcopyLDRR3 R0 4STRR3 R1 4SUBSR2 R2 1 指针移到下一个字单元BNEwordcopyStopMOVR0 0 x18 为软中断准备参数LDRR1 0 x20026 SWI0 x123456 从应用程序中退出AREABlockData DATA READWRITE 定义数据区BlockDatasrcDCD1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 定义源数据区srcdstDCD0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 定义目标数据区dstEND 结束汇编 用MAP和FIELD命令描述数据结构MAP伪操作指定数据结构的基址 FIELD伪操作指定一个数据项所需的存储器数量 并为该数据指定标号 MAP FIELD不分配存储器空间 MAP0 定义数据结构constaFIELD4 consta占4字节 偏移量0constbFIELD4 consta占4字节 偏移量4xFIELD8 x占用8字节 偏移量8yFIELD8 y占用8字节 偏移量16stringFIELD256 string占用256字节 偏移量24 MOVR9 4096LDRR4 R9 constb 9 4ARM汇编语言与C C 混合编程 ARM工程完成应用所需的所有文件集合 汇编源程序 s C语言源程序 c C 源文件 cpp 以及头文件 h ELF ExecutableandLinkingFormat 可执行连接格式 ARM程序框架 1 初始化程序部分硬件系统的初始化 包括设定CPU工作状态 中断使能 主频设定 以及RAM的控制参数设置及初始化等 通常都使用汇编代码 2 初始化部分与主应用程序部分的衔接当所有的系统初始化工作完成之后 就需要把程序流程转入到应用程序 最简单的方法是 在汇编语言程序末尾使用跳转指令B或BL直接从启动代码转移到C C 程序入口 3 主应用程序的混合编程方式在汇编程序和C C 的程序之间进行变量的互访汇编程序和C C 程序之间的相互调用在C C 代码中嵌入汇编指令 IMPORTMain 声明外部引用符号AREAInit CODE READONLY 定义代码段ENTRY 定义程序的入口点LDRR0 0 x3FF0000 初始化系统配置寄存器LDRR1 0 xE7FFFF80STRR1 R0 LDRSP 0 x3FE1000 初始化用户堆栈BLMain 跳转到Main 函数处执行 C C 代码END 汇编代码结束 Main仅为一个标号代表Main 所在地址 C程序如下 voidMain void ATPCS概述 ATPCS规定过程调用中寄存器的使用 数据栈使用以及参数传递等规则 有调用关系的所有子程序必须遵守同一种ATPCS 编译器或者汇编器在ELF格式的目标文件中设置相应的属性 标识用户选定的ATPCS类型 C语言编译器编译的C语言子程序满足用户指定的ATPCS类型 对于汇编语言程序来说 完全要依赖用户来保证各子程序满足选定的ATPCS类型 具体来说 汇编语言子程序必须满足下面三个条件 在子程序编写时必须遵守相应的ATPCS规则 数据栈的使用要遵守ATPCS规则 在汇编编译器中使用 apcs选项 寄存器的使用规则 1 子程序通过寄存器R0 R3来传递参数 这时寄存器可以记作 A0 A3 被调用的子程序在返回前无需恢复寄存器R0 R3的内容 2 在子程序中 使用R4 R11来保存局部变量 这时寄存器R4 R11可以记作 V1 V8 如果在子程序中使用到V1 V8的某些寄存器 子程序进入时必须保存这些寄存器的值 在返回前必须恢复这些寄存器的值 对于子程序中没有用到的寄存器则不必执行这些操作 在THUMB程序中 通常只能使用寄存器R4 R7来保存局部变量 3 寄存器R12用作子程序间scratch寄存器 记作ip 在子程序的连接代码段中经常会有这种使用规则 4 寄存器R13用作数据栈指针 SP 在子程序中寄存器R13不能用做其他用途 SP在进入子程序时的值和退出子程序时的值必须相等 5 寄存器R14用作连接寄存器 LR 它用于保存子程序的返回地址 如果在子程序中保存了返回地址 则R14可用作其它的用途 6 寄存器R15是程序计数器 PC 它不能用作其他用途 7 ATPCS中的各寄存器在ARM编译器和汇编器中都是预定义的 ATPCS概述 数据栈的使用规则 ARM有以下4种数据栈指针 FD FullDescending ED EmptyDescending FA FullAscending EA EmptyAscending ATPCS规定数据栈为FD类型 并对数据栈的操作是8字节对齐的 1 数据栈栈指针stackpointer指向最后一个写入栈的数据的内存地址 2 数据栈的基地址stackbase是指数据栈的最高地址 由于ATPCS中的数据栈是FD类型的 实际上数据栈中最早入栈数据占据的内存单元是基地址的下一个内存单元 3 数据栈界限stacklimit是指数据栈中可以使用的最低的内存单元地址 4 已占用的数据栈usedstack是指数据栈的基地址和数据栈栈指针之间的区域 其中包括数据栈栈指针对应的内存单元 5 数据栈中的数据帧 stackframes 是指在数据栈中 为子程序分配的用来保存寄存器和局部变量的区域 ATPCS概述 参数的传递规则 1 参数个数可变的子程序参数传递规则对于参数个数可变的子程序 当参数不超过4个时 可以使用寄存器R0 R3来进行参数传递 如果参数多于4个 将剩余的字数据传送到数据栈中 入栈的顺序与参数顺序相反 即最后一个字数据先入栈 2 参数个数固定的子程序参数传递规则第一个整数参数通过寄存器R0 R3来传递 其他参数通过数据栈传递 如果系统包含浮点运算的硬件部件 浮点参数将按照下面的规则传递 各个浮点参数按顺序处理 为每个浮点参数分配FP寄存器 分配的方法是 满足该浮点参数需要的且编号最小的一组连续的FP寄存器 ATPCS概述 子程序结果返回规则1 结果为一个32位的整数时 可以通过寄存器R0返回 2 结果为一个64位整数时 可以通过R0和R1返回 依此类推 3 结果为一个浮点数时 可以通过浮点运算部件的寄存器f0 d0或者s0来返回 4 结果为一个复合的浮点数时 可以通过寄存器f0 fN或者d0 dN来返回 5 对于位数更多的结果 需要通过调用内存来传递 ATPCS概述 C程序调用汇编函数 函数名是跳转目标地址 汇编语言程序标号 函数调用涉及的参数 结果值和函数中定义的变量是局部变量 形参和返回值都应该定义在具有暂存性质的寄存器及堆栈中 调用满足ATPCS规定 例如调用有2个参数的函数Addint intx inty 为其分配寄存器R0 R1 其中R0还用于存放返回结果 R3R2R1R0 Addint intx inty 参数5参数4 参数多余4个存放堆栈中 注意存放顺序 0 x000200100 x0002000C0 x000200080 x00020000 栈增长方向 externvoidstrcopy char d constchar s 参数由左向右依次传递给R0 R3 d为目标指针 R0 s为源指针 R1 intmain void constchar src Source chardest 10 strcopy dest src 调用汇编函数strcopy AREAStrCopy CODE READONLYEXPORTstrcopy 声明strcopy为导出符号strcopyLDRBR2 R1 1 R1中的值为源数据块的首地址STRBR2 R0 1 R0中的值为目标数据块的首地址CMPR2 0BNEstrcopy 未复制完 循环继续复制MOVPC LR 复制完毕 返回END 在汇编函数f中调用C函数g 以实现下面的功能 intf inti return g i 2 i 3 i 4 i 5 i EXPORTfAREAf CODE READONLYIMPORTg 声明g为外部引用符号STRLR SP 4 将断点存入堆栈ADDR1 R0 R0 R1 i 2ADDR2 R1 R0 R2 i 3ADDR3 R1 R2 R3 i 5STRR3 SP 4 将 R3 即第5个参数i 5存入堆栈ADDR3 R1 R1 R3 i 4BLg 调用C函数g 返回值在R0中ADDSP SP 4 调整数据栈指针 准备返回LDRPC SP 4 END 汇编函数调用C程序 intg inta intb intc intd inte returna b c d e i存放于R0 C和汇编语言的混合编程 C C 编译器中内嵌汇编器 C C 源程序中可以使用ARM指令 C C 中使用汇编指令的格式 asm instruction instr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高空车安全知识培训课件
- KTD-092-生命科学试剂-MCE
- 2-Difluoromethylpentadecanoyl-CoA-2-Difluoromethylpentadecanoyl-coenzyme-A-生命科学试剂-MCE
- AZD-9272-Standard-生命科学试剂-MCE
- 新解读《GB-T 30269.806-2018信息技术 传感器网络 第806部分:测试:传感节点标识符编码和解析》
- 电焊工培训班知识课件
- 保定市中考声乐考试题及答案
- 河源考试题及答案
- 电热管基础理论知识培训课件
- 电源厂培训知识课件
- 劳动关系协调师竞赛技能竞赛考试题及答案
- 扬州树人学校2024-2025七年级上学期9月月考数学试卷及答案
- 八年级上册湖南地方文化常识教案
- 《第2课 多样的数据》参考课件1
- 熔炼过程自动化智能化控制
- 十年(2015-2024)高考真题数学分项汇编(全国)专题02 复数(教师卷)
- 神经源性肠道功能障碍的康复护理
- QB/T 8006-2024 年糕 国家标准(正式版)
- 郑州市第四中学英语新初一分班试卷含答案
- 《百变扭扭棒》大班艺术课件
- 食品安全体系规范(HACCP)样本
评论
0/150
提交评论