4-嵌入式系统原理及应用教程第4章.ppt
《4-嵌入式系统原理及应用教程第4章.ppt》由会员分享,可在线阅读,更多相关《4-嵌入式系统原理及应用教程第4章.ppt(131页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、主讲内容,第1章 嵌入式系统概述 第2章 ARM微处理器概述与编程模型 第3章 ARM9指令系统 第4章 嵌入式程序设计基础 第5章 嵌入式内部可编程模块 第6章 嵌入式接口技术应用 第7章 软件开发环境,第4章 嵌入式程序设计基础,基于ARM的编译器一般都支持汇编语言的程序设计、C/C+语言的程序设计及两者的混合编程。 本章介绍ARM的嵌入式程序的基础知识 伪指令 汇编语言的语句格式 汇编语言 C/C+语言的混合编程.,4.1 伪指令,在ARM汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作称为伪操
2、作。 伪指令在源程序中的作用是既要把正常的程序用指令表达给计算机以外,又要把程序设计者的意图表达给编译器. 例如:要告诉编译器程序段的开始和结束,需要定义数据等.,在ARM的汇编程序中,我们把伪指令分为三部分介绍: 通用伪指令 与ARM指令相关的伪指令 与Thumb指令相关的伪指令,4.1 伪指令,4.1.1 通用伪指令,通用伪指令包括: 符号定义伪指令 数据定义伪指令 汇编控制伪指令 及其他一些常用伪指令等。,4.1.1 通用伪指令,1.符号定义伪指令 符号定义伪指令用于声明ARM汇编程序中的变量、对变量赋值以及定义寄存器的名称等操作。 常见的符号定义伪指令有如下几种: (1)GBLA、GB
3、LL和GBLS 语法格式: GBLA(GBLL或GBLS)全局变量名 GBLA、GBLL和GBLS伪指令是声明全局变量的伪指令,用于定义一个ARM程序中的全局变量,并将其初始化。,4.1.1 通用伪指令,其中: GBLA用于声明一个全局的数字变量,并初始化为0; GBLL伪指令用于声明一个全局的逻辑变量,并初始化为F(假); GBLS伪指令用于声明一个全局的字符串变量,并初始化为空;对于全局变量来说,变量名在源程序中必须是唯一的。,1.符号定义伪指令 符号定义伪指令用于声明ARM汇编程序中的变量、对变量赋值以及定义寄存器的名称等操作。 常见的符号定义伪指令有如下几种: (1)GBLA、GBLL
4、和GBLS,4.1.1 通用伪指令,指令示例: GBLADATE1 ;声明一个全局数字变量DATE1 GBLLDATE1 ;声明一个全局逻辑变量DATE2 GBLSDATA3 ;声明一个全局的字符串变量DATE3 DATE3SETS“Testing” ;将该变量赋值为“Testing”,4.1.1 通用伪指令,(2)LCLA、LCLL和LCLS 语法格式: LCLA(LCLL或LCLS)局部变量名 LCLA、LCLL和LCLS伪指令是声明局部变量伪指令,用于定义一个ARM程序中的局部变量,并将其初始化。 其中: LCLA用于声明一个局部的数字变量,并初始化为0; LCLL用于声明一个局部的逻辑
5、变量,并初始化为F(假); LCLS用于声明一个局部的字符串变量,并初始化为空。对于局部变量来说,变量名在使用的范围内必须是唯一的,范围限制在定义这个变量的宏指令程序段内。,4.1.1 通用伪指令,指令示例: LCLADATE4 ;声明一个局部数字变量DATE4 LCLLDATE5 ;声明一个局部的逻辑变量DATE5 DATA4SETL 0 x10 ;为变量DATE4赋值为0 x10 LCLSDATA6 ;声明一个局部的字符串变量DATA6,4.1.1 通用伪指令,(3)SETA、SETL和SETS 语法格式: 变量名 SETA(SETL或SETS)表达式 SETA、SETL、SETS是变量赋
6、值伪指令,用于给一个已经定义的全局变量或局部变量赋值。 其中: SETA用于给一个数学变量赋值; SETL用于给一个逻辑变量赋值; SETS用于给一个字符串变量赋值;,4.1.1 通用伪指令,指令示例: GBLA EXAMP1 ;先声明一个全局数字变量EXAMP1 EXAMP1 SETA0 xaa ;将变量EXAMP1赋值为0 xaa LCLL EXAMP2 ;声明一个局部的逻辑变量EXAMP2 EXAMP1 SETLTRUE ;将变量EXAMP1赋值为TRUE GBLA EXAMP3 ;先声明一个全局字符串变量EXAMP3 EXAMP3 SETS“string” ;将变量EXAMP3赋值为s
7、tring,4.1.1 通用伪指令,(4)RLIST 语法格式: 名称 RLIST 寄存器列表 RLIST伪指令是定义通用寄存列表伪指令,通用寄存器列表定义主要应用在堆栈操作或多寄存器传送中,即使用该伪指令定义的名称可在ARM指令LDM/STM中使用。 在LDM/STM指令中,列表中的寄存器访问次序为根据寄存器的编号由低到高,而与列表中的寄存器排列次序无关。,4.1.1 通用伪指令,指令示例: RegListRLISTR0-R5,R8 ;定义寄存器列表为RegList 在程序中使用: STMFD SP!,RegList ;存储列表到堆栈 LDMIA R5,RegList ;加载列表,4.1.1
8、 通用伪指令,2.数据定义伪指令 数据定义伪指令一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。常见的数据定义伪指令有如下几种: (1)DCB 语法格式: 标号 DCB表达式 DCB伪指令是字节分配内存单元伪指令,用来分配一片连续的字节存储单元并用伪指令中指定的数值或字符初始化。其中,数值范围为0255,DCB也可用“=”代替。,4.1.1 通用伪指令,指令示例: String DCB“This is a test!” ;分配一片连续的字节存储单元并初始化。 DATA2 DCB 15,25,62,00 ;为数字常量15,25,62,00分片内存单元,4.1.1 通用伪指令,
9、(2)DCW(或DCWU) 语法格式: 标号DCW(或DCWU)表达式 DCW(或DCWU)伪指令是为半字分配内存单元,其中,表达式可以为程序标号或数字表达式。 伪指令DCW用于为半字分配一段半字对准的内存单元,并用指定的数据初始化;伪指令DCWU用于为半字分配一段可以非半字对准的内存单元,并用指定的数据初始化。,4.1.1 通用伪指令,指令示例: DATA1 DCW 1,2,3 ;分配一片连续的半字存储单元并初始化为1,2,3。 DATA2 DCWU 45,0 x2a*0 x2a ;分配一片非半字对准存储单元并初始化。,4.1.1 通用伪指令,(3)DCD(或DCDU) 语法格式: 标号 D
10、CD(或DCDU)表达式 DCD(或DCDU)伪指令是为字分配内存单元伪指令,其中,表达式可以为程序标号或数字表达式。DCD也可用“加载给R0 ADR R1,LOOP+0 x40*2 ;把LOOP+0 x40*2处 ;绝对地址加载给R1 ALIGN LOOP ADD R2,R0,R1 ,4.1.3 与Thumb指令相关的伪指令,2. LDR伪指令 语法格式 : LDRcondRd, =数值表达式;加载数字常量 LDRcondRd, =语句标号+数值表达式 ;加载地址 LDR伪指令是把一个数字常量或一个地址加载到低端寄存器伪指令。如果所加载的是一个32位的数字常量,则编译程序就可以把这条语句编译
11、成一条MOV指令,如果不能用MOV指令来表达,则编译成一条LDR指令。如果所加载的是地址的话,编译程序会把这条语句编译成LDR指令。,4.1.3 与Thumb指令相关的伪指令,在使用LDR指令替代伪指令时,编译程序先把数据(或地址)存放在数据缓冲区内,在执行LDR指令时,从缓冲区读出这个数据加载到寄存器中去。因此,在使用这条伪指令时,要为程序创建数据缓冲区。 指令示例: LDR R1, =0 xFFE ;加载0 xFFE到R1中 ;汇编器汇编成MOV R1,# 0 xFFE LDR R1, =START ;加载START处的地址到R1中,4.1.3 与Thumb指令相关的伪指令,3. NOP
12、语法格式: NOP NOP伪指令是空操作指令,在汇编时将被编译成一条无效指令,如MOV R0,R0,占用32位代码空间。,4.2 汇编语言的语句格式,汇编语言的源程序主要组成: 指令 伪指令 语句标号 注释,4.2.1 书写格式,ARM(Thumb)汇编语言的语句格式为: 语句标号 指令或伪指令 ;注释 1.语句标号 语句标号可以大小写字母混合使用,可以使用数字和下划线。语句标号不能与指令助记符、寄存器、变量名同名。 2.指令和伪指令 指令助记符和伪指令助记符可以大写,也可以小写,但不能大小写混合使用。指令助记符和后面的操作数寄存器之间必须有空格,不可以在这之间使用逗号。 3. 注释 汇编器在
13、编译时,当发现一个分号后,把后面的内容解释为注释,不予以编译。,4.2.1 书写格式,举例: AREA EXAMPLE1,CODE,READONLY ;EXAMPLE1程序段代码段,只读属性,4.2.2 汇编语言中表达式和运算符,在汇编语言程序设计中,经常使用各种符号代替地址、变量和常量等,以增加程序的可读性。 1. 变量 ARM(Thumb)汇编程序所支持的变量形式有3种: 数字变量 逻辑变量 字符串变量 变量在编译过程中可能被改变。,4.2.2 汇编语言中表达式和运算符,(1)数字变量用于在程序的运行中保存数字值,数字变量的取值范围不能超过一个32位数所能表达的范围。 全局数字变量使用伪指
14、令GBLA定义; 局部数字变量使用伪指令LCLA定义; 数字变量使用伪指令SETA赋值。,4.2.2 汇编语言中表达式和运算符,(2)逻辑变量用于在程序的运行中保存逻辑值,逻辑值只有两种取值情况:真或假。 全局逻辑变量使用伪指令GBLL定义; 局部逻辑变量使用伪指令LCLL定义; 逻辑变量使用伪指令SETA赋值。,4.2.2 汇编语言中表达式和运算符,(3)字符串变量用于在程序的运行中保存一个字符串. 全局串变量使用伪指令GBLS定义; 局部串变量使用伪指令LCLS定义; 串变量使用伪指令SETS赋值。 串变量需要使用双引号包含。,4.2.2 汇编语言中表达式和运算符,(4)变量代换 程序中的
15、变量可通过代换操作取得一个常量。 代换操作符为“$”。 如果在数字变量前面有一个代换操作符“$”,编译器会将该数字变量的值转换为十六进制的字符串,并将该十六进制的字符串代换“$”后的数字变量; 如果在逻辑变量前面有一个代换操作符“$”,编译器会将该逻辑变量代换为它的取值(真或假); 如果在字符串变量前面有一个代换操作符“$”,编译器会将该字符串变量的值代换“$”后的字符串变量。,4.2.2 汇编语言中表达式和运算符,指令示例: LCLSString1 ;定义局部字符串变量String1和String2 LCLSString2 String1 SETS “pen!” String2 SETS “
16、This is a $ String1” ;字符串变量S2的值为“This is a Test!”,4.2.2 汇编语言中表达式和运算符,2. 数字表达式及运算符 数字表达式包括数字、数字常量、数字变量、数字运算符和括号构成。表达式的结果不能超过一个32位数的表达范围。 (1)数字形式可以: 十进制 十六进制 N进制 ASCII,4.2.2 汇编语言中表达式和运算符,若是十进制,在表达的时候可以直接表达, 例如:1234、56789。 若是十六进制,有两种表达方法。 一种是在数值前加“0 x” 另一种是在数值前加“ instruction 汇编语言程序段以及注释 instruction 其中,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 原理 应用 教程
限制150内