《嵌入式lpc2103教程-第五章 基于arm的嵌入式程序设计》由会员分享,可在线阅读,更多相关《嵌入式lpc2103教程-第五章 基于arm的嵌入式程序设计(222页珍藏版)》请在金锄头文库上搜索。
1、第五章基于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汇编语言的伪指令,伪操作、宏指令与汇编程序有关,不同编译环境有不同形式和规则。 伪操
2、作:特殊指令助记符,在源程序汇编过程中由汇编程序处理,一旦汇编结束,使命结束。 宏指令:由伪操作定义的一段独立代码,可插在源程序中。 先定义,后使用,可互相调用,可递归调用。 通过宏名调用,可设置输入参数; 简化程序代码,并不会节省程序空间。 伪指令:特殊指令助记符,汇编时被合适机器指令代替成ARM或Thumb指令,实现真正的指令。,5.1.1两种常见的ARM编译开发环境,ADS/SDT IDE开发环境:它由ARM公司开发,使用CodeWarrior公司的编译器; 集成了GNU开发工具的IDE开发环境:它由GNU的汇编器as、交叉编译器gcc、和链接器ld等组成。源代码开放,对Linux支持。
3、 Embest IDE英蓓特公司集成了GNU开发工具,并兼容SDT/ADS.,5.1.2 ADS编译环境下的伪操作和宏指令,ADS编译环境下的伪操作可分为: 符号定义(Symbol Definition)伪操作 数据定义(Data Definition)伪操作 汇编控制(Assembly Control)伪操作 信息报告(Reporting)伪操作 其他(Miscellaneous)伪操作,符号定义伪操作,1) GBLA、GBLL、GBLS,格式:GBLA/GBLL/GBLS 变量名 说明:GBLA、GBLL、GBLS伪操作定义一个汇编程序中的全局变量,并初始化: GBLA定义一个全局数字变量
4、,初始化为0; GBLL定义一个全局逻辑变量,初始化为“F”; GBLS定义一全局字符串变量,初始化为空串; 全局变量,在整个程序范围内变量名必须唯一。,2) LCLA、LCLL、LCLS,格式:LCLA/LCLL/LCLS 局部变量名 说明:LCLA、LCLL、LCLS定义一个汇编程序的局部变量,一般只用于宏代码,并初始化: LCLA定义一个局部的数字变量,初始化为0; LCLL定义一个局部的逻辑变量,初始化为F; LCLS定义一局部字符串变量,初始化为空串; 声明局部变量,在局部作用范围内变量名须唯一。,3) SETA、SETL、SETS,格式:变量名 SETA/SETL/SETS 表达式
5、 说明: SETA:给一个数字变量赋值; SETL:给一个逻辑变量赋值; SETS:给一个字符串变量赋值; 格式中的变量名必须为已经定义过的全局或局部变量,表达式为将要赋给变量的值。,LCLA ARIT;声明一个局部的数字变量,变量名为ARITARIT SETA 0xAA;将该变量赋值为0xAALCLL loc ;声明一个局部的逻辑变量,变量名为loc loc SETL TRUE;将该变量赋值为真GBLS st1;定义一个全局的字符串变量,变量名为st1st1 SETS “Testing” ;将该变量赋值为“Testing”,使用示例,1) GBLA objects;全局变量objects,为
6、0 objects SETA 0xff ;该变量赋值为0xff SPACE objects ;引用该变量 2)MACRO ;声明一个宏 $label message $a ;宏的原型 LCLS err ;声明一个局部变量err,空串 err SETS “error no: ” ;向该变量赋值 $label ;代码 INFO 0,err:CC:STR:$a ;使用该串变量MEND ;宏定义结束,4) RLIST,格式:名称 RLIST 寄存器列表 说明:用于对一个通用寄存器列表定义名称,该名称可在ARM指令LDM/STM中使用。,例: List RLIST R0-R5,R8,R10STMDF S
7、P!, List,符号定义伪操作,CN:为一个协处理器的寄存器定义名称.015 格式: name CN expr 例:Power cn 6 CP:为一个协处理器定义名称。 015 格式: name CN expr 例:DZX cn 6 DN/SN:为一个双/单精度VFP寄存器定义名称。 单精度VFP寄存器030; 双精度VFP寄存器015. name DN/SN expr 例: height DN 6width SN 20,FN:为一个FPA浮点寄存器定义名称。 expr 07 name FN expr Length FN 6,数据定义伪操作,1) LTORG 说明: 声明一个数据缓冲池(文字
8、池)开始。暂放LDR数据 可有多个。 使用伪指令LDR时,在子程序返回或无条件跳转后,加入。AREA Example,CODE,READONLYStart BL func1func1LDR R1,=0X8000MOV PC,LRLTORGData SPACE 40 ENG,2) MAPMAP expr,base-register说明:定义一个结构化的内存表的首地址, “”可以用来代替MAP。 首地址为expr或expr+base-register。 MAP与FIELD配合定义内存表结构。MAP fun ;fun为内存表首地址; MAP 0x100,R9;内存表首地址为R9+0x100,3) F
9、ILEDlabel FIELD expr说明:定义内存表各数据域字节长度(不分配内存单元),用于定义一个结构化内存表中的数据域,可用“#” 代替。 expr表示所占字节数; MAP和FIELD 定义了数据结构,并不分配内存单元; 有三种形式:基于绝对地址的、基于相对地址的和基于PC的内存表。,1.基于绝对地址的内存表 MAP 8192 consta FIELD 4 constb FIELD 4 x FIELD 4 y FIELD 4 string FIELD 16使用:LDR R0, constb;,2.基于相对地址的内存表 MAP 0,R9 consta FIELD 4 constb FIE
10、LD 4 x FIELD 4 y FIELD 4 string FIELD 16使用: ADR R9,Field LDR R5, constb;LDR R5,R9,#4,3.基于PC的内存表 Data SPACE 100 MAP Data consta FIELD 4 constb FIELD 4 x FIELD 4 y FIELD 4 string FIELD 16 使用: LDR R5, constb;LDR R5,PC,offset,特殊内存表: FIELD操作数为0,标号表明当前内存单元地址。 start EQU 0x1000 end EQU 0x2000 MAP start cons
11、ta FIELD 4 constb FIELD 4 x FIELD 4 y FIELD 4 string FIELD 16 endalert FIELD 0 ASSERT endalert=end end;第2遍扫描时,条件不成立,报告错误,4) SPACElabel SPACE expr说明:分配一片连续的存储区域并初始化为0, expr为要分配的字节数,可用“”代替。 Data SPACE 100;分配100个字节单元,初始化为0;,5)DCB label DCB expr,expr 说明:分配一块字节单元并用expr进行初始化。DCB可用“=”代替。 expr为 -128255 stri
12、ng DCB “student”; 73 74 75 64 65 6E 74 6) DCW/DCWU label DCWUexpr,expr 说明:分配一段半字存储单元并用expr初始化,DCW存储空间是半字对齐的。 expr为 -3276865535 ; Data DCW -235,748,2446DCW num+8,7) DCD/DCDUlabel DCD expr ,expr 说明:分配一块字存储单元并用expr初始化,存储空间是字对齐。DCD也可用“&”代替。 Datal DCD 1,5,10 Datal DCD addr+4 8)DCQ/DCQU labelDCQUliteral,l
13、iteral 说明:分配一块以8个字节为单位存储区域用literal初始化,存储空间是字对齐的。DCQU功能跟DCQ类似,分配存储单元不严格字对齐。,AREA MiscData,DATA,READWRITE Data0 DCQ -100,2_101 Data1 DCQU 1000,-100000000DCQU number+4;number为数字表达式,9) DCFD/DCFDUlabelDCFDUfpliteral,fpliteral 说明:为双精度浮点数分配一片连续字存储单元并用fpliteral初始化,它定义的存储空间是字对齐的,每个双精度的浮点数占据两个字单元。 10) DCFS/DC
14、FSU labelDCFSUfpliteral,fpliteral 说明:为单精度浮点数分配一片连续字存储单元并用表达式初始化,它定义的存储空间是字对齐的,每个单精度浮点数使用一个字单元。,DCFD 1E308,-4E-100;每个两个字单元,字对齐 DCFDU 10000,-0.1,3.1E26;字不对齐DCFS 1E3,-4E-9;每个一个字单元,字对齐 DCFSU 1.0,-1,3.1E6;字不对齐,汇编控制伪操作,汇编控制伪指令,IF、ELSE、ENDIF WHILE、WEND MACRO、MEND 、MEXIT,1) IF、ELSE、ENDIF IF logical expression ELSE ;可选 ENDIF 说明:IF、ELSE、ENDIF可以分别用“”、“|”、“”代替。IF、ELSE、ENDIF可以嵌套使用。,IF Variable=16BNE SUB1LDR R0,=SUB0BX R0 ELSEBNE SUB0 ENDIF,2) WHILE、WEND WHILE logical expression WEND说明:根据逻辑表达式的成立与否决定是否循环执行这个代码段。WHILE、WEND伪指令可嵌套。 count SETA 1 WHILE count =4count SETA count+1 WEND,