chap9 ARM程序设计_第1页
chap9 ARM程序设计_第2页
chap9 ARM程序设计_第3页
chap9 ARM程序设计_第4页
chap9 ARM程序设计_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计1第九章第九章 ARMARM程序设计程序设计4学时学时微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计第九章第九章 ARMARM程序设计程序设计9.1 ARM程序开发环境程序开发环境(掌握)(掌握)常用常用ARM程序开发环境简介程序开发环境简介RVDS开发环境简介开发环境简介9.2 汇编语言伪指令汇编语言伪指令(掌握)(掌握)符号定义伪指令符号定义伪指令数据定义伪指令数据定义伪指令汇编控制伪指令汇编控制伪指令其他常用伪指令其他常用伪指令汇编语言中常用的符号汇编语言中常用的符号常用的运算符和表达式常用的运算符和表达式

2、2微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计第九章第九章 ARMARM程序设计程序设计9.3 ARM汇编语言程序设计汇编语言程序设计(掌握)(掌握)ARM汇编语言程序结构汇编语言程序结构ARM汇编语言程序实例汇编语言程序实例9.4 ARM汇编语言与汇编语言与C/C+的混合编程的混合编程(理解)(理解)C与汇编之间的函数调用与汇编之间的函数调用C/C+语言和汇编语言的混合编程语言和汇编语言的混合编程3微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计9.1 ARM9.1 ARM常用开发环境常用开发环境n主要分为基于主要分为基于Windows平台的和基于平台的和

3、基于Linux平台平台的两大类的两大类 n基于基于Windows平台平台uADS ,目前已经基本被替代,目前已经基本被替代uRealView Developer Suite(RVDS) ,CodeWarrior IDERV DebuggeruEmbedded Workbench for ARM(EWARM) ,IAR System公司,入门简单,授权费用高公司,入门简单,授权费用高uRealView Microcontroller Development Kit(MDK) ,源自德国,源自德国Keil公司,多用于低端公司,多用于低端ARM处理器开发处理器开发n基于基于Linux平台平台uARM

4、-Linux-GCC ,GNU开发的编译器集,依赖于不同的目标机开发的编译器集,依赖于不同的目标机的平台,使用繁琐但不需要授权费用的平台,使用繁琐但不需要授权费用 4微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计 RVDS RVDS开发环境简介开发环境简介 n替代替代ADS的新一代开发环境的新一代开发环境n集成编辑、编译及调试于一体集成编辑、编译及调试于一体 n支持软件仿真和硬件调试支持软件仿真和硬件调试 n支持汇编、支持汇编、C和和C+等多种源代码的编译等多种源代码的编译 n目前广泛应用于目前广泛应用于ARM处理器开发处理器开发n包括包括CodeWarrior IDE集成开

5、发环境和集成开发环境和RVDebugger调试器两部分调试器两部分 5微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计CodeWarrior IDECodeWarrior IDE的主窗口的主窗口 6微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计RVDRVD调试器主窗口调试器主窗口 7微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计汇编语言程序汇编语言程序n计算机硬件只能接收和识别二进制编码形式的机计算机硬件只能接收和识别二进制编码形式的机器指令,器指令,把助记符指令一一翻译成机器指令把助记符指令一一翻译成机器指令,并,并且在翻译的过程中还要完成

6、且在翻译的过程中还要完成程序区地址程序区地址、数据区数据区地址地址和和转移目标地址转移目标地址的的安排安排以及文件的连接等工以及文件的连接等工作,最后才能把程序以机器码的形式输入计算机作,最后才能把程序以机器码的形式输入计算机去运行。上述这些工作称为去运行。上述这些工作称为汇编汇编。 n专门用来进行汇编的软件称为专门用来进行汇编的软件称为汇编器汇编器。n用于用于指导汇编器指导汇编器进行进行汇编工作的指令汇编工作的指令,由于这些,由于这些指令不形成机器码指令,只是在汇编器进行汇编指令不形成机器码指令,只是在汇编器进行汇编工作的过程中起作用,所以称其为工作的过程中起作用,所以称其为伪指令伪指令。

7、8微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计汇编语言程序汇编语言程序n伪指令、宏指令和前面学过的助记符指令,再加伪指令、宏指令和前面学过的助记符指令,再加上相应的语言规范,就形成了一种新的程序设计上相应的语言规范,就形成了一种新的程序设计语言语言汇编语言汇编语言(Assembly Language)(Assembly Language) n用汇编语言编写的程序就称为汇编语言用汇编语言编写的程序就称为汇编语言源程序源程序,而自源程序翻译成的机器码程序就称为而自源程序翻译成的机器码程序就称为目标程序目标程序n目标程序还要经过系统的链接定位后才能生成真正的目标程序还要经过系统的

8、链接定位后才能生成真正的可执可执行文件行文件(.EXE.EXE文件)。汇编的一般步骤:文件)。汇编的一般步骤:u编辑得到源程序编辑得到源程序u汇编得到目标代码(解决语法错误)汇编得到目标代码(解决语法错误)u链接得到可执行文件(解决定位错误)链接得到可执行文件(解决定位错误) u调试得到功能正确的应用软件(解决逻辑错误)调试得到功能正确的应用软件(解决逻辑错误)9微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计汇编语言程序设计特点汇编语言程序设计特点n汇编语言汇编语言依赖于机器硬件依赖于机器硬件,不同,不同CPU提供的汇编提供的汇编指令可能有很大的不同,汇编源程序指令可能有很大

9、的不同,汇编源程序几乎不具有几乎不具有可移植性可移植性;n汇编语言汇编语言比机器语言易于读写、调试和修改比机器语言易于读写、调试和修改;n具有机器语言执行具有机器语言执行速度快、效率高、占内存空间速度快、效率高、占内存空间少少等优点等优点n在编写复杂程序时,在编写复杂程序时,相对高级语言而言代码量较相对高级语言而言代码量较大大;汇编语言源程序汇编语言源程序机器语言程序机器语言程序(目标代码)(目标代码)汇编(汇编程序)汇编(汇编程序)高级语言源程序高级语言源程序编译或解释(编译程序)编译或解释(编译程序)10微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计9.2 9.2 符号定

10、义伪指令符号定义伪指令 11符号符号类型类型指示符指示符 符号符号定义定义伪指伪指令令GBLAGBLLGBLSLCLALCLLLCLSSETASETLSETSRLISTCNCPDNSNFN功能功能声明和初始化一个声明和初始化一个全局全局算术算术变量,初始值为变量,初始值为0声明和初始化一个声明和初始化一个全局全局逻辑逻辑变量,初始值为变量,初始值为FALSE声明和初始化一个声明和初始化一个全局全局字符串字符串变量,初始值为空变量,初始值为空声明和初始化一个声明和初始化一个局部局部算术变量,初始值为算术变量,初始值为0。局部算术变量只能在。局部算术变量只能在宏中进行声明宏中进行声明。声明和初始化

11、一个声明和初始化一个局部局部逻辑变量,初始值为逻辑变量,初始值为FALSE。局部逻辑变量只能在。局部逻辑变量只能在宏中宏中进行声明。进行声明。声明和初始化一个声明和初始化一个局部局部字符串变量,初始值为空。局部字符串变量只能在字符串变量,初始值为空。局部字符串变量只能在宏中进宏中进行声明行声明。给一个局部或全局给一个局部或全局算术算术变量置值变量置值给一个局部或全局给一个局部或全局逻辑变量逻辑变量置值置值给一个局部或全局给一个局部或全局字符串变量字符串变量置值置值给给寄存器集寄存器集命名命名给一个协处理器寄存器命名给一个协处理器寄存器命名给一个特定协处理器命名,协处理器号为给一个特定协处理器命

12、名,协处理器号为015给一个双精度给一个双精度VFP寄存器命名寄存器命名给一个单精度给一个单精度VFP寄存器命名寄存器命名给一个特定的浮点寄存器命名给一个特定的浮点寄存器命名微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计GBLA Test1;声明全局算术变量声明全局算术变量Test1,赋值为,赋值为0 xaa Test1 SETA 0 xaaGBLL Test2;声明全局逻辑变量声明全局逻辑变量Test2,赋值为,赋值为“真真” Test2 SETL TRUEGBLS Test3;声明全局字符串变量为声明全局字符串变量为Test3,赋值为,赋值为Testing“ Test3

13、SETS Testing“LCLA Test4; 声明局部数字变量声明局部数字变量Test4,赋值为,赋值为0 xaa Test4 SETA 0 xaaLCLL Test5; 声明局部逻辑变量声明局部逻辑变量Test5 ,赋值为,赋值为“真真” Test5 SETL TRUELCLS Test6;声明局部字符串变量声明局部字符串变量Test6 ,赋值为,赋值为Testing“ Test6 SETS Testing“RegList RLIST R0-R5, R8, R10; 声明寄存器列表声明寄存器列表RegList,LDM/STM指令可通过该名称访问寄存器列表指令可通过该名称访问寄存器列表12

14、微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计数据定义伪指令数据定义伪指令 数 据数 据定义定义伪 指伪 指令令LTORG指示汇编器指示汇编器汇编当前文字池汇编当前文字池 或或MAP置置存储映射存储映射的起点的起点到一个特定的地址到一个特定的地址# 或或FIELD描述指示符所定义的存储映射中的空间描述指示符所定义的存储映射中的空间% 或或SPACE定义一块定义一块值为值为0的存储器区域的存储器区域= 或或DBC分配一个或多个分配一个或多个字节字节& 或或DCD分配一个或多个分配一个或多个字,字,从从4字节边界字节边界开始开始DCDU分配一个或多个分配一个或多个字字,但

15、,但不一定从不一定从4字节边界字节边界开始开始DCDO分配以分配以字边界开始的存储区域字边界开始的存储区域,并指定初始值为到静态基址寄存器,并指定初始值为到静态基址寄存器的偏移的偏移DCFD分配给分配给双精度浮点数双精度浮点数一段一段以字边界以字边界开始的内存区域开始的内存区域DCFDU分配给分配给双精度浮点数双精度浮点数一段以一段以任意边界任意边界开始的内存区域开始的内存区域DCFS分配给分配给单精度浮点数单精度浮点数一段以一段以字边界字边界开始的内存区域开始的内存区域DCFSU分配给分配给单精度浮点数单精度浮点数一段以一段以任意边界任意边界开始的内存区域开始的内存区域DCI分配以分配以字边

16、界开始字边界开始的存储区域,并的存储区域,并指定初始值指定初始值。标记此地址存储的。标记此地址存储的是代码而不是数据是代码而不是数据DCQ分配给分配给双精度浮点数双精度浮点数一段以一段以4字节边界字节边界开始的内存区域开始的内存区域DCQU分配给分配给双精度浮点数双精度浮点数一段以一段以任意边界任意边界开始的内存区域开始的内存区域DCW分配给一个或多个分配给一个或多个半字半字以以半字边界半字边界开始的内存区域开始的内存区域DCWU分配给一个或多个分配给一个或多个半字半字以以任意边界任意边界开始的内存区域开始的内存区域DATA标识一个标识一个标号是代码段中数据的标号标号是代码段中数据的标号,该符

17、号后是,该符号后是DCBDCB或或DCDDCD13微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计数据定义伪指令14Str DCB “This is a test!” ; 分配一片连续的分配一片连续的字节存储单元字节存储单元并初始化并初始化GBLL Test2DataTest DCW 1, 2, 3; 分配一片连续的分配一片连续的半字存储单元半字存储单元并初始化并初始化DataTest DCD 4, 5, 6; 分配一片连续的分配一片连续的字存储单元字存储单元并初始化并初始化FdataTest DCFD 2E115, -5E7; 分配一片连续的分配一片连续的双字存储单元双字存储

18、单元并初始化并初始化;为指定的为指定的双精度数双精度数FdataTest DCFS 2E5, -5E-7; 分配一片连续的分配一片连续的字存储单元字存储单元并初始化并初始化;为指定的为指定的单精度数单精度数DataTest DCQ 100 ; 分配一片连续的存储单元分配一片连续的存储单元(8字节字节)并初始化为指定的值并初始化为指定的值DataSpace SPACE 100; 分配连续分配连续100字节的存储单元并初始化为字节的存储单元并初始化为0MAP 0 x100, R0; 定义结构化内存表首地址的值为定义结构化内存表首地址的值为0 x100+R0 画出存储单元分配示意图并且填写内容?各个

19、变量起始地址值?画出存储单元分配示意图并且填写内容?各个变量起始地址值?微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计数据定义伪指令15下面的伪操作序列下面的伪操作序列定义一个内存表定义一个内存表,其,其首地址为首地址为固定地址固定地址4096(0 x1000),该内,该内存表中包含存表中包含5个数据字段:个数据字段:A长度为长度为4个字节;个字节;B长度为长度为4个字节;个字节;X长度为长度为8个个字节;字节;Y长度为长度为8个字节;个字节;String长度为长度为256个字节。这种内存表称为基于绝对个字节。这种内存表称为基于绝对地址的内存表。地址的内存表。MAP 0 x1

20、000; 内存表首地址的值为内存表首地址的值为0 x1000A FIELD 4; 定义定义A的长度为的长度为4字节,位置为字节,位置为0 x1000B FIELD 4; 定义定义B的长度为的长度为4字节,位置为字节,位置为0 x1004X FIELD 8; 定义定义X的长度为的长度为8字节,位置为字节,位置为0 x1008Y FIELD 8; 定义定义Y的长度为的长度为8字节,位置为字节,位置为0 x1010String FIELD 256; 定义定义String的长度为的长度为256字节,位置为字节,位置为0 x1018LDR R6, A ; 该指令仅仅可以访问指令前面或该指令仅仅可以访问指

21、令前面或(后面后面)4KB地址地址;范围的数据字段范围的数据字段基于绝对地基于绝对地址的内存表址的内存表微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计定义一个内存表,其首址为固定地址与定义一个内存表,其首址为固定地址与R9R9和,表中包含同样字段。和,表中包含同样字段。MAP MAP 0, R9 0, R9 ; ; 内存表首地址为内存表首地址为0 0与与R9R9寄存器内容的和寄存器内容的和A A FIELD FIELD 4 4; ; 定义定义A A的长度为的长度为4 4字节,相对位置为字节,相对位置为0 0B B FIELD FIELD 4 4; ; 定义定义B B的长度为的

22、长度为4 4字节,相对位置为字节,相对位置为4 4X X FIELD FIELD 8 8; ; 定义定义X X的长度为的长度为8 8字节,相对位置为字节,相对位置为8 8Y YFIELD FIELD 8 8; ; 定义定义Y Y的长度为的长度为8 8字节,相对位置为字节,相对位置为1616String String FIELD FIELD 256256; ; 定义定义StringString为为256256字节,相对位置为字节,相对位置为2424ADR ADR R9, DATASTARTR9, DATASTART;伪指令;伪指令ADR ADR 初始化初始化R9 R9 LDR LDR R5, B

23、 R5, B ; ; 相当于相当于LDR R5, R9, #4LDR R5, R9, #4可访问地址范围可访问地址范围超过超过4 KB4 KB的数据的数据基于相对地基于相对地址的内存表址的内存表定义一个内存表,其首址为定义一个内存表,其首址为PCPC的值,表中包含同样字段。的值,表中包含同样字段。Dstruc Dstruc SPACE SPACE 280280; ; 分配分配280280个字节单元个字节单元MAP MAP Dstruc Dstruc ; ; 内存表首地址为内存表首地址为DstrucDstrucA A FIELDFIELD4 4; ; 定义定义A A的长度为的长度为4 4字节,相

24、对位置为字节,相对位置为0 0B B FIELDFIELD4 4; ; 定义定义B B的长度为的长度为4 4字节,相对位置为字节,相对位置为4 4X X FIELDFIELD8 8; ; 定义定义X X的长度为的长度为8 8字节,相对位置为字节,相对位置为8 8Y Y FIELDFIELD8 8; ; 定义定义Y Y的长度为的长度为8 8字节,相对位置为字节,相对位置为1616String String FIELDFIELD256256; ; 定义定义StringString为为256256字节,相对位置为字节,相对位置为2424LDR LDR R5, B R5, B ; ; 相当于相当于LD

25、R R5, PC, #4LDR R5, PC, #4基于基于PCPC的的内存表内存表可访问地址范围不可访问地址范围不超过超过4 KB4 KB的数据的数据16微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计汇编控制伪指令汇编控制伪指令 GBLA Counter ; 声明全局的数字变量声明全局的数字变量Counter Counter SETA 3; 由变量由变量Counter控制循环次数控制循环次数WHILE Counter YX大于YX = YX大于等于YX = YX小于等于YX /= YX不等于YX YX不等于YX:LAND:Y逻辑与X:LOR:Y逻辑或:LNOT:Y逻辑非X:

26、LEOR:Y逻辑异或注意:这些运算在汇注意:这些运算在汇编过程中计算,机器编过程中计算,机器码中出现的已经是表码中出现的已经是表达式的值了。达式的值了。32微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计字符串表达式及运算符字符串表达式及运算符 字符串表达式一般由字符串表达式一般由字符串常量、字符串变量、运算符和括号字符串常量、字符串变量、运算符和括号构成。编构成。编译器支持的字符串最大长度为译器支持的字符串最大长度为512512字节字节。 LEN:XLEN:X 返回字符串返回字符串X X的长度的长度( (字符数字符数) )。 CHR:MCHR:M 将将02550255之间的整

27、数之间的整数M M转换为一个字符。转换为一个字符。 STR:XSTR:X 将数字或逻辑表达式将数字或逻辑表达式X X转换为一个字符串。转换为一个字符串。对于数字表达式,对于数字表达式,STRSTR运算得到一个以十六进制字符组成的字符串;运算得到一个以十六进制字符组成的字符串;对于逻辑表达式,对于逻辑表达式,STRSTR运算得到字符串运算得到字符串“T T”或或“F F”。 X:LEFT:Y X:LEFT:Y 返回字符串返回字符串X X左端的一个子串。整数左端的一个子串。整数Y Y表示要返回的字符个数表示要返回的字符个数。 X:RIGHT:YX:RIGHT:Y 返回字符串返回字符串X X右端的一

28、个子串。整数右端的一个子串。整数Y Y表示要返回的字符个数表示要返回的字符个数 X:CC:YX:CC:Y 将字符串将字符串Y Y连接到字符串连接到字符串X X的后面形成一个新字符串。的后面形成一个新字符串。33微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计其它常用运算符其它常用运算符 ?X?X返回定义符号返回定义符号X X的代码行所生成的可执行代码的长度(字的代码行所生成的可执行代码的长度(字节数)节数) :DEF:X:DEF:X 判断是否定义了符号判断是否定义了符号X X:如果符号:如果符号X X已经定义则结果为真,已经定义则结果为真,否则为假。否则为假。 BASE:X B

29、ASE:X 返回基于寄存器的表达式返回基于寄存器的表达式X X中寄存器的编号。中寄存器的编号。 INDEX:XINDEX:X 返回基于寄存器的表达式返回基于寄存器的表达式X X中相对于其基址寄存器的偏移中相对于其基址寄存器的偏移量。量。 34微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计ARMARM汇编语言程序结构汇编语言程序结构 ARM(Thumb)ARM(Thumb)汇编语言程序中,以汇编语言程序中,以程序段(代码段和数据段)程序段(代码段和数据段)为单位组织代码。为单位组织代码。 一个汇编程序至少应该有一个代码段。当程序较长时,可以一个汇编程序至少应该有一个代码段。当程

30、序较长时,可以分割为多个代码段和数据段,多个段在程序编译连接时最终形分割为多个代码段和数据段,多个段在程序编译连接时最终形成一个可执行的映象文件。成一个可执行的映象文件。可执行映象文件可执行映象文件通常由以下几部分构成:通常由以下几部分构成: l l 一个一个或多个代码段,代码段的属性默认为或多个代码段,代码段的属性默认为READONLYREADONLY。 l l 零个或多个包含初始化数据的数据段,数据段的属性默认为零个或多个包含初始化数据的数据段,数据段的属性默认为READWRITEREADWRITE。 l l 零个或多个不包含初始化数据的数据段,数据段的属性为默认为零个或多个不包含初始化数

31、据的数据段,数据段的属性为默认为READWRITEREADWRITE。35微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计ARMARM汇编语言程序结构示例汇编语言程序结构示例nGET option.snGET addr.sn nAREA Init,CODE,READONLYn ENTRYn sprn MULr1,r0,r0 nAREAData1,DATA,READWRITEn num DCD10n nEND引用其它源文件引用其它源文件代码段代码段数据段数据段 定义代码段定义代码段 指定程序入口指定程序入口 程序主体程序主体36微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌

32、入式系统设计ARM(Thumb)汇编语句格式汇编语句格式 标号标号 指令或伪指令指令或伪指令; 注释注释 助记符可以全部用大写字母或全部用小写字母,助记符可以全部用大写字母或全部用小写字母,但不允许在一条指令中大小写字母混用。但不允许在一条指令中大小写字母混用。 如果一条语句太长,可将该长语句分为若干行如果一条语句太长,可将该长语句分为若干行来书写,在行的末尾用来书写,在行的末尾用“”表示下一行与本行为表示下一行与本行为同一条语句。同一条语句。 指令中可以出现常量、变量及表达式。指令中可以出现常量、变量及表达式。微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计 AREA Ini

33、t, CODE, READONLY ENTRYSTART LDR R0, = 0 x3FF5000 LDR R1, 0 xFF STR R1, R0 LDR R0, = 0 x3FF5008 LDR R1, 0 x01 STR R1, R0 ENDAREAAREA伪指令定义一个段,伪指令定义一个段,并说明段的相关属性并说明段的相关属性ENTRYENTRY伪指令标识程序的入口点伪指令标识程序的入口点每一个汇编源文件都必须有一条每一个汇编源文件都必须有一条ENDEND伪指令,指示汇编的结束伪指令,指示汇编的结束伪指令伪指令LDR对于不能被对于不能被MOV和和MVN指令所读取的立即数指令所读取的立即

34、数,将其变将其变成常量进行读取。成常量进行读取。存储单存储单元地址元地址标号标号STARTSTART代表第一条指令的存放地址代表第一条指令的存放地址微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计 AREA Block, CODE, READONLYnum EQU 20 ; 设置将要复制的字数设置将要复制的字数 ENTRY Start LDR R0, =src ; R0指向源数据区指向源数据区src LDR R1, =dst ; R1指向目标数据区指向目标数据区dst MOV R2, #num ; R2保存将要复制的字数保存将要复制的字数 MOV SP, #0 x400 ; 设

35、置堆栈指针设置堆栈指针(R13)Blockcopy MOVS R3, R2, LSR #3 ; 需要进行的以需要进行的以8个字为单位的复制次数个字为单位的复制次数 BEQ Copywords ; 对于剩下不足对于剩下不足8个字的数据,跳转到个字的数据,跳转到Copywords STMFD SP!, R4-R11 ; 将工作寄存器将工作寄存器R4-R11压入堆栈保存压入堆栈保存Octcopy LDMIA R0!, R4-R11 ; 从源数据区读取从源数据区读取8个字的数据,放入个字的数据,放入8个寄存器中个寄存器中 STMIA R1!, R4-R11 ; 将将8个寄存器中的数据写入目标数据区中个

36、寄存器中的数据写入目标数据区中 SUBS R3, R3, #1 ; 将块复制次数减将块复制次数减1 BNE Octcopy ; 循环操作,直到完成以循环操作,直到完成以8个字为单位的块复制个字为单位的块复制 LDMFD SP!, R4-R11 ; 从堆栈弹出恢复工作寄存器从堆栈弹出恢复工作寄存器R4-R11Copywords ANDS R2, R2, #7 ; 剩下不足剩下不足8个字的数据的字数个字的数据的字数 BEQ Stop ; 如果剩下数据的字数为如果剩下数据的字数为0,则数据复制完成,则数据复制完成Wordcopy LDR R3, R0, #4 ; 从源数据区读取从源数据区读取1个字的

37、数据,放到个字的数据,放到R3寄存器中寄存器中 STR R3, R1, #4 ; 将将R3寄存器中的数据写入目标数据区中寄存器中的数据写入目标数据区中 SUBS R2, R2, #1 ; 将字数减将字数减1 BNE Wordcopy ; 循环操作,直到完成以字为单位的数据复制循环操作,直到完成以字为单位的数据复制Stop MOV R0,#0 x18 ; LDR R1, =0 x20026 ; SWI 0 x123456 ; 从应用程序中退出从应用程序中退出 AREA BlockData, DATA, READWRITE ; 定义数据区定义数据区BlockDatasrc DCD 1, 2, 3,

38、 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7 ; 定义源数据区定义源数据区srcdst DCD 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 定义目标数据区定义目标数据区dst END ; 结束汇编结束汇编数据块复制数据块复制思考:为何以思考:为何以8字的块传送?最字的块传送?最大的字块可以多大?可否以单大的字块可以多大?可否以单字?多大字块最优?为什么?字?多大字块最优?为什么?微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计; ;文件名:文件名:TEST1.S TEST1.S ; ;功能:实

39、现两个寄存器相加功能:实现两个寄存器相加 ; ;说明:使用说明:使用ARMulateARMulate软件仿真调试软件仿真调试 AREAAREA Example1,CODE,READONLY;Example1,CODE,READONLY;声明代码段声明代码段Example1 Example1 ENTRYENTRY ; ;标识程序入口标识程序入口 CODE32CODE32 ; ;声明声明3232位位ARMARM指令指令START MOVSTART MOVR0,#0R0,#0 ; ;设置参数设置参数 MOVMOVR1,#10R1,#10LOOPLOOP BL BLADD_SUBADD_SUB ; ;

40、调用子程序调用子程序ADD_SUB ADD_SUB B BLOOPLOOP ; ;循环循环ADD_SUBADD_SUB ADDS ADDSR0,R0,R1R0,R0,R1 ;R0 = R0 + R1 ;R0 = R0 + R1 MOV MOVPC,LRPC,LR ; ;子程序返回子程序返回 ENDEND ; ;文件结束文件结束 使用使用“;”进行注释进行注释标号标号顶格顶格主程序主程序子程序子程序微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计ARMARM汇编程序设计实例汇编程序设计实例n重点介绍如何用重点介绍如何用ARM汇编语言实现汇编语言实现:u顺序结构顺序结构u分支结构分

41、支结构u循环结构循环结构u子程序调用与返回子程序调用与返回 41微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计顺序结构顺序结构 - - 两个两个6464位数相加位数相加 42微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计AREA add64,CODE,READONLYENTRYStart LDR R0, =data1 ; R0中保存中保存data1的首地址的首地址LDR R1, R0 ; 用寄存器间接寻址方式读数据用寄存器间接寻址方式读数据1的高的高32位到位到R1LDR R2,R0,#4 ; 用寄存器间接寻址方式读数据用寄存器间接寻址方式读数据1的低的低3

42、2位到位到R2LDR R0, =data2 ; R0中保存中保存data2的首地址的首地址LDR R3, R0 ; 用寄存器间接寻址方式读数据用寄存器间接寻址方式读数据2的高的高32位到位到R3LDR R4,R0,#4 ; 用寄存器间接寻址方式读数据用寄存器间接寻址方式读数据1的低的低32位到位到R4ADDS R6,R2,R4 ; 低低32位相加,并影响标志位,保存进位位相加,并影响标志位,保存进位ADC R5,R1,R3 ; 高高32位相加,并使用标志位位相加,并使用标志位CLDR R0,=result ; R0中保存中保存result的首地址的首地址STR R5,R0 ; 保存结果的高位保

43、存结果的高位STR R6,R0,#4 ; 保存结果的低位保存结果的低位data1 DCD 0 x11223344,0 xFFDDCCBBdata2 DCD 0 x11223344,0 xFFDDCCBBresult DCD 0,0END43微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计例例9.19.1在在RVDSRVDS上的运行结果上的运行结果 44微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计分支结构分支结构 -“if else ”-“if else ”结构结构 45微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计nAREA add64,C

44、ODE,READONLYnENTRYnStart LDR R0, data1 ; R0中保存中保存data1n LDR R1, data2 ; R0中保存中保存data2n CMP R0, R1 ; 比较比较R1和和R0中的值的大小中的值的大小n BHI save ; R0R1则跳转到标号为则跳转到标号为save处处n MOVR0,R1 ; 将将R1的值赋给的值赋给R0nSave STR R0, result ; 将结果保存到将结果保存到resultndata1DCD0 x100ndata2DCD0 x200nresult DCD0nEND 46微处理器系统结构与嵌入式系统设计微处理器系统结构

45、与嵌入式系统设计例例9.39.3在在RVDSRVDS上的运行结果上的运行结果 47微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计分支结构分支结构 -“switch”-“switch”结构结构 48微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计AREA Jump, CODE, READONLY num EQU 2 ; 定义跳转表大小定义跳转表大小 ENTRYstart MOV r0, #1 ; 设置设置3个参数个参数 MOV r1, #3 MOV r2, #2arithfu; 运算运算 CMP r0, #num; 判断判断R0中的参数是否越界中的参数是否越界i

46、nteger BHI Outofrange; 参数超出跳转表范围直接赋值参数超出跳转表范围直接赋值R0=0 xFF ADR r3, JumpTable; 读跳转表首地址读跳转表首地址 LDR pc, r3,r0,LSL#2; 查跳转表,确定跳转地址查跳转表,确定跳转地址JumpTable DCD DoAdd DCD DoSub1 DCD DoSub2DoAdd DoSub1 DoSub2 Outofrange Save END 跳转表跳转表 跳转后执行跳转后执行 49微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计程序跳转示意图程序跳转示意图LDR pc, r3,r0,LSL#

47、2; 查跳转表,确定跳转地址查跳转表,确定跳转地址50微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计例例9.49.4在在RVDSRVDS上的运行结果上的运行结果 51微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计循环结构循环结构 52微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计nAREA Sort,CODE,READONLYn ENTRYnstartn MOV r4,#0n LDR r6,=src ; 设置设置R6保存待排序数组首地址保存待排序数组首地址n ADD r6,r6,#len ; 让让R6保存数组中最后一个地址保存数组中最后一个

48、地址nouter ; 外循环起始外循环起始n LDR r1,=srcninner ; 内循环起始内循环起始n LDR r2,r1nnCMP r1,r6n BLT inner ; 内循环结束内循环结束n ADD r4,r4,#4nnBLE outer ; 外循环结束外循环结束n AREA Array,DATA,READWRITEnsrc DCD 2,4,10,8,14,1,20 ; 初始化待排序数组初始化待排序数组nlen EQU 7*4 ; 初始化数组长度初始化数组长度n END内循环内循环 外循环外循环 53微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计例例9.59.5在在

49、RVDSRVDS上的运行结果上的运行结果 54微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计子程序调用与返回子程序调用与返回 55微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计nN EQU 100 ; 定义定义N的值的值100nAREA Examples,CODE,READONLY ; 声明代码段声明代码段Examples3n ENTRY ; 标识程序入口标识程序入口 n CODE32nARM_CODEn LDR SP,=0X30003F00 ; 设置堆栈指针设置堆栈指针n ADR R0,THUMB_CODE+1 ;n BX R0 ; 跳转并切换处理器状态跳

50、转并切换处理器状态n LTORG ; 声明文字池声明文字池n CODE16nTHUMB_CODEn LDR R0,=N ; 设置子程序设置子程序SUM_N的入口参数的入口参数n BL SUM_N ; 调用子程序调用子程序SUM_Nn B THUMB_CODE nSUM_Nn PUSH R1-R7,LR ; 寄存器入栈保护寄存器入栈保护n MOVS R2,R0 ; 将将N的值复制到的值复制到R2,并影响相应条件标志并影响相应条件标志nnSUN_L1n ADD R0,R1 nn BHS SUM_END nn B SUN_L1nSUM_ERR n MOV R0,#0nSUM_END n MOV R8

51、,R0 ; 将结果保存在将结果保存在R8中中n POP R1-R7,PC ; 寄存器出栈,返回寄存器出栈,返回nEND 初始化设置初始化设置 切换工作状态切换工作状态 调用子程序调用子程序 保存现场和断点保存现场和断点 计算计算1到到N之和之和 恢复现场和断点恢复现场和断点56微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计例例9.69.6在在RVDSRVDS上的运行结果上的运行结果 57微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计ARMARM汇编语言与汇编语言与C/C+C/C+的混合编程的混合编程 n在嵌入式软件开发过程中,通常会使用包括在嵌入式软件开发过

52、程中,通常会使用包括ARM汇编语汇编语言和言和C/C+语言在内的多种语言。一般情况下,一个语言在内的多种语言。一般情况下,一个ARM工程工程(project)应该由多个文件组成,其中包括:应该由多个文件组成,其中包括:u扩展名为扩展名为.s的汇编语言源文件的汇编语言源文件u扩展名为扩展名为.c的的C语言源文件语言源文件u扩展名为扩展名为.cpp的的C+源文件源文件u以及扩展名为以及扩展名为.h的头文件等的头文件等 58微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计ARMARM汇编语言与汇编语言与C/C+C/C+的混合编程的混合编程1 1初始化程序部分初始化程序部分硬件系统的硬

53、件系统的初始化初始化,包括设定,包括设定CPU工作状态,工作状态,中断使能,主频设定,以及中断使能,主频设定,以及RAM的控制参数的控制参数设置及初始化等,通常都使用汇编代码。设置及初始化等,通常都使用汇编代码。2 2初始化部分与主应用程序部分的衔接初始化部分与主应用程序部分的衔接当所有的系统初始化工作完成之后,就需要把程序流程转入到应当所有的系统初始化工作完成之后,就需要把程序流程转入到应用程序。最简单的方法是,在汇编语言程序末尾使用跳转指令用程序。最简单的方法是,在汇编语言程序末尾使用跳转指令B或或BL直接从启动代码转移到直接从启动代码转移到C/C+程序入口。程序入口。3.3.主应用程序的

54、混合编程方式主应用程序的混合编程方式 汇编程序和汇编程序和C/C+程序之间的相互调用(程序之间的相互调用(ATPCS) 在在C/C+代码中嵌入汇编指令代码中嵌入汇编指令59微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计基于基于ARM/ThumbARM/Thumb指令集过程调用的规则指令集过程调用的规则ATPCSATPCS PCS用于保证用于保证使用不同编程语言的使用不同编程语言的子程序子程序可以分开可以分开编编写、写、编译,编译,并成功并成功连接,所以它实际上定义了一套有关过连接,所以它实际上定义了一套有关过程(函数)调用者与被调用者之间的协议。程(函数)调用者与被调用者之间

55、的协议。PCS的制订是的制订是一系列指标的折衷(一系列指标的折衷(tradeoff),如生成代码的大小,),如生成代码的大小,调试功能的支持,函数调用上下文处理速度以及内存消耗。调试功能的支持,函数调用上下文处理速度以及内存消耗。 ARM基本基本的的ATPCS规定了规定了寄存器寄存器使用、使用、数据栈数据栈使用以使用以及及参数参数传递这三方面的基本规则;传递这三方面的基本规则;而派生的其他几种特定而派生的其他几种特定的的ATPCS则则是在是在此此基础上再添加其他规则基础上再添加其他规则(如支持(如支持子程子程序可重入性序可重入性、数据栈数据栈界限界限检查检查等)等)而形成而形成的。的。 在基于

56、在基于ARM的混合编程技术中,的混合编程技术中,C语言子程序只需开语言子程序只需开发者指定发者指定ATPCS类型,而汇编子程序则需完全依靠开发类型,而汇编子程序则需完全依靠开发者来保证。者来保证。60微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计基本基本ATPCS (1)ATPCS (1):寄存器使用规则:寄存器使用规则寄存器寄存器R0R3(A1A4 )用做子程序参数传递。被用做子程序参数传递。被调用的子程序在返回前无需恢复其内容。调用的子程序在返回前无需恢复其内容。寄存器寄存器R4R11(V1V8 )用做子程序内的局部变量用做子程序内的局部变量保存。如有使用则应进行保护和恢

57、复。(保存。如有使用则应进行保护和恢复。(Thumb程序通程序通常只能使用常只能使用R4R7) 寄存器寄存器R12(IP)用作临时用作临时(scratch)指针。指针。 寄存器寄存器R13用作数据栈指针用作数据栈指针SP ,不能用于其他用途。,不能用于其他用途。SP在子程序进入和退出时的值必须相等。在子程序进入和退出时的值必须相等。 寄存器寄存器R14用作连接寄存器用作连接寄存器LR。如果子程序中保存。如果子程序中保存了返回地址,则了返回地址,则R14可用于其他用途。可用于其他用途。 寄存器寄存器R15是程序计数器是程序计数器PC,不能用于其他用途。,不能用于其他用途。61微处理器系统结构与嵌

58、入式系统设计微处理器系统结构与嵌入式系统设计 ATPCS中的寄存器使用规则中的寄存器使用规则寄存器寄存器别名别名用用 法法R0R3A1A4 入口参数入口参数 / 返回值返回值 / 临时临时 (scratch)寄存器)寄存器R4R11V1V8子程序局部变量寄存器,其中:子程序局部变量寄存器,其中: R7/V4也作为也作为Thumb状态工作寄存器状态工作寄存器WR;R9/V6在在支持可读写段位置无关的支持可读写段位置无关的ATPCS中用作静态基址寄存中用作静态基址寄存器器SB;R10/V7/在在支持数据栈检查的支持数据栈检查的ATPCS中为数据栈限制指针中为数据栈限制指针SL;R11/V8/在在支

59、持数据栈检查的支持数据栈检查的ATPCS中为数据帧指针中为数据帧指针FP;R12IP临时(临时(scratch)寄存器,用于过程链接胶合代码中(如连接器)寄存器,用于过程链接胶合代码中(如连接器提供的提供的veneers代码协助实现长跳转时会使用并修改其值)代码协助实现长跳转时会使用并修改其值)R13SP堆栈指针,不能用于其他用途堆栈指针,不能用于其他用途R14LR连接寄存器连接寄存器62微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计基本基本ATPCS (2)ATPCS (2):数据栈使用规则:数据栈使用规则ARM的数据栈可为的数据栈可为FD(Full Descending)

60、,ED(Empty Descending),FA(Full Ascending)或或EA(Empty Ascending) ,但但ATPCS规定数据栈为规定数据栈为FD类型,且类型,且8字节对齐字节对齐的。的。l l 数据栈数据栈指针指针(stack pointer)指向最后入栈的数据单元地址。指向最后入栈的数据单元地址。l l 数据栈数据栈基址基址(stack base)指向数据栈的最高地址。指向数据栈的最高地址。l l 数据栈数据栈界限界限(stack limit)指向数据栈的最低地址。指向数据栈的最低地址。l l 已占用的数据栈已占用的数据栈(used stack)指栈基址和指栈基址和SP之间的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论