1、微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计1 1第九章第九章 ARMARM程序设计程序设计4学时学时微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计第九章第九章 ARMARM程序设计程序设计9.1 ARM程序开发环境程序开发环境(掌握)(掌握)常用常用ARM程序开发环境简介程序开发环境简介RVDS开发环境简介开发环境简介9.2 汇编语言伪指令汇编语言伪指令(掌握)(掌握)符号定义伪指令符号定义伪指令数据定义伪指令数据定义伪指令汇编控制伪指令汇编控制伪指令其他常用伪指令其他常用伪指令汇编语言中常用的符号汇编语言中常用的符号常用的运算符和表达式常用的运算符和表
2、达式2 2微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计第九章第九章 ARMARM程序设计程序设计9.3 ARM汇编语言程序设计汇编语言程序设计(掌握)(掌握)ARM汇编语言程序结构汇编语言程序结构ARM汇编语言程序实例汇编语言程序实例9.4 ARM汇编语言与汇编语言与C/C+的混合编程的混合编程(理解)(理解)C与汇编之间的函数调用与汇编之间的函数调用C/C+语言和汇编语言的混合编程语言和汇编语言的混合编程3 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平台
4、平台uARM-Linux-GCC ,GNU开发的编译器集,依赖于不同的目标机开发的编译器集,依赖于不同的目标机的平台,使用繁琐但不需要授权费用的平台,使用繁琐但不需要授权费用 4 4微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计 RVDSRVDS开发环境简介开发环境简介 n替代替代ADS的新一代开发环境的新一代开发环境n集成编辑、编译及调试于一体集成编辑、编译及调试于一体 n支持软件仿真和硬件调试支持软件仿真和硬件调试 n支持汇编、支持汇编、C和和C+等多种源代码的编译等多种源代码的编译 n目前广泛应用于目前广泛应用于ARM处理器开发处理器开发n包括包括CodeWarrior
5、 IDE集成开发环境和集成开发环境和RVDebugger调试器两部分调试器两部分 5 5微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计CodeWarrior IDECodeWarrior IDE的主窗口的主窗口 6 6微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计RVDRVD调试器主窗口调试器主窗口 7 7微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计汇编语言程序汇编语言程序n计算机硬件只能接收和识别二进制编码形式的机计算机硬件只能接收和识别二进制编码形式的机器指令,器指令,把助记符指令一一翻译成机器指令把助记符指令一一翻译成机器指令,并,
6、并且在翻译的过程中还要完成且在翻译的过程中还要完成程序区地址程序区地址、数据区数据区地址地址和和转移目标地址转移目标地址的的安排安排以及文件的连接等工以及文件的连接等工作,最后才能把程序以机器码的形式输入计算机作,最后才能把程序以机器码的形式输入计算机去运行。上述这些工作称为去运行。上述这些工作称为汇编汇编。 n专门用来进行汇编的软件称为专门用来进行汇编的软件称为汇编器汇编器。n用于用于指导汇编器指导汇编器进行进行汇编工作的指令汇编工作的指令,由于这些,由于这些指令不形成机器码指令,只是在汇编器进行汇编指令不形成机器码指令,只是在汇编器进行汇编工作的过程中起作用,所以称其为工作的过程中起作用,
7、所以称其为伪指令伪指令。 8 8微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计汇编语言程序汇编语言程序n伪指令、宏指令和前面学过的助记符指令,再加伪指令、宏指令和前面学过的助记符指令,再加上相应的语言规范,就形成了一种新的程序设计上相应的语言规范,就形成了一种新的程序设计语言语言汇编语言汇编语言(Assembly Language)(Assembly Language) n用汇编语言编写的程序就称为汇编语言用汇编语言编写的程序就称为汇编语言源程序源程序,而自源程序翻译成的机器码程序就称为而自源程序翻译成的机器码程序就称为目标程序目标程序n目标程序还要经过系统的链接定位后才能生
8、成真正的目标程序还要经过系统的链接定位后才能生成真正的可执可执行文件行文件(.EXE.EXE文件)。汇编的一般步骤:文件)。汇编的一般步骤:u编辑得到源程序编辑得到源程序u汇编得到目标代码(解决语法错误)汇编得到目标代码(解决语法错误)u链接得到可执行文件(解决定位错误)链接得到可执行文件(解决定位错误) u调试得到功能正确的应用软件(解决逻辑错误)调试得到功能正确的应用软件(解决逻辑错误)9 9微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计汇编语言程序设计特点汇编语言程序设计特点n汇编语言汇编语言依赖于机器硬件依赖于机器硬件,不同,不同CPU提供的汇编提供的汇编指令可能有很
9、大的不同,汇编源程序指令可能有很大的不同,汇编源程序几乎不具有几乎不具有可移植性可移植性;n汇编语言汇编语言比机器语言易于读写、调试和修改比机器语言易于读写、调试和修改;n具有机器语言执行具有机器语言执行速度快、效率高、占内存空间速度快、效率高、占内存空间少少等优点等优点n在编写复杂程序时,在编写复杂程序时,相对高级语言而言代码量较相对高级语言而言代码量较大大;汇编语言源程序汇编语言源程序机器语言程序机器语言程序(目标代码)(目标代码)汇编(汇编程序)汇编(汇编程序)高级语言源程序高级语言源程序编译或解释(编译程序)编译或解释(编译程序)1010微处理器系统结构与嵌入式系统设计微处理器系统结构
10、与嵌入式系统设计9.2 9.2 符号定义伪指令符号定义伪指令 11 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,
13、赋值为,赋值为Testing“ Test3 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指令可通过该名称访问
14、寄存器列表指令可通过该名称访问寄存器列表1212微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计数据定义伪指令数据定义伪指令 数 据数 据定义定义伪 指伪 指令令LTORG指示汇编器指示汇编器汇编当前文字池汇编当前文字池 或或MAP置置存储映射存储映射的起点的起点到一个特定的地址到一个特定的地址# 或或FIELD描述指示符所定义的存储映射中的空间描述指示符所定义的存储映射中的空间% 或或SPACE定义一块定义一块值为值为0的存储器区域的存储器区域= 或或DBC分配一个或多个分配一个或多个字节字节& 或或DCD分配一个或多个分配一个或多个字,字,从从4字节边界字节边界开始开始DC
15、DU分配一个或多个分配一个或多个字字,但,但不一定从不一定从4字节边界字节边界开始开始DCDO分配以分配以字边界开始的存储区域字边界开始的存储区域,并指定初始值为到静态基址寄存器,并指定初始值为到静态基址寄存器的偏移的偏移DCFD分配给分配给双精度浮点数双精度浮点数一段一段以字边界以字边界开始的内存区域开始的内存区域DCFDU分配给分配给双精度浮点数双精度浮点数一段以一段以任意边界任意边界开始的内存区域开始的内存区域DCFS分配给分配给单精度浮点数单精度浮点数一段以一段以字边界字边界开始的内存区域开始的内存区域DCFSU分配给分配给单精度浮点数单精度浮点数一段以一段以任意边界任意边界开始的内存
16、区域开始的内存区域DCI分配以分配以字边界开始字边界开始的存储区域,并的存储区域,并指定初始值指定初始值。标记此地址存储的。标记此地址存储的是代码而不是数据是代码而不是数据DCQ分配给分配给双精度浮点数双精度浮点数一段以一段以4字节边界字节边界开始的内存区域开始的内存区域DCQU分配给分配给双精度浮点数双精度浮点数一段以一段以任意边界任意边界开始的内存区域开始的内存区域DCW分配给一个或多个分配给一个或多个半字半字以以半字边界半字边界开始的内存区域开始的内存区域DCWU分配给一个或多个分配给一个或多个半字半字以以任意边界任意边界开始的内存区域开始的内存区域DATA标识一个标识一个标号是代码段中
17、数据的标号标号是代码段中数据的标号,该符号后是,该符号后是DCBDCB或或DCDDCD1313微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计数据定义伪指令1414Str 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
19、+R0 画出存储单元分配示意图并且填写内容?各个变量起始地址值?画出存储单元分配示意图并且填写内容?各个变量起始地址值?微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计数据定义伪指令1515下面的伪操作序列下面的伪操作序列定义一个内存表定义一个内存表,其,其首地址为首地址为固定地址固定地址4096(0 x1000),该内,该内存表中包含存表中包含5个数据字段:个数据字段:A长度为长度为4个字节;个字节;B长度为长度为4个字节;个字节;X长度为长度为8个个字节;字节;Y长度为长度为8个字节;个字节;String长度为长度为256个字节。这种内存表称为基于绝对个字节。这种内存表称为
20、基于绝对地址的内存表。地址的内存表。MAP 0 x1000; 内存表首地址的值为内存表首地址的值为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
22、 FIELD 4 4; ; 定义定义B B的长度为的长度为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
23、 初始化初始化R9 R9 LDR LDR R5, B 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
24、; ; 定义定义A A的长度为的长度为4 4字节,相对位置为字节,相对位置为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 LD
25、R R5, B R5, B ; ; 相当于相当于LDR R5, PC, #4LDR R5, PC, #4基于基于PCPC的的内存表内存表可访问地址范围不可访问地址范围不超过超过4 KB4 KB的数据的数据1616微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计汇编控制伪指令汇编控制伪指令 GBLA Counter ; 声明全局的数字变量声明全局的数字变量Counter Counter SETA 3; 由变量由变量Counter控制循环次数控制循环次数WHILE Counter YX大于YX = YX大于等于YX = YX小于等于YX /= YX不等于YX YX不等于YX:LAN
26、D:Y逻辑与X:LOR:Y逻辑或:LNOT:Y逻辑非X:LEOR:Y逻辑异或注意:这些运算在汇注意:这些运算在汇编过程中计算,机器编过程中计算,机器码中出现的已经是表码中出现的已经是表达式的值了。达式的值了。3232微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计字符串表达式及运算符字符串表达式及运算符 字符串表达式一般由字符串表达式一般由字符串常量、字符串变量、运算符和括号字符串常量、字符串变量、运算符和括号构成。编构成。编译器支持的字符串最大长度为译器支持的字符串最大长度为512512字节字节。 LEN:XLEN:X 返回字符串返回字符串X X的长度的长度( (字符数字符数
27、) )。 CHR:MCHR:M 将将02550255之间的整数之间的整数M M转换为一个字符。转换为一个字符。 STR:XSTR:X 将数字或逻辑表达式将数字或逻辑表达式X X转换为一个字符串。转换为一个字符串。对于数字表达式,对于数字表达式,STRSTR运算得到一个以十六进制字符组成的字符串;运算得到一个以十六进制字符组成的字符串;对于逻辑表达式,对于逻辑表达式,STRSTR运算得到字符串运算得到字符串“T T”或或“F F”。 X:LEFT:Y X:LEFT:Y 返回字符串返回字符串X X左端的一个子串。整数左端的一个子串。整数Y Y表示要返回的字符个数表示要返回的字符个数。 X:RIGH
28、T:YX:RIGHT:Y 返回字符串返回字符串X X右端的一个子串。整数右端的一个子串。整数Y Y表示要返回的字符个数表示要返回的字符个数 X:CC:YX:CC:Y 将字符串将字符串Y Y连接到字符串连接到字符串X X的后面形成一个新字符串。的后面形成一个新字符串。3333微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计其它常用运算符其它常用运算符 ?X?X返回定义符号返回定义符号X X的代码行所生成的可执行代码的长度(字的代码行所生成的可执行代码的长度(字节数)节数) :DEF:X:DEF:X 判断是否定义了符号判断是否定义了符号X X:如果符号:如果符号X X已经定义则结果
29、为真,已经定义则结果为真,否则为假。否则为假。 BASE:X BASE:X 返回基于寄存器的表达式返回基于寄存器的表达式X X中寄存器的编号。中寄存器的编号。 INDEX:XINDEX:X 返回基于寄存器的表达式返回基于寄存器的表达式X X中相对于其基址寄存器的偏移中相对于其基址寄存器的偏移量。量。 3434微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计ARMARM汇编语言程序结构汇编语言程序结构 ARM(Thumb)ARM(Thumb)汇编语言程序中,以汇编语言程序中,以程序段(代码段和数据段)程序段(代码段和数据段)为单位组织代码。为单位组织代码。 一个汇编程序至少应该有
30、一个代码段。当程序较长时,可以一个汇编程序至少应该有一个代码段。当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译连接时最终形分割为多个代码段和数据段,多个段在程序编译连接时最终形成一个可执行的映象文件。成一个可执行的映象文件。可执行映象文件可执行映象文件通常由以下几部分构成:通常由以下几部分构成: l l 一个一个或多个代码段,代码段的属性默认为或多个代码段,代码段的属性默认为READONLYREADONLY。 l l 零个或多个包含初始化数据的数据段,数据段的属性默认为零个或多个包含初始化数据的数据段,数据段的属性默认为READWRITEREADWRITE。 l l 零个或多个不
31、包含初始化数据的数据段,数据段的属性为默认为零个或多个不包含初始化数据的数据段,数据段的属性为默认为READWRITEREADWRITE。3535微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计ARMARM汇编语言程序结构示例汇编语言程序结构示例nGET option.snGET addr.sn nAREA Init,CODE,READONLYn ENTRYn sprn MULr1,r0,r0 nAREAData1,DATA,READWRITEn num DCD10n nEND引用其它源文件引用其它源文件代码段代码段数据段数据段 定义代码段定义代码段 指定程序入口指定程序入口
32、程序主体程序主体3636微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计ARM(Thumb)汇编语句格式汇编语句格式 标号标号 指令或伪指令指令或伪指令; 注释注释 助记符可以全部用大写字母或全部用小写字母,助记符可以全部用大写字母或全部用小写字母,但不允许在一条指令中大小写字母混用。但不允许在一条指令中大小写字母混用。 如果一条语句太长,可将该长语句分为若干行如果一条语句太长,可将该长语句分为若干行来书写,在行的末尾用来书写,在行的末尾用“”表示下一行与本行为表示下一行与本行为同一条语句。同一条语句。 指令中可以出现常量、变量及表达式。指令中可以出现常量、变量及表达式。微处理
33、器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计 AREA Init, 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伪指令,指示汇编的结束伪指令,指示汇编的结束伪指令伪指令
34、LDR对于不能被对于不能被MOV和和MVN指令所读取的立即数指令所读取的立即数,将其变将其变成常量进行读取。成常量进行读取。存储单存储单元地址元地址标号标号STARTSTART代表第一条指令的存放地址代表第一条指令的存放地址微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计 AREA Block, CODE, READONLYnum EQU 20 ; 设置将要复制的字数设置将要复制的字数 ENTRY Start LDR R0, =src ; R0指向源数据区指向源数据区src LDR R1, =dst ; R1指向目标数据区指向目标数据区dst MOV R2, #num ; R2
35、保存将要复制的字数保存将要复制的字数 MOV SP, #0 x400 ; 设置堆栈指针设置堆栈指针(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个寄存器中个寄存器中 ST
36、MIA R1!, R4-R11 ; 将将8个寄存器中的数据写入目标数据区中个寄存器中的数据写入目标数据区中 SUBS R3, R3, #1 ; 将块复制次数减将块复制次数减1 BNE Octcopy ; 循环操作,直到完成以循环操作,直到完成以8个字为单位的块复制个字为单位的块复制 LDMFD SP!, R4-R11 ; 从堆栈弹出恢复工作寄存器从堆栈弹出恢复工作寄存器R4-R11Copywords ANDS R2, R2, #7 ; 剩下不足剩下不足8个字的数据的字数个字的数据的字数 BEQ Stop ; 如果剩下数据的字数为如果剩下数据的字数为0,则数据复制完成,则数据复制完成Wordco
37、py LDR R3, R0, #4 ; 从源数据区读取从源数据区读取1个字的数据,放到个字的数据,放到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
38、 ; 定义数据区定义数据区BlockDatasrc DCD 1, 2, 3, 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字的块传送?最字的块传送?最大的字块可以多大?可否以单大的字块可以多大?可否以单字?多大字块最优?为什么?字?多大字块最优?为什么?微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式
39、系统设计; ;文件名:文件名:TEST1.STEST1.S ; ;功能:实现两个寄存器相加功能:实现两个寄存器相加 ; ;说明:使用说明:使用ARMulateARMulate软件仿真调试软件仿真调试 AREAAREA Example1,CODE,READONLY;Example1,CODE,READONLY;声明代码段声明代码段Example1 Example1 ENTRYENTRY ; ;标识程序入口标识程序入口 CODE32CODE32 ; ;声明声明3232位位ARMARM指令指令START MOVSTART MOVR0,#0R0,#0 ; ;设置参数设置参数 MOVMOVR1,#10R
40、1,#10LOOPLOOP BL BLADD_SUBADD_SUB ; ;调用子程序调用子程序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重点介绍如何用重
41、点介绍如何用ARM汇编语言实现汇编语言实现:u顺序结构顺序结构u分支结构分支结构u循环结构循环结构u子程序调用与返回子程序调用与返回 4141微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计顺序结构顺序结构 - - 两个两个6464位数相加位数相加 4242微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计AREA add64,CODE,READONLYENTRYStart LDR R0, =data1 ; R0中保存中保存data1的首地址的首地址LDR R1, R0 ; 用寄存器间接寻址方式读数据用寄存器间接寻址方式读数据1的高的高32位到位到R1LDR R2
42、,R0,#4 ; 用寄存器间接寻址方式读数据用寄存器间接寻址方式读数据1的低的低32位到位到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 ; R
43、0中保存中保存result的首地址的首地址STR R5,R0 ; 保存结果的高位保存结果的高位STR R6,R0,#4 ; 保存结果的低位保存结果的低位data1 DCD 0 x11223344,0 xFFDDCCBBdata2 DCD 0 x11223344,0 xFFDDCCBBresult DCD 0,0END4343微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计例例9.19.1在在RVDSRVDS上的运行结果上的运行结果 4444微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计分支结构分支结构 - -“if else ”“if else ”结构结构 4
44、545微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计nAREA add64,CODE,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
45、 x200nresult DCD0nEND 4646微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计例例9.39.3在在RVDSRVDS上的运行结果上的运行结果 4747微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计分支结构分支结构 - -“switch”switch”结构结构 4848微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计AREA Jump, CODE, READONLY num EQU 2 ; 定义跳转表大小定义跳转表大小 ENTRYstart MOV r0, #1 ; 设置设置3个参数个参数 MOV r1, #3 MOV r2,
46、 #2arithfu; 运算运算 CMP r0, #num; 判断判断R0中的参数是否越界中的参数是否越界integer 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 跳转表跳转表 跳转后执行跳转后执行 4949微处理器系统结构
47、与嵌入式系统设计微处理器系统结构与嵌入式系统设计程序跳转示意图程序跳转示意图LDR pc, r3,r0,LSL#2; 查跳转表,确定跳转地址查跳转表,确定跳转地址5050微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计例例9.49.4在在RVDSRVDS上的运行结果上的运行结果 5151微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计循环结构循环结构 5252微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计nAREA Sort,CODE,READONLYn ENTRYnstartn MOV r4,#0n LDR r6,=src ; 设置设置R6保
48、存待排序数组首地址保存待排序数组首地址n ADD r6,r6,#len ; 让让R6保存数组中最后一个地址保存数组中最后一个地址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
49、 END内循环内循环 外循环外循环 5353微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计例例9.59.5在在RVDSRVDS上的运行结果上的运行结果 5454微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计子程序调用与返回子程序调用与返回 5555微处理器系统结构与嵌入式系统设计微处理器系统结构与嵌入式系统设计nN EQU 100 ; 定义定义N的值的值100nAREA Examples,CODE,READONLY ; 声明代码段声明代码段Examples3n ENTRY ; 标识程序入口标识程序入口 n CODE32nARM_CODEn LDR SP,=0
50、X30003F00 ; 设置堆栈指针设置堆栈指针n ADR R0,THUMB_CODE+1 ;n BX R0 ; 跳转并切换处理器状态跳转并切换处理器状态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 R