版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Chapter4ARM7TDMI汇编语言程序设计嵌入式系统基础教程·汇编语言设计方法与实战Contents本章内容概览ARM7TDMI汇编语言程序设计的核心知识体系,从基础语法到实战编程的完整路径。01汇编语言基础与程序结构02伪指令与伪操作详解03程序设计规范与基本方法04实战案例与综合编程CHAPTER01汇编语言基础与程序结构从机器语言到汇编语言,理解ARM程序的基本组成与段结构Assembly&MachineLanguage汇编语言与机器语言汇编语言是机器语言的符号化表达,通过助记符替代二进制操作码,显著提升程序可读性与编写效率,但必须经汇编器翻译为机器码后才能被ARM处理器执行。01机器语言由二进制操作码与操作数组成,CPU可直接执行但可读性极差,如ARM加法指令机器码为32位二进制串。32-bit02汇编语言用ADD、MOV等助记符替代二进制操作码,用R0–R15符号替代寄存器编号,便于程序员理解和编写。R0–R1503汇编器(Assembler)负责将汇编源程序逐条翻译为等价的机器码,一条汇编指令通常对应一条机器指令。1:1PROGRAMSTRUCTUREARM汇编源程序基本结构ARM汇编源程序以段(Section)为基本组织单位,通过AREA定义代码段或数据段,ENTRY标记程序入口点,END标记文件结束,构成层次清晰的程序骨架。01·AREA段定义AREA伪指令定义段的名称与属性(CODE/DATA、READONLY/READWRITE),每个段在内存中占据独立的连续地址空间。02·ENTRY入口标记ENTRY伪指令标记程序中第一条可执行指令的位置,链接器据此确定程序的起始执行地址。03·END文件终止END伪指令标记整个汇编源文件的结束,汇编器遇到END后停止处理后续内容。04·EQU常量定义EQU伪指令用于定义常量符号,如numEQU20,后续程序中可直接引用符号名替代数值。ARMAssembly·MemoryLayout代码段与数据段ARM汇编程序严格区分代码段与数据段:代码段存放只读的可执行指令,数据段存放可读写的初始数据和缓冲区,两者通过段名和属性分离管理,是嵌入式内存布局的基础。代码段(CODE)用AREA定义,属性为CODE,READONLY,存放汇编指令序列,编译后映射到Flash或ROM只读存储区通过标号标记函数或子程序入口地址,如start标记程序起点、wordcopy标记循环体入口READONLY·Flash/ROM数据段(DATA)用AREA定义,属性为DATA,READWRITE,存放初始数据和运行时缓冲,映射到RAM可读写存储区使用DCD(32位字)、DCB(字节)、DCW(半字)等伪指令定义初始数据,如srcDCD1,2,3,4READWRITE·RAMARM7TDMIAssembly实例:内存块拷贝程序通过完整的内存块拷贝实例展示ARM汇编程序的典型结构:段定义→入口标记→初始化→循环处理→退出,涵盖LDR/STR数据搬运、SUBS+BNE循环控制和SWI系统调用三大核心模式。01初始化阶段:LDRr0,=src和LDRr1,=dst分别加载源与目标地址,MOVr2,#num设置循环计数器为2002循环体wordcopy:LDRr3,[r0],#4使用后索引方式每次从源地址读取一字并自动更新指针,STRr3,[r1],#4写入目标03循环控制:SUBSr2,r2,#1递减计数器并更新状态标志,BNEwordcopy在计数器非零时跳回循环体继续执行04程序退出:stop处通过SWI0x123456触发ARM半主机(semihosting)软中断,通知调试器程序正常结束CHAPTER04·ARM7TDMIASSEMBLY标号与程序流程控制标号是汇编程序中的地址符号,为跳转指令和子程序调用提供目标地址引用,是构建循环、分支和函数调用等控制流结构的基础元素。01标号以字母开头,后跟字母、数字或下划线,末尾加冒号(如start:),汇编器将其替换为对应的内存地址label:02B/BL指令通过标号实现±32MB范围内的无条件跳转与子程序调用,BL同时保存返回地址到LR寄存器±32MB03条件分支指令(BNE/BEQ/BGT等)配合标号实现if-else逻辑,如SUBS+BNE构成经典的do-while循环结构do-while04超范围跳转需使用LDR伪指令加载目标地址到寄存器,再通过BXRn指令实现32位全地址空间的间接跳转BXRnChapter02伪指令与伪操作详解深入理解ADR、LDR伪指令、数据定义伪操作与符号定义机制ARMASSEMBLYADR伪指令:小范围地址读取ADR伪指令通过汇编器自动替换为ADD/SUB指令,实现基于PC的±255至±1020字节范围内的地址加载,无需文字池支持,是局部数据和代码地址访问的高效手段。汇编器替换机制ADR将PC相对偏移的小范围地址加载到目标寄存器,汇编时替换为一条ADD或SUB指令,不占用额外存储ADD/SUB地址范围分档非对齐地址的加载范围为±255字节,字对齐(4字节对齐)地址范围扩展至±1020字节±1020B典型用法如ADRR0,data_table,将附近数据表首地址装入R0,后续通过LDRR1,[R0]访问数据ADRR0,LABEL与LDR伪指令对比与LDR伪指令相比,ADR无需文字池(LiteralPool),执行效率更高,但受限于地址偏移范围NOLITERALPOOLARMAssembly·PseudoInstructionLDR伪指令:大范围地址与常量加载LDR伪指令(LDRRd,=expr)是ARM汇编中加载任意32位常量和地址的核心工具,汇编器智能地根据值的大小选择MOV/MVN替代或文字池加载策略,平衡了代码效率与功能完整性。01指令格式格式为LDRRd,=表达式,等号不可省略,用于将任意32位常量或标号地址加载到目标寄存器。LDRRd,=expr02智能替换若常量在MOV/MVN可表达范围内(8位立即数循环右移偶数位),汇编器自动替换为等效指令,无需文字池。8-bitImmediate03文字池加载超出MOV/MVN范围时,汇编器将常量存入文字池(LiteralPool),生成一条PC相对偏移的LDR指令从池中读取。LiteralPool04标号地址加载标号地址同理,如LDRR0,=Delay将标号运行时地址装入R0,编译后在文字池中存放该地址常量。PC-RelativeChapter4·ARM7TDMIAssemblyLDR伪指令编译过程详解LDR伪指令的编译过程体现了汇编器的智能优化:将程序员的高层意图自动转化为最优的底层实现,通过文字池机制实现任意32位地址的间接加载,对程序员完全透明。LDR伪指令编译前后对照地址源程序编译后说明0x60LDRR0,=DelayLDRR0,0xb4从文字池加载地址0x64Delay:MOVR0,LRMOVR0,LRDelay标号所在地址0xb4(自动生成)DCD0x64文字池存放Delay地址汇编器通过文字池机制将LDR伪指令翻译为PC相对偏移的LDR真指令,实现任意32位地址加载源程序编译映射:LDRR0,=Delay编译后,地址0x60处生成LDRR0,0xb4(从文字池读取),地址0xb4处存放常量DCD0x64。0x60→0xb4文字池机制:LiteralPool是编译器在代码段末尾自动分配的常量存储区,存放无法用MOV/MVN表达的32位常量。LiteralPool反汇编验证:Delay标号处的MOVR0,LR编译为地址0x64,反汇编确认LDR伪指令成功将Delay的实际运行地址加载到R0中。Addr=0x64LTORG手动控制:LTORG伪指令可手动放置文字池位置,避免PC偏移超限,通常放在代码段末尾或大范围跳转之后。LTORGARM7TDMIASSEMBLYNOP伪指令与数据定义伪操作NOP伪指令提供精确的软件延时和指令对齐能力,而DCD/DCW/DCB等数据定义伪操作则是构建初始数据表、查找表和缓冲区的标准工具,两者共同支撑底层嵌入式编程的数据与时序控制需求。NOP空操作伪指令01汇编时被替换为MOVR0,R0等等效空操作指令,不改变任何寄存器和状态标志的实际值。这种等效替换保证了指令在流水线中的执行时序特性。02主要用途包括软件精确延时、指令边界对齐以满足流水线效率要求,以及调试时临时占位。在硬件外设初始化等待周期中尤为常用。MOVR0,R0数据定义伪操作01DCD(DataControlDoubleword)分配32位字并初始化,如srcDCD1,2,3,4连续存放4个字。适用于常量表和跳转地址表。02DCB定义字节数据,DCW定义16位半字,SPACE分配指定字节数的零初始化存储空间用作缓冲区。DCB常用于字符串和字节配置数据。DCD·DCW·DCB·SPACEPseudoOperations符号定义与链接伪操作符号定义伪操作(EQU/GBL系列)和链接伪操作(GLOBAL/IMPORT)是ARM汇编模块化编程的基础,支持多文件独立汇编后链接为完整程序,实现代码复用与团队协作。EQU数值常量定义定义数值常量(如numEQU20),赋值后不可更改,用符号名替代硬编码数值提高可维护性不可变GBL全局变量定义GBLA/GBLL/GBLS分别定义全局算术、逻辑和字符串变量,可跨MACRO调用共享,赋值后允许修改可修改GLOBAL全局符号导出声明标号为全局可见,使其他源文件可通过链接器访问该标号所标记的函数或数据ExportIMPORT外部符号引入声明本文件引用的外部符号,链接器负责在最终链接阶段将外部符号解析为实际地址ImportChapter03程序设计规范与基本方法子程序调用、堆栈管理、寄存器保护与条件执行的实战规范CHAPTER4·ARM7TDMI汇编子程序调用与返回机制ARM子程序通过BL指令调用(自动保存返回地址到LR)、BXLR返回,嵌套调用时必须在入口处将LR压栈保护,这是避免返回地址丢失的关键编程规范。STEP01BL跳转并链接指令BL指令执行两步操作:将下一条指令地址写入LR(R14),然后跳转到目标标号处开始执行子程序代码。BLsubroutine_labelSTEP02BXLR子程序返回机制子程序末尾用BXLR(推荐)或MOVPC,LR实现返回,BXLR同时支持ARM/Thumb状态切换。BXLR;返回调用点NESTEDPUSHLR嵌套调用保护嵌套调用场景:子程序A调用子程序B时,BL会覆盖LR中原有返回地址,必须在A入口处压栈保存LR。PUSH{LR}...POP{LR}OPTIMIZELEAF叶子函数优化叶子函数(不再调用其他子程序)可直接使用LR返回,无需压栈,这是性能优化的常见手段。Leaffunction:nostackneededChapter4·ARM7TDMIAssembly堆栈操作与寄存器保护ARM7TDMI使用满递减堆栈(FD),STMFD/LDMFD配对指令实现高效的批量寄存器入栈出栈,是子程序现场保护与恢复的标准方法,确保调用者寄存器状态不被破坏。01—堆栈模型(满递减FD)SP(R13)指向最后一个已入栈的数据单元,新数据入栈时SP先减后存,堆栈从高地址向低地址方向生长STMFD(=STMDB)先递减SP再存储,LDMFD(=LDMIA)先加载再递增SP,两者严格配对保证堆栈一致性02—寄存器保护规范子程序入口处STMFDSP!,{R4-R11,LR}保存被调用者需要使用的寄存器和返回地址到堆栈子程序出口处LDMFDSP!,{R4-R11,PC}一次性恢复所有寄存器并将LR值直接写入PC实现返回ARM7TDMI·ConditionalExecution条件执行机制ARM指令集的每条指令均可附加4位条件码,实现无分支的条件执行,在简单判断场景中避免了跳转指令和流水线冲刷开销,是ARM架构高代码密度的关键设计特色。01条件码字段ARM指令高4位为条件码字段,支持EQ/NE/GT/LT/GE/LE等15种条件判断,AL(始终执行)为默认条件通常省略不写。15种条件02无分支执行条件执行避免简单判断的分支跳转,如MOVEQR0,#1/MOVNER0,#0代替CMP+BNE+MOV的两路分支结构。MOVEQ/MOVNE03流水线优化减少分支指令数量意味着降低流水线因分支预测失败导致的冲刷(flush)概率,从而提升整体执行效率。Flush↓04适用边界复杂多路判断仍应使用B/BL条件分支,条件执行最适合2-3路简单赋值或运算的if-else场景。2-3路Chapter4·ARM7TDMI汇编语言程序设计循环结构设计ARM汇编循环分为计数循环(SUBS+BNE模式)和条件循环(CMP+条件分支模式)两种基本结构,关键在于SUBS的S后缀确保状态标志更新。计数循环类for循环01MOVR2,#N设置计数初值,循环体末尾SUBSR2,R2,#1递减并更新Z标志,BNE跳回循环头直至计数器归零02适合已知迭代次数的场景,如数组遍历、内存块拷贝,SUBS的S后缀确保CPSR标志位更新,不可省略典型应用:数据搬运、批量初始化、固定次数的延时循环SUBS+BNE条件循环类while循环01循环体内用CMP比较操作结果,根据条件码决定是否继续,如CMPR0,#0/BNEloop实现R0非零时持续循环02适合迭代次数不确定的场景,如等待外设状态位、搜索满足条件的数据,需特别注意防止死循环典型应用:轮询检测、事件等待、条件驱动的状态机循环CMP+BNEChapter4·ARM7TDMIATPCS调用规范ATPCS(ARM-ThumbProcedureCallStandard)定义了ARM汇编子程序的标准调用接口,规范了参数传递寄存器、返回值约定和寄存器保存责任,是汇编与C语言混合编程的协议基础。Params前4个参数依次使用R0–R3,超出部分通过堆栈压入传递,由调用者负责入栈Return32位结果通过R0返回,64位结果通过R0+R1联合返回Caller-SaveR0–R3,R12调用前如需保留须自行压栈,子程序可自由使用Callee-SaveR4–R11子程序若使用须在返回前恢复原始值,确保调用者环境不变ATPCS寄存器使用约定一览寄存器别名角色保存责任R0-R3a1-a4参数传递/返回值调用者保存(caller-save)R4-R11v1-v8通用工作寄存器被调用者保存(callee-save)R12IP过程内临时寄存器调用者保存R13SP堆栈指针必须始终保持有效R14LR链接寄存器(返回地址)嵌套调用时须压栈保护R15PC程序计数器由硬件自动管理ATPCS规范明确了16个寄存器的角色分工与保存责任,是确保汇编子程序正确交互的协议基础CHAPTER04实战案例与综合编程通过完整编程案例串联汇编语言设计的核心知识与实战技能CaseStudy·ARM7TDMI案例一:数据块搬移程序数据块搬移是嵌入式系统的基础内存操作,关键在于判断源区与目标区是否重叠并选择正确的搬移方向,使用LDR/STR后索引寻址配合循环实现高效的块拷贝。01不重叠区域顺序搬移从低地址向高地址顺序搬移,LDRr3,[r0],#4和STRr3,[r1],#4每次处理一字并自动推进指针。02重叠区域后向搬移目标地址大于源地址时,必须从高地址向低地址后向搬移,避免先搬数据被后续写操作覆盖。03循环计数与条件跳转采用SUBSr2,r2,#1递减计数并更新标志位,BNE跳回循环头,计数器归零时自动退出。04地址加载与文字池地址加载使用LDR伪指令(LDRr0,=src),汇编器自动处理地址常量到文字池的分配和加载。CASESTUDY·ARMASSEMBLY案例二:数组最大值查找数组最大值查找综合运用了数组遍历、条件比较和寄存器状态管理三大汇编编程技能,通过CMP+BGT实现有符号数的大小判断,是条件执行和循环结构结合的经典案例。01初始化阶段用LDR加载数组首地址到R1,数组长度到R2,首元素到R0作为当前最大值的初始基准LDR·首地址·基准值02循环比较LDRR3,[R1],#4逐一读取后续元素,CMPR3,R0比较大小,MOVGTR0,R3在新值更大时更新CMP+MOVGT·逐一遍历03CMP指令机制CMP执行R3-R0减法运算但不保存结果,仅根据差值更新CPSR中的N、Z、C、V四个条件标志位CPSR·N/Z/C/V标志位04BGT条件判断BGT基于Z=0且N=V判断有符号大于,SUBS递减计数器+BNE循环直到遍历完毕,R0即为最大值Z=0且N=V·SUBS+BNEATPcs·AssemblyCaseStudy案例三:子程序调用求和求和子程序案例完整演示了ATPCS规范下的子程序设计流程:R0-R1传参、循环累加、R0返回结果、STMFD/LDMFD保护与恢复现场,是理解汇编函数接口的标准范例。主程序(调用者)参数准备:LDRR0,=array加载数组首地址到R0作为第一参数,MOVR1,#N设置数组长度到R1作为第二参数调用与返回:BLsum调用求和子程序,返回后R0中存放求和结果,可进一步通过STR保存到内存或通过SWI输出寄存器约定:主程序需确保调用前R0-R3参数寄存器已正确赋值,R4-R11为被调用者保护寄存器,若主程序使用则需自行保存结果处理:子程序返回后,R0包含32位有符号求和结果,可通过后续指令进行边界检查、格式化输出或作为其他计算的输入参数sum子程序(被调用者)现场保护:入口处STMFDSP!,{R4,LR}保护R4和返回地址,MOVR2,#0初始化累加器,R3用作循环临时变量循环累加:LDRR3,[R0],#4读取元素并推进指针,ADDR2,R2,R3累加,SUBSR1,R1,#1/BNE继续循环结果返回:循环结束后MOVR0,R2将累加结果移至R0,LDMFDSP!,{R4,PC}恢复现场并返回,自动恢复LR到PCATPCS合规:严格遵循ARM-Thumb过程调用标准,仅使用R0-R3传参,R4-R11保护现场,R0返回结果,保证与C语言等高级语言的无缝互操作CHAPTER04·ARM7TDMIASSEMBLY案例四:查表程序设计查表法以预存数据空间换取运行时计算时间,通过索引偏移寻址实现O(1)时间复杂度的数据查找,是嵌入式系统中处理映射关系、段码转换和校准参数的标准编程模式。DCD定义tableDCD0x3F,0x06,0x5B,0x4F数据段用DCD定义查找表,如tableDCD0x3F,0x06,0x5B,0x4F存放LED共阴极段码,每元素占4字节。LSL#2偏移ADDR0,R0,R1,LSL#2索引值左移2位(LSL#2)等效乘以4得到字节偏移量,ADDR0,R0,R1,LSL#2计算目标地址。LDR读取LDRR2,[R0]LDRR2,[R0]从计算出的地址处读取目标数据,整个过程仅需3条指令完成查找,时间复杂度O(1)。LDRB/LDRH字节表使用LDRB读取(每元素1字节,无需移位),半字表使用LDRH读取(偏移=索引×2,LSL#1)。Chapter4·CaseStudy案例五:字符串长度计算字符串长度计算是字节级内存操作的典型应用,通过LDRB逐字节读取并检测零终止符实现while循环,展示了汇编语言中指针操作和条件循环的底层实现方法。01逐字节读取与指针推进LDRBR2,[R0],#1指令实现后变址寻址,每次读取后R0自动指向下一个字节。LDRB仅加载8位数据到寄存器低字节,高24位自动清零,确保数据处理的准确性。02终止符检测与循环退出CMPR2,#0将读取的字节与零比较,检测字符串终止符'\0'。BEQend指令在相等时跳转,实现循环退出机制,这是C风格字符串的标准处理方式。03双寄存器分工协作R0作为地址指针自动递增遍历字符串,R1作为独立的长度计数器。ADDR1,R1,#1在每次读取非零字节时执行,两寄存器各司其职,代码结构清晰高效。04数据段字符串定义字符串使用DCB伪指令定义并以0结尾,如msgDCB'Hello,ARM!',0。DCB逐字节存放字符的ASCII码,末尾的0作为终止标记,符合C语言字符串规范。CASESTUDY06·ARMASSEMBLY案例六:多分支程序(switch-case)多分支程序有两种实现策略:比较链适合分支少(≤4个)的简单场景,跳转表法通过地址索引实现O(1)跳转效率,适合分支多且case值连续的场景,是高效多路分发的标准方案。比较链法01CMPR0,#0/BEQcase0/CMPR0,#1/BEQcase1—依次比较,匹配即跳转到对应处理代码块CMPR0,#0→BEQcase0CMPR0,#1→BEQcase102优点是实现简单直观,缺点是分支数增多时比较次数线性增长,最坏情况需遍历所有caseO(n)线性比较跳转表法01数据段定义地址表,每个元素存放对应case处理代码的入口地址jump_tableDCDcase0,case1,case2,case302用输入值R0作为索引直接跳转,时间复杂度O(1)LDRR1,=jump_tableLDRPC,[R1,R0,LSL#2]O(1)直接跳转ISRDesign案例七:中断服务程序设计ARM中断服务程序(ISR)需在硬件自动切换模式和保存LR的基础上,手动完成工作寄存器的压栈保护和出栈恢复,通过SUBSPC,LR,#4实现PC与CPSR的原子性恢复返回。中断信号波形与硬件触发器示意01硬件自动保存IRQ触发时,CPSR自动保存至SPSR_irq,处理器切换至IRQ模式寄存器组,硬件自动将LR_irq设置为被中断指令地址+偏移量,完成现场初步保护。02软件压栈保护执行STMFDSP!,{R0-R3,R12,LR}指令,将R0-R3、R12等工作寄存器及链接寄存器压入IRQ模式堆栈,确保ISR执行不破坏被中断程序的寄存器上下文。03恢复与返回ISR结束前执行LDMFDSP!恢复所有寄存器,随后SUBSPC,LR,#4指令同时完成PC跳转和CPSR恢复,实现原子性中断返回,保证程序状态完整性。04关键细节说明S后缀触发CPSR从SPSR_irq恢复,#4偏移修正ARM三级流水线导致的LR超前问题,确保返回地址精确指向被中断指令的下一条指令。CHAPTER4·CASESTUDY案例八:ARM汇编与C语言混合编程汇编与C混合编程通过ATPCS规
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医院院长年终个人总结
- 印刷机械公司市场营销经理述职报告
- 九师联盟-2026届高三-2026年2月-化学-答案
- 旋律分析综合试题及答案
- 2026年山东鲁粮集团招聘试题及答案
- 2025-2026年福建省绿色发展知识考试习题集
- 2026年江苏省苏教版初中数学上册第6章同步练习题
- 2026普通话水平测试考点训练习题
- 2025-2026年江苏省苏教版初中物理电学应用测试卷
- 2026年法学专业宪法学模拟试卷
- 天然气运输管理方案
- 工业自动化设备维护操作规范手册
- 2025年北师大新版数学三年级上册第二单元《测量(二)》教案
- 留置尿管患者居家护理健康宣教
- 房屋租赁法律培训课件
- 食品安全日管控、周排查及月调度记录表
- 《设计构成》课件 第1章 认识设计构成;第2章 平面构成基础
- 2025阀门装配工艺规程
- 非营利组织资金使用情况说明
- 《永辉超市S店库存管理问题及产生原因和优化建议》8700字(论文)
- 《无人机飞行操控技术》项目4 垂直起降固定翼无人机飞行操控
评论
0/150
提交评论