ARM汇编语言程序设计_第1页
ARM汇编语言程序设计_第2页
ARM汇编语言程序设计_第3页
ARM汇编语言程序设计_第4页
ARM汇编语言程序设计_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

ARM汇编语言程序设计嵌入式系统底层编程核心技术·从体系结构到程序实战Contents课程目录ARM汇编语言程序设计——从体系结构到混合编程的系统学习路径01ARM体系结构基础02ARM寻址方式详解03ARM指令系统04汇编语言伪指令与程序格式05ARM汇编程序设计方法06汇编与C语言混合编程CHAPTER01ARM体系结构基础从RISC架构理念到寄存器组织,建立底层硬件认知框架ARCHITECTUREARM处理器概述与架构特点ARM基于RISC精简指令集架构,以低功耗、高代码执行效率为核心优势,已成为移动计算与嵌入式系统领域事实上的行业标准架构。01RISC架构设计:采用精简指令集,大多数指令单周期执行,指令长度固定为32位,硬件解码简单高效02Load/Store体系:运算指令只操作寄存器,数据访存通过独立的LDR/STR指令完成,实现计算与访存分离03低功耗优势:相同性能下功耗远低于CISC架构,使其成为智能手机、IoT设备等电池供电场景的首选方案04广泛应用生态:覆盖Cortex-M、Cortex-R、Cortex-A三大产品线,全球出货量超2000亿颗ARMCortex系列处理器芯片PROCESSORMODESARM处理器七种工作模式ARM处理器设计了7种工作模式以实现权限分级和异常隔离:用户模式提供最低权限的应用运行环境,其余6种特权模式分别服务于操作系统内核、中断响应、异常处理等不同场景,通过模式切换保障系统安全与稳定性。用户与系统模式USER用户模式:普通应用程序运行的默认模式,无法直接访问系统资源和特权指令,保障系统安全SYSTEM系统模式:运行操作系统特权任务,与用户模式共享寄存器组但拥有更高权限中断与异常模式IRQIRQ模式:响应普通中断请求时自动切换,拥有独立的R13_IRQ和R14_IRQ寄存器以保护中断现场FIQFIQ模式:响应快速中断请求,拥有R8-R14共7个独立寄存器,最大限度减少上下文切换开销SVC管理模式:处理器复位或执行SWI指令时进入,是操作系统内核最常见的运行模式错误处理模式ABORT中止模式:数据访问或指令预取发生异常时进入,用于内存管理和虚拟内存实现UNDEFINED未定义模式:执行处理器无法识别的指令时进入,可用于软件仿真扩展指令集Chapter06·ARMArchitectureARM寄存器组织与分组机制ARM采用寄存器分组(BankedRegister)机制,共37个物理寄存器在不同工作模式下呈现不同的逻辑视图。这种设计使异常和中断发生时无需软件保存现场即可快速切换,是ARM高效异常响应的硬件基础。GeneralPurposeR0–R12所有模式共享,用于数据运算、参数传递和临时存储13个StackPointerR13(SP)每种模式独立实例,指向栈顶,各模式堆栈互不干扰BankedLinkRegisterR14(LR)保存子程序或异常返回地址,特权模式独立副本,支持中断嵌套BankedProgramCounterR15(PC)所有模式共享,指向当前执行指令地址4B/2BStatusRegistersCPSR/SPSRCPSR保存条件标志与中断禁止位;SPSR自动保存用于异常恢复NZCVARMProcessor·StatusRegisterCPSR状态寄存器详解CPSR(当前程序状态寄存器)是ARM处理器的控制中枢,32位寄存器分为条件标志、中断控制、处理器状态和模式编码四个功能区,直接决定指令的条件执行、中断响应行为和处理器运行模式。条件标志位Bit31–28N运算结果最高位为1时置位,用于有符号数大小比较Z运算结果为0时置位,CMP指令通过此标志判断两数是否相等C加法产生进位或减法产生借位时置位,也用于移位操作V有符号运算结果超出32位表示范围时置位控制位与模式编码Bit7–0I/F中断禁止位:I=1禁止IRQ中断,F=1禁止FIQ中断,操作系统内核通过此位实现临界区保护T状态位:T=0为ARM状态(32位指令),T=1为Thumb状态(16位指令),影响指令解码宽度M[4:0]模式编码:5位编码决定处理器模式,如10000=User、10011=SVC、10001=FIQCHAPTER02ARM寻址方式详解掌握九种寻址方式,理解操作数的灵活获取机制寻址方式基本寻址方式:立即、寄存器与移位ARM的三种基本寻址方式构成了指令操作数获取的基础:立即寻址将常量直接嵌入指令编码,寄存器寻址从CPU内部寄存器取值,而ARM独有的寄存器移位寻址在数据传输的同时完成移位运算,体现了RISC架构"一条指令多做功"的设计哲学。立即寻址操作数作为指令的一部分直接编码,如MOVR0,#0xFF00。ARM采用8位立即数循环右移偶数位的方式扩展可表示范围,这种编码方式使得32位指令能够表示大量常用常量值。MOVR0,#0xFF00寄存器寻址操作数来自CPU内部寄存器,如ADDR0,R1,R2。所有运算操作均在寄存器间完成,无需访问内存,是访问速度最快的寻址方式,也是RISC架构的核心特征。R0←R1+R2寄存器移位寻址源寄存器值先经过移位再参与运算,如ADDR0,R1,R2,LSL#3。支持LSL逻辑左移、LSR逻辑右移、ASR算术右移、ROR循环右移四种移位方式。R2LSL#3移位寻址优势将移位操作与算术运算合并为一条指令执行,显著减少指令条数,提高代码密度。更重要的是,这种融合操作不增加额外的执行周期,在单周期内完成。1Cycle/1Instr.MemoryAddressing存储器寻址方式ARM通过基址偏移组合、前后变址自动索引及多寄存器批量传输,实现高效灵活的内存访问与块数据搬运。基址与变址寻址基址寻址:有效地址=基址寄存器+偏移量,如LDRR0,[R1,#8]从R1+8地址加载数据,偏移范围±4095字节前变址寻址:先计算偏移地址再访存并写回基址,如LDRR0,[R1,#4]!,常用于数组顺序遍历后变址寻址:先用基址访存再更新基址,如LDRR0,[R1],#4,适用于循环中逐个处理数据批量与特殊寻址多寄存器寻址:LDM/STM一条指令传输最多16个寄存器,如STMDBSP!,{R0-R7}将8个寄存器压入堆栈堆栈寻址:ARM支持满递减(FD)、满递增(FA)、空递减(ED)、空递增(EA)四种堆栈类型,C语言标准采用满递减相对寻址:以PC为基址加偏移,如ADRR0,label实现位置无关跳转,常用于分支和子程序调用CHAPTER03ARM指令系统系统掌握数据处理、访存与控制流指令,构建底层编程能力DATATRANSFER数据传送指令ARM数据传送指令分为寄存器间传送和存储器访存两大类。作为Load/Store架构,ARM所有算术逻辑运算只能在寄存器间进行,访存必须通过专用传送指令完成。寄存器传送MOV直接复制到目的寄存器;MVN按位取反后传送,如MVNR0,#0得到0xFFFFFFFFMOV·MVN加载指令从指定内存地址读取32位数据到寄存器,支持基址+偏移、前变址、后变址等多种寻址方式LDR存储指令将寄存器中32位数据写入指定内存地址,语法与LDR对称,如STRR5,[R6,#12]STR批量传送一条指令同时加载或存储多个寄存器,如LDMIAR7!,{R8-R10}连续加载3个字并自动更新基址LDM·STM半字与字节LDRB/STRB操作8位字节,LDRH/STRH操作16位半字,LDRSB/LDRSH支持符号扩展加载B·H·SB·SHINSTRUCTIONSET算术运算指令ARM算术运算指令覆盖加减乘及多精度运算场景,通过S后缀统一更新条件标志位,配合CMP比较指令为条件分支提供判断依据。01ADD/SUB

加减法:支持三个操作数格式(如ADDR0,R1,R2),第二个操作数可使用移位形式,实现加法与移位合并02ADC/SBC

带进位运算:ADC在加法基础上加上C标志位,SBC减去C标志位反码,用于实现64位+多精度运算03MUL/MLA

乘法运算:MUL计算Rm×Rs的低32位结果,MLA在乘法基础上加累加值(R0=R1×R2+R3)04RSB

反向减法:用第二操作数减去第一操作数,RSBR0,R1,#0等价于R0=0−R1,高效实现取负操作05CMP

比较指令:执行Rn−operand2但不保存结果,仅更新N/Z/C/V标志位,是条件分支判断的核心指令Logical&Shift逻辑运算与移位指令ARM逻辑运算指令提供精确位级操控,移位操作既可独立使用也可嵌入数据处理指令,是灵活性的典型体现。BitwiseAND位与提取特定位或清除无关位,常用于掩码操作。例如ANDR0,R0,#0xFF提取寄存器最低字节数据,实现字节级数据隔离。掩码提取0xFFSetBitsORR位或将指定位置1,用于标志位设置或位组合。例如ORRR0,R0,#(1<<5)将第5位置为高电平,快速配置控制寄存器。置位操作BIT5ToggleEOR异或翻转指定位,相同为0相异为1。经典应用:不借助临时变量交换两数数值,通过三次异或操作完成数据互换。无暂存交换×3ClearBIC位清除将指定位清零,实现按位清除功能。例如BICR0,R0,#0x0F清除最低4位,常用于内存地址对齐和位字段清零。清零对齐对齐Shift四种移位LSL左移补0、LSR右移补0、ASR补符号位、ROR循环右移。移位操作可嵌入数据处理指令的第二操作数,提升指令效率。嵌入操作×4ProgramControlFlow条件执行与分支控制指令ARM独有的条件执行机制允许几乎所有指令根据CPSR标志位有条件地执行,配合丰富的条件码和分支指令,在不增加分支开销的前提下实现复杂的程序控制流,是ARM代码高效执行的关键设计。条件执行机制0115种条件码全覆盖EQ、NE、GT、LT、GE、LE等,满足等于、不等于、大于、小于等所有比较场景02避免流水线冲刷将简单if-else转化为条件指令而非分支跳转,消除分支预测失败带来的性能损失03典型应用模式CMPR0,#0后接MOVEQ/MOVNE,无需分支即可实现零值判断与符号处理15ConditionCodes分支指令01B无条件跳转偏移范围±32MB,适用于循环结构、条件分支的目标地址跳转,编码紧凑高效02BL带链接跳转返回地址自动保存到LR(R14),子程序调用的标准指令,支持嵌套调用与递归03BX分支交换根据目标地址最低位自动切换ARM/Thumb状态,支持函数指针与动态库调用B·BL·BXMemoryAccessArchitectureLoad/Store指令与内存访问作为Load/Store架构的核心,ARM的LDR/STR系列指令是CPU与内存交互的唯一通道。通过字/半字/字节三级粒度和符号扩展选项,满足不同数据类型的访存需求。三级数据粒度LDR/STR操作32位字,LDRH/STRH操作16位半字,LDRB/STRB操作8位字节,覆盖所有常见数据类型32/16/8bit符号扩展加载LDRSB加载字节并符号扩展至32位,LDRSH加载半字并符号扩展,用于处理有符号小数据类型LDRSB/LDRSH内存对齐要求ARM状态要求字访问4字节对齐、半字2字节对齐,未对齐访问可能导致DataAbort异常4B/2BAlign字节序模式默认小端序,低字节存低地址,部分网络协议需要大端序,可通过SETEND指令动态切换Little-EndianSYSTEMPROGRAMMING堆栈操作与状态寄存器访问堆栈操作(STM/LDM配合SP)和状态寄存器访问(MRS/MSR)是ARM系统级编程的两大支柱:前者支撑函数调用约定和中断现场保护,后者实现处理器模式切换和中断控制,两者共同构成操作系统内核和Bootloader的编程基础。01STACKFD满递减堆栈(FD)压栈STMDBSP!先递减SP再存储,出栈LDMIASP!先加载再递增SP,与C语言ABI一致02CONTEXTSAVE现场保护与恢复中断入口用STMFD保存工作寄存器和LR,返回前用LDMFD恢复,确保被中断程序不受影响03READCPSRMRS读取状态寄存器MRSR0,CPSR将当前程序状态读入通用寄存器,用于判断当前模式和条件标志状态04WRITECPSRMSR写入状态寄存器MSRCPSR_c,#0xD3切换管理模式并禁止IRQ,是操作系统启动和中断控制的核心操作CHAPTER04汇编语言伪指令与程序格式掌握段定义、数据分配与程序结构规范,编写规范的汇编源程序ASSEMBLYDIRECTIVESARM汇编伪指令体系ARM汇编伪指令是控制汇编器行为的编译时指令,不生成机器码但定义程序结构。段定义、入口标记、数据分配和符号定义等伪指令共同构成汇编程序的骨架。段定义与控制伪指令01AREA段定义:划分代码段(CODE,READONLY)和数据段(DATA,READWRITE),链接器按段名合并目标文件02ENTRY入口标记:指定程序执行的起始地址,一个项目只能有一个ENTRY,调试器从此处开始运行03CODE32/CODE16:声明后续指令为ARM(32位)或Thumb(16位)编码,影响汇编器的指令解码方式04END文件结束:标记源文件末尾,汇编器忽略此后的所有内容数据分配与符号定义01DCD/DCW/DCB:分别分配32位字、16位半字、8位字节的存储空间并可初始化,如xDCD-25定义32位有符号变量02EQU常量定义:为数值或表达式定义符号名,如numEQU29,提高代码可读性和可维护性03LTORG文字池:声明常量池位置,LDRR0,=large_const等大立即数会被汇编器自动放入此处04SPACE/MAP:SPACE分配连续存储空间,MAP配合FIELD定义结构化数据布局,用于复杂数据组织ARMAssembly完整ARM汇编程序结构示例一个规范的ARM汇编程序由代码段和数据段组成:代码段包含AREA声明、ENTRY入口、CODE32指令声明、业务逻辑指令和标准退出序列;数据段独立定义变量存储空间。01代码段声明:AREAARMex,CODE,READONLY定义只读代码段,ENTRY标记入口,CODE32指定ARM指令集状态02业务指令编写:在标号处编写核心逻辑,如MOV加载立即数、ADD/SUB执行运算、B/BL实现控制流跳转03标准退出序列:MOVR0,#0x18+LDRR1,=0x20026+SWI0x123456三指令组合,用于ADS/RVDS调试环境正常退出04数据段定义:AREAData,DATA,READWRITE声明可读写数据段,用DCD/DCW/DCB分配并初始化变量存储空间ARM汇编程序基本结构模板程序段落关键伪指令/指令作用说明代码段头AREAname,CODE,READONLY定义只读代码段,链接器按段名归类入口声明ENTRY标记程序执行起始地址指令声明CODE32/CODE16指定后续指令为ARM或Thumb编码业务逻辑标号+MOV/ADD/LDR等编写核心运算和控制流指令退出序列MOVR0,#0x18+SWI通知调试环境程序正常结束数据段AREAData,DATA,READWRITE定义可读写数据段,分配变量空间文件结束END标记源文件结尾ARM汇编程序由代码段和数据段组成,通过AREA、ENTRY等伪指令组织程序结构Chapter05ARM汇编程序设计方法从顺序到分支、循环与子程序,掌握底层程序设计的四大结构SEQUENTIALEXECUTION顺序程序设计顺序程序是ARM汇编最基础的执行模式,指令按存储顺序逐条执行、PC自动递增。合理编排指令顺序、减少数据依赖和流水线冲突是编写高效顺序程序的关键。顺序执行机制指令按存储地址依次取出执行,ARM状态下PC每次自动加4,无需显式跳转即可完成线性计算PC+4典型示例分析MOVR0,#10→MOVR1,#3→ADDR0,R0,R1,三条指令顺序完成10+3=13的计算MOV→ADD流水线优化三级流水线(取指-解码-执行)要求注意数据相关性,避免连续指令间的RAW冲突3-Stage寄存器分配策略合理安排各寄存器用途(如R0作累加器、R1-R3作操作数),避免中间结果被覆盖R0–R3BranchDesign分支程序设计:符号函数实例分支程序通过CMP比较指令配合条件跳转实现多路选择逻辑,每段处理后统一跳转到出口,是if-else逻辑在汇编层面的标准实现范式。CMP+BranchCMPR2,#0设置条件标志后,BEQ跳转到相等处理、BGT跳转到大于处理,未命中则顺序执行小于处理Three-wayx>0→MOVR3,#1;x=0→MOVR3,#0;x<0→MOVR3,#-1,三条路径覆盖符号函数全部分支Fall-through每个分支处理完毕后用Bstop跳转到公共出口,防止代码穿透到下一个分支Store&Exitstop标号处用STRR3,[R1]将结果写入y变量,随后执行标准退出序列符号函数分支程序核心指令序列标号指令功能说明compareCMPR2,#0将x的值与0比较,更新N/Z/C/V标志位BEQZEROx=0时跳转到ZERO标号处理BGTPLUSx>0时跳转到PLUS标号处理MOVR3,#-1x<0时(默认路径),将-1存入R3Bstop跳转到统一出口ZEROMOVR3,#0x=0,将0存入R3Bstop跳转到统一出口PLUSMOVR3,#1x>0,将1存入R3stopSTRR3,[R1]将结果写入y变量符号函数通过CMP+条件跳转实现三分支选择,每分支处理后统一跳转出口ARMASSEMBLY循环程序设计:最大值查找实例ARM循环程序由初始化、循环体、循环控制和出口处理四部分组成。以30个无符号数查找最大值为例,通过计数控制(R2递减至0)和条件比较(R3与R4逐次对比)实现遍历查找,是计数控制循环在汇编层面的经典实现。循环结构四要素01初始化:LDRR0,=x设置数据指针,LDRR2,=29设置循环计数,LDRR3,[R0]加载首个数据作为初始最大值02循环体:LDRR4,[R0,#4]!加载下一个数据,CMPR3,R4比较大小,MOVLTR3,R4条件更新最大值03循环控制:SUBSR2,R2,#1递减计数器并更新标志位,BNEcompare未完成则跳回循环体继续比较04出口处理:循环结束后STRR3,[R1]将最终最大值写入目标变量y循环优化技巧01倒序计数优化:计数器从N递减到0而非从0递增到N,利用SUBS自动设置Z标志省去额外的CMP指令02地址自增技巧:使用LDRR4,[R0],#4后变址寻址,每次加载后自动将指针前移4字节,减少独立的地址更新指令03条件执行减少分支:用MOVLTR3,R4替代B+MOV的分支模式,将比较和更新合并为一条条件指令,减少流水线冲刷CHAPTER25子程序设计与调用约定ARM子程序设计遵循ATPCS调用标准:BL指令调用并保存返回地址到LR,R0-R3传递前4个参数和返回值,R4-R11由被调用者保存。入口压栈、出口弹栈的现场保护机制确保子程序调用不会破坏调用者的寄存器状态。调用与返回BLfunc_name调用子程序,返回地址自动存入LR;末尾MOVPC,LR返回调用点。BL指令自动完成跳转和保存返回地址两个操作,是ARM汇编中最常用的子程序调用方式。BL→LR参数传递规范R0-R3传递前4个参数,超出部分通过堆栈传递;返回值统一放入R0。这种寄存器传参方式比纯堆栈传参效率更高,减少了内存访问次数。R0—R3现场保护入口STMFDSP!保存寄存器和LR,出口LDMFDSP!恢复并返回。满递减堆栈操作配合写回模式,实现高效的多寄存器保存与恢复。STMFD/LDMFD寄存器使用规则R0-R3和R12为调用者保存,R4-R11为被调用者保存,使用前必须压栈。被调用者保存寄存器若被修改,必须在返回前恢复原值,保证调用者透明。R4—R11嵌套调用支持每次BL调用存入新LR,入口必须先将LR压栈,否则嵌套调用丢失返回地址。子程序中再次调用其他子程序时,LR的保存是防止返回链断裂的关键。NESTEDLRARMAssembly子程序实战:数组求和函数数组求和子程序综合展示了ARM子程序设计的核心技巧:参数传递、现场保护、后变址遍历、倒序计数与现场恢复。主程序调用部分01参数准备:LDRR0,=array加载数组首地址到R0,MOVR1,#10将数组长度放入R102调用与接收:BLsum_array调用子程序,返回后R0中即为求和结果,可继续后续处理或存储子程序实现部分01现场保护与初始化:STMFDSP!,{R2-R3,LR}保存工作寄存器和返回地址,MOVR2,#0初始化累加器为002循环累加:loop标号处LDRR3,[R0],#4后变址加载元素并推进指针,ADDR2,R2,R3累加,SUBSR1,#1递减计数03循环控制与返回:BNEloop未完成则继续循环,MOVR0,R2将结果放入R0,LDMFDSP!,{R2-R3,PC}恢复并返回CHAPTER06汇编与C语言混合编程掌握内联汇编与外部汇编调用,实现C语言与ARM汇编的高效协作MixedProgrammingC与汇编混合编程两种方式C与ARM汇编混合编程有两种模式:内联汇编适合在C函数中嵌入少量硬件操作指令,编写便捷但移植性受限;外部汇编文件适合编写独立的汇编函数模块,结构清晰且可独立优化,是大型嵌入式项目中混合编程的推荐方式。内联汇编01在C代码中使用__asm{}关键字嵌入汇编指令,如MOVR0,#10;ADDR0,R0,R102适用场景:少量寄存器操作、CPSR读写、特殊指令调用(NOP、WFI)及性能热点微优化03注意事项:编译器可能无法优化内联汇编周围代码,GCC与ARMCC语法差异较大,移植性受限外部汇编文件调用01汇编端导出:在.s文件中用EXPORTfunc_name导出函数符号,函数体遵循ATPCS调用约定02C端声明调用:在.c文件中声明externintfunc_name(inta,intb),像普通C函数一样调用03链接整合:汇编与C文件分别编译为.o目标文件,链接器根据符号名完成函数调用的地址绑定AAPCS·ARMArchitectureATPCS调用标准与实战示例ATPCS定义了C与汇编之间的标准调用接口:R0-R3传参、R0返回、R4-R11被调用者保存、堆栈8字节对齐。遵循此标准可实现C和汇编函数的无缝互调。参数传递规则前4个整型参数通过R0-R3传递,第5个及以后的参数从右向左依次压入堆栈,浮点参数使用S0-S15/VFP寄存器传递。R0–R3前4个整型参数返回值约定32位结果存R0,64位结果存R0(低32位)+R1(高32位),结构体返回值通过隐式指针参数传递。32/64bit单寄存器与双寄存器堆栈对齐要求AAPCS要求公共接口处堆栈8字节对齐(SP最低3位为0),未对齐可能导致LDRD/STRD指令异常。8ByteSP最低3位为零实战示例C调用汇编加法函数:C端声明ex

温馨提示

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

评论

0/150

提交评论