资源预览内容
第1页 / 共69页
第2页 / 共69页
第3页 / 共69页
第4页 / 共69页
第5页 / 共69页
第6页 / 共69页
第7页 / 共69页
第8页 / 共69页
第9页 / 共69页
第10页 / 共69页
亲,该文档总共69页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
空天科学技术研究院空天科学技术研究院 清水河,研究院大楼清水河,研究院大楼108108 陈陈 敏敏 E-mail: E-mail: chenminuestc.edu.cnchenminuestc.edu.cnTELE TELE: 028-61830626 028-61830626第第9 9章章 ARMARM程序设计程序设计ARM常用开发环境 主要分为基于Windows平台的和基于Linux平台的 两大类 基于Windows平台 ADS ,目前已经基本被替代 RealView Developer Suite(RVDS) ,目前主流工具 Embedded Workbench for ARM(EWARM) ,IAR System公 司,入门简单,授权费用高 RealView Microcontroller Development Kit(MDK) ,源自 德国Keil公司,多用于低端ARM处理器开发 基于Linux平台 ARM-Linux-GCC ,GNU开发的编译器集,依赖于不同的 目标机的平台,使用繁琐但不需要授权费用 RVDS开发环境简介 替代ADS的新一代开发环境 集程序的编辑、编译及调试于一体 支持软件仿真和硬件调试 持汇编、C和C+等多种源代码的编译 目前广泛的应用于ARM处理器开发 包括CodeWarrior IDE集成开发环境和 RVDebugger调试器两部分 CodeWarrior IDE的主窗口 RVD调试器主窗口 汇编语言程序设计特点1.汇编语言依赖于机器硬件,不同CPU提供的汇编指令可 能有很大的不同,因此汇编源程序几乎不具有移植性;但 汇编语言程序速度快、效率高,更能发挥机器硬件的长处 ; 2. 汇编程序需要用户将汇编过程中需要的一些信息明确地写入 源程序,如:内存逻辑段的划分情况、数据在内存中的存 放情况,等等。这些信息的说明由汇编程序指定相应的伪 指令来完成,并不由CPU定义; 3. 伪指令 是在汇编过程中执行的,因而不会在机器语言程序中 产生目标代码;只有CPU定义的(助记符)指令才会生成 目标代码,并在程序运行过程中执行;汇编语言源程序机器语言程序 (目标代码)汇编(汇编程序)高级语言源程序编译或解释(编译程序)6/524. 源程序经汇编得到的目标代码实际上也是不能运行的,还要经过系统的链接定位后才能生成真正的可执行文件(.EXE文件)。即一般用汇编语言开发 应用软件时应依次 完成以下几个步骤:(1)编辑得到源程序(2)汇编得到目标代码(解决语法错误)(3)链接得到可执行文件(解决定位错误) (4)调试得到功能正确的应用软件(解决逻辑错误)(以上第24步任何一步有错都应返回到第1步重来)7/52符号定义伪指令 符号类型指示符功能符号定义 伪指令GBLA声明和初始化一个全局算术变量,初始值为0GBLL声明和初始化一个全局逻辑变量,初始值为FALSEGBLS声明和初始化一个全局字符串变量,初始值为空LCLA声明和初始化一个局部算术变量,初始值为0。局部算术变量只 能在宏中进行声明。LCLL声明和初始化一个局部逻辑变量,初始值为FALSE。局部逻辑变 量只能在宏中进行声明。 LCLS声明和初始化一个局部字符串变量,初始值为空。局部字符串变量 只能在宏中进行声明。 SETA给一个局部或全局算术变量置值SETL给一个局部或全局逻辑变量置值SETS给一个局部或全局字符串变量置值RLIST给寄存器集命名CN给一个协处理器寄存器命名CP给一个特定协处理器命名,协处理器号为015DN给一个双精度VFP寄存器命名SN给一个单精度VFP寄存器命名FN给一个特定的浮点寄存器命名 *8/52GBLA Test1;声明全局数字变量Test1,赋值为0xaaTest1 SETA 0xaaGBLL Test2;声明全局逻辑变量Test2,赋值为“真”Test2 SETL TRUEGBLS Test3;声明全局字符串变量为Test3,赋值为“Testing“Test3 SETS “Testing“LCLA Test4; 声明局部数字变量Test4,赋值为0xaaTest3 SETA 0xaaLCLL Test5; 声明局部逻辑变量Test5 ,赋值为“真”Test4 SETL TRUELCLS Test6;声明局部字符串变量Test6 ,赋值为“Testing“Test6 SETS “Testing“RegList RLIST R0-R5, R8, R10 ; 声明寄存器列表RegList,LDM/STM指令可通过该名称访问寄存器列表*9/52数据定义伪指令 数据定义 伪指令LTORG指定一个文字池用以保存数据 或MAP指定一个内存表的首址# 或FIELD指定内存表中的各数据域的长长度(一般在MAP之后)% 或SPACE指定一块块存储储器的长长度并将其中单单元初始化为为0= 或DCB分配一片连续连续 的字节单节单 元并初始化分配一片连续连续 的字节单节单 元并用于存放代码码分配一片连续的字节存储单元并初始化Test2Data DCW 1, 2, 3; 分配一片连续的半字存储单元并初始化DataTest DCD 4, 5, 6; 分配一片连续的字存储单元并初始化FdataTest DCFD 2E115, -5E7; 分配一片连续的字存储单元并初始化FdataTest DCFS 2E5, -5E-7; 分配一片连续的字存储单元并初始化DataTest DCQ 100; 分配一片连续的8字节存储单元并初始化DataSpace SPACE 100; 分配连续100个字节存储单元并初始化为0定义一个首址为4096(0x1000)的内存表,该表中包含5个字段 :A(4Bytes)、B(4Bytes)、X(8Bytes)、Y(8Bytes)、String(256Bytes) 。MAP 0x1000; 内存表首地址的值为0x1000 A FIELD 4; 定义A的长度为4字节,位置为0x1000 B FIELD 4; 定义B的长度为4字节,位置为0x1004 X FIELD 8; 定义X的长度为8字节,位置为0x1008 Y FIELD 8; 定义Y的长度为8字节,位置为0x1010 String FIELD 256; 定义String为256字节,位置为0x1018LDR R6, A 基于绝对地 址的内存表仅可访问指令前/后4KB地址范围的数据字段双精度单精度定义一个内存表,其首址为固定地址与R9和,表中包含同样字段。 MAP 0, R9 ; 内存表首地址为0与R9寄存器内容的和 A FIELD 4; 定义A的长度为4字节,相对位置为0 B FIELD 4; 定义B的长度为4字节,相对位置为4 X FIELD 8; 定义X的长度为8字节,相对位置为8 YFIELD 8; 定义Y的长度为8字节,相对位置为16 String FIELD 256; 定义String为256字节,相对位置为24ADR R9, DATASTART;伪指令ADR 初始化R9 LDR R5, B ; 相当于LDR R5, R9, #4可访问地址范围 超过4 KB的数据基于相对地 址的内存表定义一个内存表,其首址为PC的值,表中包含同样字段。 Dstruc SPACE 280; 分配280个字节单元 MAP Dstruc ; 内存表首地址为Dstruc A FIELD4; 定义A的长度为4字节,相对位置为0 B FIELD4; 定义B的长度为4字节,相对位置为4 X FIELD8; 定义X的长度为8字节,相对位置为8 Y FIELD8; 定义Y的长度为8字节,相对位置为16 String FIELD256; 定义String为256字节,相对位置为24LDR R5, B ; 相当于LDR R5, PC, #4基于PC的 内存表可访问地址范围不 超过4 KB的数据汇编控制伪指令 GBLA Counter ; 声明全局的数字变量CounterCounter SETA 3; 由变量Counter控制循环次数 WHILE Counter YX大于Y X = YX大于等于Y X YX不等于YX:LAND:Y逻辑与X:LOR:Y逻辑或 :LNOT:Y逻辑非 X:LEOR:Y逻辑异或28/52注意:这些运算在汇 编过程中计算,机器 码中出现的已经是表 达式的值了。字符串表达式及运算符字符串表达式一般由字符串常量、字符串变量、运算符和括号构成。编译器支持的字符串最大长度为512字节。 LEN:X 返回字符串X的长度(字符数)。 CHR:M 将0255之间的整数M转换为一个字符。 STR:X 将数字或逻辑表达式X转换为一个字符串。对于数字表达式,STR运算得到一个以十六进制字符组成的字符串;对于逻辑表达式,STR运算得到字符串“T”或“F”。 X:LEFT:Y 返回字符串X左端的一个子串。整数Y表示要返回的字符个数。 X:RIGHT:Y 返回字符串X右端的一个子串。整数Y表示要返回的字符个数 X:CC:Y 将字符串Y连接到字符串X的后面形成一个新字符串。*29/52其它常用运算符 ?X返回定义符号X的代码行所生成的可执行代码的长度(字 节数) :DEF:X判断是否定义了符号X:如果符号X已经定义则结果为真 ,否则为假。 BASE:X 返回基于寄存器的表达式X中寄存器的编号。 INDEX:X 返回基于寄存器的表达式X中相对于其基址寄存器的偏移量 。 *30/52ARM汇编语言程序结构ARM(Thumb)汇编语言程序中,以程序段(代码段和数据段)为单位组织代码。一个汇编程序至少应该有一个代码段。当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译连接时最终形成一个可执行的映象文件。可执行映象文件通常由以下几部分构成: 一个或多个代码段,代码段的属性默认为READONLY。 零个或多个包含初始化数据的数据段,数据段的属性默认为 READWRITE。 零个或多个不包含初始化数据的数据段,数据段的属性为默认为 READWRITE。 *31/52ARM汇编语言程序结构示例 GET option.s GET addr.s AREA Init,CODE,READONLY ENTRY spr MULr1,r0,r0 AREAData1,DATA,READWRITE num DCD10 END引用其它源文件代码段数据段定义代码段指定程序入口程序主体ARM汇编程序设计实例 重点介绍如何用ARM汇编语言实现 : 顺序结构 分支结构 循环结构 子程序调用与返回 顺序结构 - 两个64位数相加 AREA add64,CODE,READONLY ENTRY start LDRR0, =data1 ; R0中保存data1的首地址 LDRR1, R0 ; 用寄存器间接寻址方式读数据1的高32位到R1 LDRR2,R0,#4 ; 用寄存器间接寻址方式读数据1的低32位到R2 LDRR0, =data2 ; R0中保存data2的首地址 LDRR3, R0 ; 用寄存器间接寻址方式读数据2的高32位到R3 LDRR4,R0,#4 ; 用寄存器间接寻址方式读数据1的低32位到R4 ADDSR6,R2,R4 ; 低32位相加,并影响标志位,保存进位 ADCR5,R1,R3 ; 高32位相加,并使用标志位C LDRR0,=result ; R0中保存result的首地址 STRR5,R0 ; 保存结果的高
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号