【vfp精品源码栏目提醒】:网学会员为需要vfp精品源码的朋友们搜集整理了第五章 基于ARM的嵌入式程序设计 - 毕业设计相关资料,希望对各位网友有所帮助!
第5章基于 ARM 的嵌入式程序设计主要内容: ARM 汇编语言程序设计 C 与汇编语言混合编程 ARM 汇编语言编程示例一、ARM 汇编语言程序设计 1、两种常用IDE简介 2、ADS/SDT下的伪操作 3、ARM汇编语言伪指令 4、ARM汇编语言的文件和语句 5、ARM汇编语言编程的几个问题 6、ARM汇编语言编程示例1、两种常用 IDE 简介 ADS/SDT IDE开发环境:它由ARM公司开发, 使用了CodeWarrior公司的编译器; 集成了GNU开发工具的IDE开发环境:它由 GNU的汇编器as、交叉编译器gcc、和链接器ld 等组成。
2、ADS/SDT 下的伪操作 ADS编译环境下的伪操作可分为以下几类: 符号定义(Symbol Definition)伪操作 数据定义(Data Definition)伪操作 汇编控制(Assembly Control)伪操作 信息报告(Reporting)伪操作 其他(Miscellaneous)伪操作 符号定义(Symbol Definition)伪操作伪操作 语法格式 作用GBLA GBLA Variable 声明一个全局的算术变量,并将其初始化成0GBLL GBLL Variable 声明一个全局的逻辑变量,初始化成FALSEGBLS GBLS Variable 声明一个全局的字符串变量,初始化成空串“”LCLA LCLA Variable 声明一个局部的算术变量,并将其初始化成0LCLL LCLL Variable 声明一个局部的逻辑变量,初始化成FALSELCLS LCLS Variable 声明一个局部的串变量,并将其初始化成空串“”SETA SETA Variable expr 给一个全局或局部算术变量赋值SETL SETL Variable expr 给一个全局或局部逻辑变量赋值SETS SETS Variable expr 给一个全局或局部字符串变量赋值RLIST name LISTlistof registers 为一个通用寄存器列表定义名称CN name CN expr 为一个协处理器的寄存器定义名称CP name CP expr 为一个协处理器定义名称DN/SN name DN/SN expr DN/SN为一个双精度/单精度的
VFP寄存器定义名称FN name FN expr 为一个FPA浮点寄存器定义名称 数据定义(Data Definition)伪操作伪操作 语法格式 作用LTORG LTORG 声明一个数据缓冲池(也称为文字池)的开始MAP MAP expr base-register 定义一个结构化的内存表(Storage Map)的首地址FIELD label FIELD expr 定义一个结构化内存表中的数据域SPACE label SPACE expr 分配一块连续内存单元,并用0初始化DCB label DCB expr 分配一段字节内存单元,并用expr初始化DCD/ label DCD expr 分配一段字内存单元DCDUDCDO label DCDO expr 分配一段字对齐的字内存单元DCFD/ label DCFDU fpliteral 为双精度的浮点数分配字对齐的内存单元DCFDUDCFS/ label DCFSU fpliteral 为单精度的浮点数分配字对齐的内存单元DCFSUDCI label DCI expr 在 ARM 代 码 中 分 配 一 段 字 对 齐 的 内 存 单 元 在 Thumb代码中,分配一段半字对齐的半字内存单元DCQ/ label DCQU literal 分配一段以双字(8个字节)为单位的内存DCQUDCW/ label DCWU expr DCW用于分配一段半字对齐的半字内存单元DCWU 汇编控制(Assembly Control)伪操作 伪操作 语法格式 作用IF , ELSE IF logical expression 能够根据条件把一段源代码包括及ENDIF … 在汇编语言程序内或者将其排除 ELSE 在程序之外。
… ENDIFWHILE 及 WHILE logical expression 能够根据条件重复汇编相同的一WEND … 段源代码。
WENDMACRO 、 MACRO MACRO 标 识 宏 定 义 的 开 始 ,MEND 及 label macroname {parameter{ MEND 标 识 宏 定 义 的 结 束 。
MEXIT ,parameter}…} MERIT用 于从宏 中跳转 出去。
… ;宏代码 用MACRO和MEND定义的一段 MEND 代码,称为宏。
通过宏名来调用 信息报告(Reporting)伪操作伪操作 语法格式 作用ASSERT ASSERT logical expr 对汇编程序的第二遍扫描中,如果其中 ASSERT中条件不成立,ASSERT伪操作将报 告该错误信息INFO INFO num-exprstr-expr 在汇编处理过程的第一遍扫描或者第二遍扫描 时INFO伪操作报告诊断信息OPT OPT n 通过OPT伪操作可以在源程序中设置列表选 项TTL TTL title 在列表文件的每一页的开头插入一个标题SUBT SUBT subtitle 在列表文件的每一页的开头插入一个子标题 其他(Miscellaneous)伪操作伪操作 语法格式 作用CODE16 CODE16 告诉汇编编译器后面的指令序列为16位的Thumb指令CODE32 CODE32 告诉汇编编译器后面的指令序列为32位的ARM指令EQU name EQU exprtype 为数字常量和程序中的标号(基于PC的值)定义一个字符名称AREA AREA nameattrattr… 定义一个代码段或者数据段ENTRY ENTRY 指定程序的入口点END END 告诉编译器已经到了源程序结尾ALIGN ALIGN exproffset 通过添加补丁字节使当前位置满足一定的对齐方式EXPORT/ EXPORT symbol WEAK 声明一个符号可被其他文件引用,相当于声明了一个全局变量GLOBALIMPORT IMPORT symbol WEAK 告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中 定义的,在本源文件中可能引用该符号EXTERN EXTERN symbol WEAK 告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中 定义的,在本源文件中可能引用该符号GET/ GET filename 将一个源文件包含到当前源文件中,并将被包含的文件在其当前位置进INCLUDE 行汇编处理INCBIN INCBIN filename 将一文件包含到当前源文件中,被包含文件不进行汇编处理KEEP KEEPsymbol 告诉编译器将局部符号包含在目标文件的符号表中NOFP NOFP 禁止源程序中包含浮点运算指令REQUIRE REQUIRE lable 指定段之间的相互依赖关系RN name RN expr 为一个特定的寄存器定义名称ROUT name ROUT 定义局部变量的有效范围3、ARM 汇编语言伪指令 伪指令 语法格式 作用 ADR ADRcond register, 将基于PC或基于寄存器的地址值读取到寄 expr 存器中。
小范围的地址读取。
ADRL ADRLcond register, 将基于PC或基于寄存器的地址值读取到寄 expr 存器中。
中等范围的地址读取。
LDR LDRcond register , 将一个32位的立即数或者一个地址值读取到 exprlabel-expr 寄存器中。
大范围的地址读取。
NOP NOP 在汇编时将被替换成ARM中的空操作。
4、ARM 汇编语言的文件和语句 源程序文件 文件名 说明汇编程序文件 .S 用ARM汇编语言编写的ARM程序或 Thumb程序C程序文件 .C 用C语言编写的程序代码 为了简化源程序,把程序中常用到的 头文件 .H 常量命名、宏定义、数据结构定义等 等单独放在一个文件中,一般称为头 文件 ARM汇编语言是以段(section)为单位来组织源文件的。
段是相对独立的、具有特定名称的、不可分割的指令或者数据序列。
一个ARM源程序至少需要一个代码段,大的程序可以包含多个代码段和数据段。
ARM汇编语言语句格式如下所示:{symbol} {instructiondirectivepseudo-instruction} {comment}其中: instruction为指令 directive为伪操作 pseudo-instruction为伪指令 symbol为符号 comment为语句的注释ARM汇编语言源程序的基本结构举例: AREA Example,CODE,READONLY ENTRY start MOV R0,40 MOV R1,23 ADD R0,R0,R1 END 程序体部分实现了一个简单的加法运算。
5、ARM 汇编语言编程的几个问题 ARM数据处理操作 设置条件码 汇编语言子程序调用及返回 跳转表思想 ARM与Thumb之间的状态转换及函数的互相调用ARM数据处理操作 32位立即数在32位指令中的编码以及ARM特有的寄存器移位操作是数据处理方面的难点设置条件码 ARM的任何数据处理指令都能通过增加“S”操作码来设置条件码N、Z、C、V。
每条指令都可以条件执行。
在程序中可以通过条件码的使用让微处理器决定是否进行转移,还可用来控制循环的退出。
汇编语言子程序调用及返回 在ARM汇编语言中,子程序调用是通过BL指令来完成的。
BL subname 其中,subname是被调用的子程序的名称。
在返回调用子程序时,转移链接指令保存到LR寄存器(R14)中的值需要拷贝回程序寄存器PC(R15)。
子程序返回的方法: 对于最简单的子程序,一条MOV指令就可以完成子程序 的返回 ,如下所示: SUB2 … MOV PC,R14 对于在子程序中出现嵌套调用时,链接寄存器LR中的返 回地址可能会在第二次调用时被覆盖,所以需要将返回地 址压入堆栈来进行保存 SUB1 STMFD R13,R0 – R2, R14 BL SUB2 … LDMFD R13,R0 – R2,PC跳转表思想 在程序设计中,有时为使程序完成一定的功能,需要调用一系列子程序中的一个,而决定究竟调用哪一个由程序的计算值确定。
跳转表是解决该问题的有效方案。
跳转表是利用程序计数器PC在通用寄存器文件中的可见性来实现的,如下例所示: BL JUMPTAB … JUMPTAB ADR R1,SUBTAB ;R1 取 SUBTAB CMP R0,SUBMAX ;检查超限 LDRLS PC,R1,R0,LSL 2 ;若OK,跳转到表中 B ERROR ;否则发出错误信息 SUBTAB DCD SUB0 ;子程序表入口 DCD SUB1 DCD SUB2ARM与Thumb之间的状态转换及函数的互相调用ARM/Thumb之间的函数调用时:在同一状态下的子程序调用、返回,通常都只需要一条指令实现:BL function 和 MOV PC,LR在不同状态下的子程序调用中,就需要进行状态之间的切换,需要考虑到以下几点: 需要由BX来切换状态,因为BL不能完成状态切换。
需要在BX之前先保存好LR,BX不能自动保存返回地址到LR。
需要 用“BX LR”来返回,不能使用“MOV PC,LR”,返回时要仔细考虑保存在LR中最低位是否正确。
6、ARM 汇编语言编程示例示例 1:简单的ARM指令程序 AREA ARMex,CODE,READONLY ENTRY start MOV R110 MOV R23 ADD R1R1R1 stop MOV R00x18 LDR R10x20026 SWI 0x123456 ;将CPU控制权交给调试器 END