收藏 分销(赏)

第3章 基于ARM的嵌入式软件开发基础.pdf

上传人:曲**** 文档编号:546078 上传时间:2023-11-27 格式:PDF 页数:97 大小:5.86MB
下载 相关 举报
第3章 基于ARM的嵌入式软件开发基础.pdf_第1页
第1页 / 共97页
第3章 基于ARM的嵌入式软件开发基础.pdf_第2页
第2页 / 共97页
第3章 基于ARM的嵌入式软件开发基础.pdf_第3页
第3页 / 共97页
第3章 基于ARM的嵌入式软件开发基础.pdf_第4页
第4页 / 共97页
第3章 基于ARM的嵌入式软件开发基础.pdf_第5页
第5页 / 共97页
点击查看更多>>
资源描述

1、第三章基于ARM的嵌入式软件开发基础基于A R M的嵌入式软件开发基础嵌入式程序一般都采用汇编语言、C(或C+)语言以 及汇编语言与C语言的混合编程。为了更好的进行 基于ARM的嵌入式软件开发,本章密切结合第四章 具体开发例程,对基于ARM的嵌入式软件开发中所 涉及到的基础内容进行了简述。通过对本章的学习,使大家能够掌握基于ARM嵌入 式程序设计的基本知识。基于ARM的嵌入式软件开发基础A ARM指令集A Thumb指令集A ARM汇编语言程序设计基础嵌入式C语言程序设计基础A嵌入式C语言程序设计技巧AC与汇编语言混合编程 基本内容:3.liARM指令集概述 3.L2ARM寻址方式 313 A

2、RM指令的详细介绍 学习目的:对ARM指令集有初步认知 如何使用ARM指令集3.1.1 ARM指令集概述A ARM指令集的特点:A由于ARM处理器是基于精简指令集原理设计的,其指 令集及译码机制相对较简单。AARM指令集是32位的,程序的启动都是从ARM指令集 开始,包括所有的异常中断都自动转化为ARM状态。所有的ARM指令集都可以是有条件执行的。A本节从指令集编码、条件执行、指令分类及指令格式 等几个方面对于ARM指令集进行概述。A ARM指令集编码特点:A ARM指令集是以32位二进制编码的方式给出的。A大部分的指令编码中定义了第一操作数、第二操作 数、目的操作数、条件标志影响位以及每条指

3、令所对 应的不同功能实现的二进制位。每条32位ARM指令都具有不同的二进制编码方式来和 不同的指令功能相对应。31 30 29 2S 27 26 25 24 23 22 21 2D 19 18 17 16 15 14 13 12 11 1O 9 S 7 6 S 4 3 2 1 0Cond001OpcodeS十RdOperand 2Data Processing/PSR TransferMultiplyMMp/y LongSingle Data SwapBranch and ExchangeHalfword Data Transfer:register offsetHalfword Data T

4、ransfer:immediate offsetSingle Data TransferUndefinedBlock Data TransferBranchCoprocessor Data TransferCoprocessor Data OperatfwxCoprocessor Register TransferSoftware InterruptCond0000 00ASRdRnRs1001RmCond00001UASRdHiRdLoRn1001RmCond00010B00十Rd00001001RmCond000100101111111111110001RnCond000Pu0L十门口00

5、001sH1RmCond000Pu1LRnRdOffset1sH1OffsetCond011PuBLRnRdOffsetCond0111Cond100PuS/sLRnRegister ListCond101LOffsetCond110PUNLRnCRdCP#OffsetCond1110CPiOpcCRnCRdCP#CP0CRmCond1110CP OpcLCRnRdCP#CP1CRmCond1111Ignored by processor31 30 29 2S 27 26 2S 24 23 22 21 2D 19 18 17 16 15 14 13 12 11 1O 9 8 7 G S 4 3

6、 2 1 OA在ARM的指令编码表中,统一占用编码的最高四位 印:28来表示“条件码。每种“条件码”用两个英文缩 写字符表示它的含义,可以添加在指令助记符的后面 表示指令执行时必须要满足的条件。A ARM指令根据C PSR中的条件位自动判断是否执行指 令,在条件满足时,指令执行;否则指令被忽略(可 以认为执行了一条NOP伪指令)。寄存器 器 SPSR(1)条件码标志:N、Z、C、VN在结果是带符号的二进制补码情况下,如果结果为负数,则N=l;如果结 果为非负数,则N=0。Z如果结果为0,贝Ijz=l;如果结果为非0,贝收=0。c它的设置分以下几种情况;对于加法指令(包括比较指令CMN),如果产

7、生进位,贝贯=1;否则C=0。对于减法指令(包括比较指令CMP),如果产生借位,贝贯=0;否则C=l。对于有移位操作的非加减法指令,C为移位操作中最后移出位的值。对于其他指令,C通常不变。V它的设置也分为以下两种情况:对于加减法指令,在操作数和结果是带符号的整数时,如果发生溢出,则V=l;如果无溢出发生,则v=o。对于其他指令,V通常不发生变化。件执行例如,数据传送指令MOV加上条件后缀EQ后成为 MOVEQ,表示“相等则执行传送”,“不相等则本条指 令不执行”,即只有当C PRS中的Z标志为丁时,才会发 生数据传送。A下表列举了四位条件码“cond”的16种编码中能为用户 所使用的巧种,而编

8、码“uu”为系统暂不使用的保留编 码。操作码31:28卜助记符 扩展*解释,用于执行的标志位状态.OOOOpE(相等;等于0Z置位0001PNE不等z清零.0010CSHS.进位,无符号数高于或等于,C置位.OOIIpCCLOc无进位,无符号数小于,c清零OIOOpML负数N置位巾0101PPLp正数或0cN清零OHOp&溢出CV置位,01山VC。未溢出CV清零lOOOpHL无符号数高于C置位Z清零1001PLS.无符号数小于或等于,C清零Z置位,1010-GE。有符号数大于或等于N等于1011LT,有符号数小于,N不等于1100-有符号数大于,Z清零且N等于1101LE+有符号数小于或等于,

9、Z置位且N不等于V,1110-AL,总是任何状态lllhNV.从不(未使用)无A指令分类简述A ARM指令集是Load/Store型的,只能通过Load/Store 指令实现对系统存储器的访问,而其它类型的指令是 基于处理器内部的寄存器完成操作的。ARM指令集可 以分为六大类:数据处理指令、Load/Store指令、跳 转指令、程序状态寄存器处理指令、协处理器指令和 异常产生指令。指令格式 ARM指令使用的基本格式如下:(o pco de)(co nd)S Rd,Rn,(o perandz)指令格式使用举例 LDR Ro,Ri;读取Ri地址上的存储单元内容给Ro,执行条件 ALo BEQ DA

10、TAEVEN;条件执行分支指令,执行条件EQ,即相等则跳 转;至!!DATAEVEN o ADDS R2,Ri,#1;加法指令,RzR2影响CPSR寄存器(S)o寻址方式是根据指令编码中给出的地址码字段来寻找真实操作数的方 式。ARM处理器支持的基本寻址方式有以下七种方式。立即寻址寄存器寻址寄存器间接寻址基址加偏移寻址堆栈寻址块拷贝寻址相对寻址从内存管理角度看,堆栈是一块用于保存数据的连续 内存,也就是一种按特定顺序进行数据存取的存储 区,这种特定的顺序可以归结为“后进先出(LI FO)或“先进后出(FI LO)。指向堆栈的地址寄存器称为 堆栈指针(SP),堆栈的访问是通过堆栈指针(比3,AR

11、M处理器的不同工作模式对应的物理寄存器各不相 同)指向一块存储器区域(堆栈)来实现的。A堆栈既可以向下增长(向内存低地址),也可以向上 增长,这就是堆栈的两种生长方式:A向上生长:即访问存储器时,存储器的地址向高地址 方向生长,称为递增堆栈(ascending stack)。A向下生长:即访问存储器时,存储器的地址向低地址 方向生长,称为递减堆栈(descending stack)。堆栈寻址A根据堆栈指针指向的数据位置的不同,它又可以分 为:A满堆栈(Fun Stack):堆栈指针指向最后压入堆栈的 数据或者指向第一个要读出的数据。A空堆栈(Empty Stack):堆栈指针指向最后压入堆栈

12、的数据的上或下一个空位置或者指向第一个要读出的 数据的上或下一个空位置(根据堆栈的生长方向而 定)。根据以上的描述说明,堆栈有四种形式,分别是由递增、递减、满 栈、空栈组成的所有组合。ARM处理器支持这四种形式的堆栈:A满递增:堆栈随着存储器地址的增大而向上增长,基址寄存器指向存 储有效数据的最高地址或者指向第一个要读出的数据的位置。空递增:堆栈随着存储器地址的增大而向上增长,基址寄存器指向存 储有效数据的最高地址的上一个空位置或者是指向将要读出的第一个 数据位置的上一个空位置。满递减:堆栈随着存储器地址的减小而向下增长,基址寄存器指向存 储有效数据的最低地址或者是指向第一个要读出的数据的位置

13、。空递减:堆栈随着存储器地址的减小而向下增长,基址寄存器指向最 后压入堆栈的数据的下一个空位置或者指向将要读出的第一个数据位 置的下一个空位置。ARM指令集总体分为以下6类:数据处理指令;程序状态寄存器与通用寄存器之间的传送指令;Lo ad/Sto re指令;转移指令;异常中断指令;协处理器指令。ARM的数据处理指令主要完成寄存器中数据的算术和逻辑运算操作。ARM数据处理指令的基本原则为:所有的操作数都是32位宽,或来自寄存器,或是在指令中定义的立即数(符号或。扩 展);如果数据操作有结果,则结果为32位宽,放在一个寄存器中。(有一个例外:长乘指 令产生64位的结果);ARM指令中使用但地址模

14、式”,即每一个操作数寄存器和结果寄存器在指令中分别指 定。数据处理指令根据指令实现处理功能可分为以下六类:数据传送指令;算术运算指令;逻辑运算指令;比较指令;测试指令;乘法指令。根据第二操作数的类型,其汇编格式分为以下两种:S Rd,Rn,#32位立即数 S Rd,Rn,Rm,A ARM数据处理指令使用两个源操作数和一个目的寄存器(Rd)的“3地 址模式”,一个源操作数(Rn)总是寄存器,第二个被称为“灵活的第 二操作数。peranch,它可以是寄存器、移位后的寄存器或立即数。如 果第二操作数是寄存器Rm,它的移位可能是逻辑移位、算术移位或是 循环移位,移位的位数可以是立即数,也可以是寄存器的

15、内容。当指令为仅需要一个源操作数的指令(如MOV、MVN)时,省略 Rn;当指令为仅产生条件码输出的比较测试指令(CMP、CMN、TST、TEQ)时省略Rd。这些指令中不需要全部的可用操作数,这种 不用的寄存器在二进制编码中的寄存器域中应该设置为。(详见ARM 指令集编码)。操作码24:21助记符Q意义效果*0000AND.逻辑位与,Rd=Rii AND Op2尸000%EOR逻辑位异或,Rd=Rii EOR Op20010,SUB减Rd=Rii-Op2001bRSB反向减,Rd=Op2-Rn0100ADD.加“Rd=Rn+Op 2。010hADC带进位加.Rd=Rn+C)p2+O0110SB

16、C?带进位减.Rd=Rii-Op2+C-%011kRS(?反向带进位减,Rd=Op2-Rii+C 11000TST.测试,根据Rn AND Op2设置条件码,100kTEQ测试相等,根据Rn EOR C)p2设置条件川1010CMP比较根据Rii-Op2设置条件码1011.CMN负数比较一根据Rii+Op2设置条件码。1100。o w逻辑位或一Rd=Rii OR Op2d110bMOV传送Rd=Op2rlllOpBIC位清零Rd=Rii AND NOT Op2r111bMN求反Rd=NOT Op2 n5(PC)作为特殊的寄存器,控制程序的运行地址,同时它也可以作 为一般寄存器,但使用时必须注意

17、细节问题。寄存器门5可以用作源操 作数,但是不能用来指定移位位数。在使用寄存器指定移位位数的情 况下,三个源操作数都不能是n5。当口5用作源操作数时,三级流水线 操作使得真实PC值为当前指令的地址加8个字节。Ar巧用作目的寄存器时,指令的功能相当于某种形式的转移指令,执行 转移到结果对应的地址执行程序,常用来作为子程序返回。A若r巧作为目的寄存器且使用了后缀“S”,即设置了S位,则将当前模式 的SPSR拷贝到CPSR,这可能影响到中断使能标志位和处理器操作模 式。这种机制自动恢复PC和CPSR,是实现异常返回的标准方式。因 为在用户及系统模式没有SPSR,在这两种模式下这种形式的指令无 效,如

18、果使用,则指令执行的结果是不可预知的,但汇编器在汇编时 并不发出警告。ARM处理器是Lo ad/sto re型的,即它对数据的操作是通过 将数据从存储器加载到片内寄存器中进行处理,处理完成 后的绡器经过寄左臀卷回到存储器史姐快引内外存储 器进行数据处理鬲成彳亍速度。ARM的数居存取端4 Lo ad/Sto re是唯一用于寄存器和存储器之间进行数据传送 的指令。在ARM系统中,输入/输出(I/O)功能是通过存储器映射 的可寻址外围寄存器和中断输入的组合来实现的。外围设 备中有一些寄存器,在存储器映射系统中,这些寄存器映 射为存储器的地址(也就是外设寄存器与存储器统一编 验祚察些韩鹦麹髀靓鬻徽型簿

19、 指令通过类似存储器操作一样操作。ARM指令集中有三种基本的数据存取指令:单寄存器存取指令(LDR,STR)单寄存器的存取指令提供ARM寄存器和存储器间最灵活的单数据项传 送方式,传送的数据可以是8位字节、16位的半字或32位字。多寄存器存取指令(LDM,STM)虽然与单寄存器的存取指令相比,这些指令的灵活性要差一些,但它 们可以更有效地用于大批数据的传送。单寄存器交换指令(SWP)信号量是最早出现的用来解决进程同步与互斥问题的机制,包括一个 称为信号量的变量及对它进行的两个原语操作。通过PV原语对信号量 的操作可以完成进程间的同步和互斥,对信号量的操作要求在一条指 令中完成读取和修改(具体解

20、释请参见专业书籍)。ARM指令中有两条指令MSR和MRS,用于在状态寄存 器和通用寄存器之间传送数据。修改状态寄存器一般 是通过“读取一修改一写回”三个步骤的操作来实现 的。需要注意的是不能通过该指令直接修改C PSR中的 T控制位直接将程序状态切换到Thumb状态,必须通过BX等指令来完成程序状态的切换。状态寄存器到通用寄存器的传送指令(MRS)MRS指令用于将状态寄存器的内容传到通用寄存器中,它主要用于以下三种场合:通过“读取一修改一写回”操作序列修改状态寄存器的内容。MRS指令用于将状态寄存器的内容读到通用寄存器中;当异常中断允许嵌套时,需要在进入异常中断之后,嵌套中 断发生之前保存当前

21、处理器模式对应的SPSR。这时需要先通 过MRS指令读出SPSR的值,再用其他指令将SPSR值保存起 来;当进程切换时也需要保存当前寄存器值。科寄存器到状态寄存器的传送指令(MSR)当需要保存或修改当前模式下C PSR或SPSR的内容时,这些内容首先必须传送到通用寄存器中,再对选择的 位进行修改,然后将数据回写到状态寄存器。这里讲 述的MSR指令完成这一过程的最后一步,即将立即数 常量或通用寄存器的内容加载C PSR或SPSR的指定区 域。MSR CPSR_f|SPSR_f,#MSR CPSR_|SPSR_,RmA这里field表示下列情况之一:c 控制域一PSR7:。x扩展域一PSRi5:8

22、(在当前ARM中未使用)。s状态域一PSR23:i6(在当前ARM中未使用)。fl标志位域一PSR|ji:24。举例仅设置C标志位,保存N、Z和V:MRSro,CPSR;将CPSR传送到ro ORRro,ro,#&2o o o o o o o;设置ro的29位 MSRCPSR_f,ro;传送回CPSR 从监控模式切换到IRQ模式(例如,启动时初始化IRQ堆栈指 针):MRSro,CPSR;将CPSR传送到ro BIC ro,ro,#&if;低5位清o ORRro,ro,#&12;设置为IRQ模式 MSRCPSR c,ro;传送回CPSR在ARM中有两种方法可以实现程序的转移:一种是用 前面我们

23、讲过的传送指令直接向PC寄存器行巧)中写 入转移的目标地址值,通过改变PC的值实现程序的跳 转;另一种是下面我们要讲的转移指令。ARM的转移指令可以从当前指令向前或向后的32MB 的地址空间跳转,根据完成的功能它可以分为以下4 种:B转移指令;BL带链接的转移指令;BX带状态切换的转移指令;BLX带链接和状态切换的转移指令。转移指令B在程序中完成简单的跳转指令,可以跳 转到指令中指定的目的地址。在一个程序中通常需要转移到子程序,并且当子 程序执行完毕时能确保恢复到原来的代码位置。这就需要把执行转移前之程序计数器PC的值保存 下来。ARM使用转移链接指令BL来提供这一功 能。BL指令完全象转移指

24、令一样地执行转移,同 时把转移后面紧接的一条指令的地址保存到链接 寄存器LR(门簿。常中断产生指交软件中断指令SWI用于产生SWI异常中断,用来实现 在用户模式下对操作系统中特权模式的程序的调用;断点中断指令BK PT主要用于产生软件断点,供调试程 序用。SWI(Software I nterrupt)代表“软件中断”,用于用 户调用操作系统的系统例程,常称为“监控调用,它 将处理器置于监控(SVC)模式,从地址OXO8开始执 行指令。A二进制编码31 28 27 2423 0cond111124-bit(interpreted)immediate注意事项:当处理器已经处于监控模式,只要原来的

25、返回地址(在 n4_svc)和SPSR_svc已保存,就可以执行SWI;否则当执行SWI 时,这些寄存器将被覆盖。24位立即数代表的服务类型依赖于系统,但大多数系统支持一个标准 的子集,用于字符输入输出及类似的基本功能。立即数可以指定为常 数表达式,但是通常最好是在程序的开始处为所需要的调用进行声明 并设置它们的值,或者导入一个文件,该文件为局部操作系统声明它 们的值,然后在代码中使用它们的名字。在监控模式下执行的第一条指令位于oxo8,一般是一条指向SWI处理 程序的转移指令,而SWI处理程序则位于存储器内附近某处。因为存 储器中位于oxoC的下一个字正是取指中止处理程序的入口,所以不能 在

26、oxo8处开始写SWI处理程序。A ARM开发工具完全支持Thumb指令,应用程序可 以灵活的将ARM和Thumb子程序混合编程以便在 例程的基础上提高性能或代码密度。A在编写Thumb指令时,先要用伪指令CODE16声明(ADS的编译环境下),而且在ARM指令中要使 用BX指令跳转到Thumb指令,以切换处理器状 态。编写ARM指令时,则可使用伪指令CODE32 声明(ADS的编译环境下)。ARM汇编语言的伪操作、宏指令与伪指令ARM汇编语言程序设计ARM汇编语言编程的重点ARM汇编程序实例RARM汇编语言的伪操仲 宏指令与伪殖bA ARM汇编语言源程序中语句一般由指令、伪操作、宏指令和伪指

27、令组成 伪操作是ARM汇编语言程序里的一些特殊指令助记符,它的作用主要是为 完成汇编程序做各种准备工作,在源程序进行汇编时由汇编程序处理,而 不是在计算机运行期间由机器执行。宏指令是一段独立的程序代码,可以插在源程序中,它通过伪操作来定 义。宏在被使用之前必须提前定义好,宏之间可以互相调用,也可以自己 递归调用。通过直接书写宏名来使用宏,并根据宏指令的格式设置相应的 输入参数。宏定义本身不会产生代码,只是在调用它时把宏体插入到源程 序中。伪指令也是ARM汇编语言程序里的特殊指令助记符,也不在处理器运行期 间由机器执行,它们在汇编时将被合适的机器指令代替成ARM或Thumb 指令,从而实现真正指

28、令操作。两种编译模式的集成开发环境IDE介绍A ADS/SDT I DE开发环境它由ARM公司开发,使用了Co deWarrio r公司的编译 器;A集成了 GNU开发工具的I DE开发环境它由GNU的汇编器as、交叉编译器gcc、和链接器Id等 组成。ADS编译环境下的ARM伪操作和宏指令 ADS编译环境下的伪操作有如下几种:符号定义(Symbo l Definitio n)伪操作 数据定义(Data Definitio n)伪操作 汇编控制(Assembly Co ntro l)伪操作 框架描述(Frame Descriptio n)伪操作 信息报告(Repo rting)伪操作 其他(M

29、iscellaneo us)伪操作符号定义伪操作符号定义伪操作用于定义ARM汇编程序中的变量,对 变量进行赋值以及定义寄存器名称。GBLA,GBLL及GBLS伪操作用于声明一个ARM程序中的全局变量并在 默认情况下将其初始化。GBLA伪操作声明一个全局的算术变量,并将其初始化成。GBLL伪操作声明一个全局的逻辑变量,并将其初始化成FALSE GBLS伪操作声明一个全局的字符串变量,并将其初始化成空串“”A语法格式 Variable其中:vGBLX是GBLA,GBLL或GBLS 3种伪操作之一;Variable是全局变量 的名称。在其作用范围内必须惟一,即同一个变量名只能在作用范围 内出现一次。

30、示例变量定义举例 GBLA arithmetic;声明一个全局的算术变量 Arithmatic SETA o x ef;向该变量赋值 SPACE arithmetic;使用该变量 GBLL lo gical;声明一个全局的逻辑变量lo gical Lo gical SETL(TRUE);向该变量赋值LCLA,LCLL及LCLS伪操作用于声明一个ARM程序中的局部变量,并 在默认情况下将其初始化。LCLA伪操作声明一个局部的算术变量,并将其初始化成。LCLL伪操作声明一个局部的逻辑变量,并将其初始化成FALSE LCLS伪操作声明一个局部的串变量,并将其初始化成空串“”语法格式 Variable

31、其中:vLCLX是LCLA,LCLL或LCLS 3种伪操作之一;Variable是局部变量 的名称。在其作用范围内必须唯一,即同一个变量名只能在作用范围 内出现一次。SETA,SETL及SETS伪操作用于给一个ARM程序中的全局或局部变量赋值。SETA伪操作给一个全局或局部算术变量赋值 SETL伪操作给一个全局或局部逻辑变量赋值 SETS伪操作给一个全局或局部字符串变量赋值A语法格式 Variable expr其中:vSETX是SETA,SETL或SETS 3种伪操作之一;Variable是使用GBLA,GBLL,GBLS,LCLA,LCLL或LCLS定义的变量的名称,在其作用范围内必须 唯一

32、;expr为表达式,即赋予变量的值。变量赋值举例 GBLA arithmetic;声明一个全局的算术变量 arithmetic SETA o x ef;向该算术变量赋值 SPACE arithmetic;引用该算术变量 GBLL lo gical;声明一个全局的逻辑变量lo gical lo gical SETL(TRUE);向该变逻辑量赋值;保存寄存器列表List数据定义伪操作数据定义(Data Definition)伪操作用于数据缓冲池 定义、数据表定义、数据空间分配等,包括以下的伪 操作。LTORG用于声明一个数据缓冲池(也称为文字池)的开始。在使用伪指令LDR时,常常需要在适当的地方加

33、入LTORG声明数据缓冲池,LDR加载的数据暂时放于数据缓冲池。语法格式 LTORG 使用说明 当程序中使用LDR之类的指令时,数据缓冲池的使用可能越界。为防止越 界发生可以使用LTORG伪操作定义数据缓冲池。通常大的代码段可以使 用多个数据缓冲池。ARM汇编编译器一般把数据缓冲池放在代码段的最后 面,即下一个代码段开始之前,或者END伪操作之前。LTORG伪操作通 常放在无条件跳转指令之后,或者子程序返回指令之后,这样处理器就不 会错误地将数据缓冲池中的数据当作指令来执行。5.SPACE SPAC E用于分配一块连续内存单元,并用o初始化。SPAC E可以用“”代替。语法格式 label S

34、PAC E expr 其中:label是一个标号,是可选的,expr表示本伪操作分 配的内存字节数。及 DCDU 1 DCD用于分配一段字内存单元(分配的内存都是字对齐的),并用伪 操作中的expr初始化。DCDU与DCD的不同之处在于DCDU分配的内 存单元并不严格字对齐。DCD和DCDU一般用来定义数据表格或其它 常数。DCD可以用代替。语法格式 label DCD expr,expr.label DCDU expr,expr.其中:lab叫为可选的标号。expr可以为数字表达式或程序中的标号。内存 分配质字节数由expr的个数决定。使用说明 DCD伪操作分配的内存都是字对齐的,为了保证分

35、配的内存是字对齐 的,可能在分配的第一个内存单元前插入填补字节(padding)。DCDU分配的内存单元则不需要字对齐。汇编控制伪操作用于条件汇编、宏定义、重复汇编控制等 IF,ELSE及ENDIF 语法格式IF logical expression.;指令或伪指令代码段iELSE.;指令或伪指令代码段2)END IF其中,logical expression是用于控制选择的逻辑表达式。ELSE伪操作为可选的。MWCRO、MEND-MACRO伪操作标识宏定义的开始,MEND标识宏定义的结束。用 MACRO和MEND定义的一段代码,称为宏定义体,这样在程序中就可以 通过宏名多次调用该代码段来完成

36、相应的功能。语法格式MACRO$label macro name$parameter,$parameter).).;宏代码MENDmacroname为所定义的宏的名称;$label在宏指令被展开时,label可被替 换成相应的符号,通常是一个标号。(在一个符号前使用$表示程序被汇 编时将使用相应的值来替代$后的符号);$parameter为宏指令的参数,当宏指令被展开时将被替换成相应的值,类似于函数中的形式参数。可以 在宏定义时为参数指定相应的默认值。ASSERT 断言错误伪操作。在汇编编译器对汇编程序的第二遍扫描 中,如果其中ASSERT中条件不成立,ASSERT伪操作将报 告该错误信息。语

37、法格式ASSERT lo gical ex pressio n 其中,lo gical ex pressio n为一个逻辑表达式。CODE16 及 CODE32CODE16伪操作告诉汇编编译器后面的指令序列为16位的Thumb指 令;CODE32伪操作告诉汇编编译器后面的指令序列为32位的ARM 指令。语法格式CODE16CODE32 EQU伪操作为数字常量、基于寄存器的值和程序中的标号(基于PC的 值)定义一个字符名称。语法格式name EQU ex pr,type其中:expr为基于寄存器的地址值、程序中的标号、32位的地址常量或者32 位的常量;name为EQU伪操作为expi定义的字符

38、名称;type当expr 为32位常量时,可以使用type指示expr表示的数据的类型。type有下面 3种取值。CODE16表明该地址处为Thumb指令 CODE32表明该地址处为ARM指令 DATA 表明该地址处为数据区 AREA伪操作用于定义一个代码段或者数据段。ARM汇编程序中一般采用分段 式设计,一个ARM源程序至少有一个代码段。语法格式AREA sectionname,attr,attr).使用说明通常可以用AREA伪操作将程序分为多个ELF格式的段。一个大的程序可以包 括多个代码段和数据段。一个汇编程序至少包含一个代码段。ENTRY ENTRY伪操作指定程序的入口点。语法格式EN

39、TRY使用说明一个程序可以包含多个源文件,而一个源文件中最多只能有一个ENTRY(也可以没有ENTRY),所以一个 程序可以有多个ENTRY,但至少要有一个ENTRY END伪操作告诉编译器已经到了源程序结尾。语法格式END使用说明每一个汇编源程序都包含END伪操作,来表示本源程 序的结束。EXPO RT 及 G LO BAL-EXPRORT声明一个符号可以被其他文件引用,相当于声明了一 个全局变量。GLOBAL是EXPORT的同义词。语法格式EXPORT symbo l WEAK GLOBAL symbo l WEAK 其中,symbo l为声明的符号的名称。它是区分大小写的。WEAK选项声

40、明其他的同名符号优先于本符号被引用。使用说明使用EXPORT伪操作声明一个源文件中的符号,使得该符号可 以被其他源文件引用。IMPORT伪操作告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中 定义的,在本源文件中可能引用该符号,而且不论本源文件是否实际引用该符号,该符 号都将被加入到本源文件的符号表中。语法格式IMPORT symbo l WEAK其中:,symbo l为声明的符号的名称。它是区分大小写的。WEAK指定这个选项后,如果 symbo l在所有的源文件中都没有被定义,编译器也不会产生任何错误信息,同时编译器 也不会到当前没有被INCLUDE进来的库中去查找该符号。EX

41、TERN伪操作告诉编译器当前的符号不是在本源文件中定义的,而 是在其他源文件中定义的,在本源文件中可能引用该符号。这与 IMPORT伪操作的作用相同,不同之处在于,如果本源文件没有实际 引用该符号,该符号都将不会被加入到本源文件的符号表中。语法格式 EXTERN symbol WEAK)其中,symbol为声明的符号的名称,它是区分大小写的。WEAK 指定该选项后,如果symbol在所有的源文件中都没有被定义,编译 器也不会产生任何错误信息,同时编译器也不会到当前没有被 INCLUDE进来的库中去查找该符号。GET伪操作将一个源文件包含到当前源文件中,并将被包含的文件在 其当前位置进行汇编处理

42、。INCLUDE是GET的同义词。语法格式 GET filename INCLUDE filename其中:filename为被包含的源文件的名称。这里可以使用路径信息。注意路径信息中可以包含空格。ARM汇编中的文件格式表3.10-ARM源程序的文件后级也源程序文供文件名。说明汇编程序文件,用ARM汇编语言编写的ARM程序或Thumb 程尻pC程序文件.1(?用(,语言编写的程序代码。头文件。为了简化源程序,把程序中常用到的常量命 名、宏定义、教懒构定义等等单独放在一个 文件中,一般称为头文件。ARM汇编语言语句格式如下所示:symbol)instruction|directive|pseud

43、o-instruction ;comment其中:instruction为指令。在ARM汇编语言中,指令不能从一行的行头开 始。在一行语句中,指令的前面必须有空格或者符号。directive为伪操作。pseudo-instruction 为伪 指令。symbol为符号。在ARM汇编语言中,符号必须从一行的行头开始,并 且符号中不能包含空格。在指令和伪指令中符号用作地址标号(label);在有些伪操作中,符号用作变量或者常量。comment为语句的注释。在ARM汇编语言中注释以分号(;)开头。注释的结尾即为一行的结尾。注释也可以单独占用一行。符号的命名规则如下:符号由大小写字母、数字以及下划线组

44、成。局部标号(例如在ADS编译环境下,ROUT之间的标号为局部标 号)以数字开头,其他的符号都不能以数字开头。符号是区分大小写的。符号在其作用范围内必须惟一,即在其作用范围内不可有同名 的符号。程序中的符号不能与系统内部变量或者系统预定义的符号同 名。程序中的符号通常不要与指令助记符或者伪操作同名。变量有数字变量、逻辑变量和串变量变量的类型在程序中是不能改变的。数字变量的取值 范围为数字常量和数字表达式所能表示的数值的范 围。关于数字常量和数字表达式在后面有介绍。逻辑 变量的取值范围为true)和false。串变量的取 值范围为串表达式可以表示的范围。使用GBLA,GBLL及GBLS伪操作声明

45、全局变量;使用LCLA,LCLL及LCLS伪操作声明局部变量;使用SETA,SETL及SETS伪操作为这些变量赋值 数字常量一般有3种表示方式:十进制数,如:43,6,112;十六进制数,如:0 x3425,oxFE,0 x1;n进制数,用n_XXX表示,其中n为29,XXX为具体 数,如:2_O1OO11O1,8_4326 在ARM汇编语言中,标号是表示程序中的指令或者数据地 址的符号,一般它代表一个地址。标号的生成方式有以下3 种:基于PC的标号:是位于(将要跳转到的)目标指令前或者 程序中数据定义伪操作前的标号,在汇编时将被处理成PC 值加上(或减去)一个数字常量。它常用于表示跳转指令

46、的目标地址,或者代码段中所嵌入的少量数据。基于寄存器的标号:通常用MAP和FILED伪操作定义该标 号,也可以用EQU伪操作定义(参见伪操作一节)。这种 标号在汇编时将被处理成寄存器的值加上(或减去)一个 数字常量。它常用于访问位于数据段中的数据。绝对地址:是一个32位的数字量,寻址的范围为。232-1,即直接可以寻址整个内存空间。I oB标号c局部标号主要用于局部范围代码。它由一个。99之间的数字和一个通常表示 该局部标号作用范围的符号组成,可以重复定义。局部标号的作用范围通常为 当前段,也可用伪操作ROUT来定义局部标号的作用范围。局部标号定义的语法格式如下:N(routname。其中:N

47、为。99之间的数字。routname为符号,通常为该标号作用范围的名 称(用ROUT伪操作定义的)。局部标号引用的语法格式如下:%F|B A|T N routname)。其中:%表示引用操作;F指示编译器只向前搜索;B指示编译器只向后搜索;A指示 编译器搜索宏的所有嵌套层次;T指示编译器搜索宏的当前层次。如果F和B都没有指定,编译器先向前搜索,再向后搜索;如果A和T都没有指 定,编译器搜索所有从当前层次到宏的最高层次,比当前层次低的层次不再搜 索;如果指定亍routname,编译器向前我豪最近的ROUT伪操作,若 routname与该ROUT伪操作定义的名称不匹配,编译器报告错误,汇编失 败。

48、ARM汇编语言中的表达式表达式是由符号、数值、单目或多目操作符以及括号 组成的。在一个表达式各种元素的优先级如下所示:括号内的表达式优先级最高。各种操作符有一定的优先级。相邻的单目操作符的执行顺序为由右到左,单目操作符 优先级高于其他操作符。优先级相同的双目操作符执行顺序为由左到右。ARM汇编语言是以段(section)为单位来组织源文件 的。段是相对独立的、具有特定名称的、不可分割的 指令或者数据序列。段又可以分为代码段和数据段,代码段存放执行代码,数据段存放代码运行时需要用 到的数据。一个ARM源程序至少需要一个代码段,大的程序可以包含多个代码段和数据段 ARM汇编语言源程序经过汇编处理后

49、生成一个可执行 的映像文件,它通常包括下面3部分:一个或多个代码段。代码段通常是只读的。零个或多个包含初始值的数据段。这些数据段通常是可 读写的。零个或多个不包含初始值的数据段。这些数据段被初始 化为。,通常是可读写的。连接器根据一定的规则将各个段安排到内存中的相应位 置。源程序中段之间的相邻关系与执行的映像文件中段 之间的相邻关系并不一定相同。下面通过一个简单的例子,说明ARM汇编语言源程序的基 本结构。AREA EXAMPLE,CODE,READONLYENTRYstartMOV ro,#10MOV n,#3ADD ro,ro,nENDARM汇编语言编程的重点简单的寄存器操作ADD to,

50、ri,r2;roro第一个是结果寄存器门第一操作数 12第二操作数n+r2立即数操作在数据处理指令中,第二操作数除了可以是寄存器,还可以是一个立 即数。如果我们只是希望把一个常数加到寄存器,而不是两个寄存器 相加,我们可以用立即数值取代第二操作数,如下面例子。立即数用 前面加一个“甲的数值常量来表示。ADD R3,13,#1;13:=弓+1AND R8,17,#&ff;r8:=17I7:o寄存器移位操作在ARM数据处理指令中,第二操作数还有一种特有的 形式一寄存器移位操作,即允许第二个寄存器操作数 在同第一操作数运算之前完成移位操作,例如:ADD 巧,r2,n,LSL#3;13:=2+8 Xn

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      联系我们       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号  |  icp.png浙ICP备2021020529号-1 浙B2-2024(办理中)  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服