【vfp精品源码栏目提醒】:以下是网学会员为您推荐的vfp精品源码-C语言程序实验一 - 技术总结,希望本篇文章对您学习有所帮助。
第五章基于ARM的嵌入式程序设计5.1 ARM汇编语言的伪操作、宏指令与伪指令5.2 ARM汇编语言程序设计5.3 嵌入式C语言程序设计基础5.4 嵌入式C语言程序设计实例5.5 嵌入式C语言程序设计技巧5.6 C与汇编语言混合编程5.7 基于Embest IDE for ARM 环境的软件开发 实例5.1 ARM汇编语言的伪操作、宏指令与伪指令5.1.1 两种常见的ARM编译开发环境5.1.2 ADS编译环境下的伪操作和宏指令5.1.3 GNU编译环境下的伪操作和宏指令5.1.4 ARM汇编语言的伪指令5.1.1两种常见的ARM编译开发环境 ADS/SDT IDE开发环境:它由ARM公司 开发,使用了CodeWarrior公司的编译 器; 集成了GNU开发工具的IDE开发环境:: 它由GNU的汇编器as、交叉编译器gcc、 和链接器ld等组成。
5.1.2ADS编译环境下的伪操作和宏指令 ADS编译环境下的伪操作可分为以下 几类: 符号定义(Symbol Definition)伪操作 数据定义(Data Definition)伪操作 汇编控制(Assembly Control)伪操作 信息报告(Reporting)伪操作 其他(Miscellaneous)伪操作 符号定义伪操作伪操作 语法格式 作用GBLA GBLA Variable 声明一个全局的算术变量,并将其初始化成0。
GBLL GBLL Variable 声明一个全局的逻辑变量,并将其初始化成FALSE。
GBLS GBLS Variable 声明一个全局的字符串变量,并将其初始化成空串“”。
LCLA LCLA Variable 声明一个局部的算术变量,并将其初始化成0。
LCLL LCLL Variable 声明一个局部的逻辑变量,并将其初始化成FALSE。
LCLS LCLS Variable 声明一个局部的串变量,并将其初始化成空串“”。
SETA SETA Variable expr 给一个全局或局部算术变量赋值。
SETL SETL Variable expr 给一个全局或局部逻辑变量赋值。
SETS SETS Variable expr 给一个全局或局部字符串变量赋值。
RLIST name LIST{list of registers} 为一个通用寄存器列表定义名称。
CN name CN expr 为一个协处理器的寄存器定义名称。
CP name CP expr 为一个协处理器定义名称。
DN/SN name DN/SN expr DN/SN为一个双精度/单精度的
VFP寄存器定义名称。
FN name FN expr 为一个FPA浮点寄存器定义名称。
数据定义伪操作 伪操作 语法格式 作用LTORG LTORG 声明一个数据缓冲池(也称为文字池)的开始。
MAP MAP expr { , base-register } 定义一个结构化的内存表(Storage Map)的首地址。
FIELD {label} FIELD expr 定义一个结构化内存表中的数据域。
SPACE {label} SPACE expr 分配一块连续内存单元,并用0初始化。
DCB label DCB expr{,expr} 分配一段字节内存单元,并用expr初始化。
DCD/ label DCD expr , 分配一段字内存单元。
DCDU expr…DCDO {label} DCDO expr{, 分配一段字对齐的字内存单元。
expr}…DCFD/ label DCFD { U } 为双精度的浮点数分配字对齐的内存单元。
DCFDU fpliteral{,fpliteral}…DCFS/ label DCFS { U } 为单精度的浮点数分配字对齐的内存单元。
DCFSU fpliteral {,fpliteral}…DCI label DCI expr { , 在ARM代码中分配一段字对齐的内存单元 在Thumb代 expr}… 码中,分配一段半字对齐的半字内存单元。
DCQ/ label DCQ{U}{-} 分配一段以双字(8个字节)为单位的内存DCQU literal{,{-}literal}…DCW/ label DCW{U}expr{, DCW用于分配一段半字对齐的半字内存单元。
DCWU expr}… 汇编控制伪操作 伪操作 语法格式 作用IF , ELSE 及 IF logical expression 能够根据条件把一段源代码包括在汇编ENDIF … 语言程序内或者将其排除在程序之外。
ELSE … ENDIFWHILE 及 WHILE logical expression 能够根据条件重复汇编相同的一段源代WEND … 码。
WENDMACRO 、 MACRO MACRO标识宏定义的开始,MEND标MEND 及 label macroname {parameter{, 识宏定义的结束。
MERIT用于从宏中跳MEXIT parameter}…} 转出去。
用MACRO和MEND定义的一 … ;宏代码 段代码,称为宏定义体。
通过宏名称来 MEND 调用宏。
信息报告伪操作 伪操作 语法格式 作用ASSERT ASSERT logical expression 对汇编程序的第二遍扫描中,如果其中ASSERT中条件 不成立,ASSERT伪操作将报告该错误信息。
INFO INFO numeric-expression, 在汇编处理过程的第一遍扫描或者第二遍扫描时INFO伪 string-expression 操作报告诊断信息。
OPT OPT n 通过OPT伪操作可以在源程序中设置列表选项。
TTL TTL title 在列表文件的每一页的开头插入一个标题。
SUBT SUBT subtitle 在列表文件的每一页的开头插入一个子标题。
其他伪操作 伪操作 语法格式 作用CODE16 CODE16 告诉汇编编译器后面的指令序列为16位的Thumb指令CODE32 CODE32 告诉汇编编译器后面的指令序列为32位的ARM指令。
EQU name EQU expr{,type} 为数字常量、基于寄存器的值和程序中的标号(基于PC的值)定义一个字符名 称。
AREA AREA sectionname { , attr } { , 定义一个代码段或者数据段。
attr}…ENTRY ENTRY 指定程序的入口点。
END END 告诉编译器已经到了源程序结尾。
ALIGN ALIGN {expr{,offset}} 通过添加补丁字节使当前位置满足一定的对齐方式。
EXPORT/ EXPORT symbol {〔WEAK〕} 声明一个符号可以被其他文件引用,相当于声明了一个全局变量。
GLOBALIMPORT IMPORT symbol {WEAK} 告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的, 在本源文件中可能引用该符号。
EXTERN EXTERN symbol {〔WEAK〕} 告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的, 在本源文件中可能引用该符号。
GET/ GET filename 将一个源文件包含到当前源文件中,并将被包含的文件在其当前位置进行汇编INCLUDE 处理。
INCBIN INCBIN filename 将一个文件包含到当前源文件中,被包含的文件不进行汇编处理。
KEEP KEEP{symbol} 告诉编译器将局部符号包含在目标文件的符号表中。
NOFP NOFP 禁止源程序中包含浮点运算指令。
REQUIRE REQUIRE lable 指定段之间的相互依赖关系。
RN name RN expr 为一个特定的寄存器定义名称。
ROUT name ROUT 定义局部变量的有效范围。
5.1.3 GNU编译环境下的伪操作和宏指令GNU编译环境下的伪操作可分为以下几类: 常量编译控制伪操作 汇编程序代码控制伪操作 宏及条件编译控制伪操作 其他伪操作 常量编译控制伪操作 伪操作 语法格式 作用.byte .byte expr ,expr … 分配一段字节内存单元,并用expr初始化。
.hword/.short .hword expr ,expr … 分配一段半字内存单元,并用expr初始化。
.ascii .ascii expr ,expr … 定义字符串expr(非零结束符)。
.asciz /.string .asciz expr ,expr … 定义字符串expr(以/0为结束符)。
.float/.single .float expr ,expr … 定义一个32bit IEEE 浮点数expr。
.double .double expr ,expr … 定义64bit IEEE浮点数expr。
word/.long .word expr ,expr … 分配一段字内存单元,并用expr初始化。
/.int.fill .fill repeat ,size, 分配一段字节内存单元,用size长度value填充repeat value 次。
.zero .zero size 分配一段字节内存单元,并用0填充内存。
.space/.skip .space size value 分配一段内存单元,用value将内存单元初始化。
汇编程序代码控制伪操作 伪操作 语法格式 作用.section .section expr 定义域中包含的段。
.text .text subsection 将操作符开始的代码编译到代码段或代码段子段。
.data .data subsection 将操作符开始的数据编译到数据段或数据段子段。
.bss .bss subsection 将变量存放到.bss段或.bss段的子段。
.code 16/.thumb .code 16 表明当前汇编指令的指令集选择Thumb指令集。
.thumb.code 32/.arm .code 32 表明当前汇编指令的指令集选择ARM指令集。
.arm.end .end 标记汇编文件的结束行,即标号后的代码不作处理。
.include .include “filename” 将一个源文件包含到当前源文件中。
.align/.balign .align alignment , 通过添加填充字节使当前位置满足一定的对齐方式。
fill ,max 宏及条件编译控制伪操作 伪操作 语法格式 作用.macro 、 .exit .macro acroname .macro伪操作标识宏定义的开始,.endm标识宏m及.endm {parameter{, 定义的结束。
用.macro及.endm定义一段代码, parameter}…} 称为宏定义体。
.exitm伪操作用于提前退出宏。
… .endm. ifdef,.else .ifdef condition 当满足某条件时对一组语句进行编译,而当条及.endif … 件不满足时则编译另一组语句。
其中else可以缺 .else 省。
… .endif 其他伪操作 伪操作 语法格式 作用.eject .eject 在汇编符号列表文件中插入一分页符。
.list .list 产生汇编列表(从 .list 到 .nolist)。
.nolist .nolist 表示汇编列表结束处。
.title .title “heading” 使用“heading ”作为标题。
.sbttl .sbttl “heading” 使用“heading”作为子标题。
.ltorg .ltorg 在当前段的当前地址(字对齐)产生一个文字池。
.req .req name,expr 为一个特定的寄存器定义名称。
.err .err 使编译时产生错误报告。
.print .print string 打印信息到标准输出。
.fail .fail expr 编译汇编文件时产生警告。
5.1.4ARM汇编语言的伪指令伪指令 语法格式 作用ADR ADR {cond} register, 将基于PC或基于寄存器的地址值读取到寄存器中。
expr 小范围的地址读取。
ADRL ADRL {cond} register, 将基于PC或基于寄存器的地址值读取到寄存器中。
expr 中等范围的地址读取。
LDR LDR {cond} register, 将一个32位的立即数或者一个地址值读取到寄存 〔expr label-expr〕 器中。
大范围的地址读取。
NOP NOP 在汇编时将被替换成ARM中的空操作。
5.2 ARM汇编语言程序设计5.2.1 ARM汇编中的文件格式5.2.2 ARM汇编语言语句格式5.2.3 ARM汇编语言编程的重点5.2.4 ARM汇编程序实例5.2.1ARM汇编中的文件格式 ARM源程序文件(可简称为源文件)可以由任意一种文本编辑器来编写程序代码,它一般为文本格式。
在ARM程序设计中,常用的源文件可简单分为以下几种: 源程序文件 文件名 说明 汇编程序文件 .S 用 ARM 汇 编 语 言 编 写 的 ARM 程 序 或 Thumb程序。
C程序文件 .C 用C语言编写的程序代码。
头文件 .H 为了简化源程序,把程序中常用到的常 量命名、宏定义、数据结构定义等等单 独放在一个文件中,一般称为头文件。
5.2.2ARM汇编语言语句格式 ARM汇编语言语句格式如下所示: {symbol} {instruction directive pseudo- instruction} {;comment} 其中: instruction为指令。
directive为伪操作。
pseudo-instruction为伪指令。
symbol为符号。
comment为语句的注释。
ARM汇编语言程序格式 ARM汇编语言是以段(section)为单位来组织源文件的。
段是相对独立的、具有特定名称的、不可分割的指令或者数据序列。
段又可以分为代码段和数据段,代码段存放执行代码,数据段存放代码运行时需要用到的数据。
一个ARM源程序至少需要一个代码段,大的程序可以包含多个代码段和数据段。
举例说明ARM汇编语言源程序的基本结构AREA EXAMPLE,CODE,READONLYENTRYstartMOV r0,10MOV r1,3ADD r0,r0,r1END本程序的程序体部分实现了一个简单的加法运算。