版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第九第九章章(4)ARM程序程序设计设计9.1 ARM程序开发环境程序开发环境(掌握)(掌握)常用常用ARM程序开发环境简介程序开发环境简介RVDS开发环境简介开发环境简介9.2 汇编语言伪指令(掌握)汇编语言伪指令(掌握)符号定义伪指令符号定义伪指令数据定义伪指令数据定义伪指令汇编控制伪指令汇编控制伪指令其他常用伪指令其他常用伪指令汇编语言中常用的符号汇编语言中常用的符号常用的运算符和表达式常用的运算符和表达式9.3 ARM汇编语言程序设计(掌握)汇编语言程序设计(掌握)ARM汇编语言程序结构汇编语言程序结构ARM汇编语言程序实例汇编语言程序实例9.4 ARM汇编语言与汇编语言与C/C+的混
2、合编程的混合编程(理解)(理解)C与汇编之间的函数调用与汇编之间的函数调用C/C+语言和汇编语言的混合编程语言和汇编语言的混合编程ARM常用开发环境常用开发环境l主要分为基于主要分为基于Windows平台的和基于平台的和基于Linux平台的两大类平台的两大类 l基于基于Windows平台平台ADS ,目前已经基本被替代,目前已经基本被替代RealView Developer Suite(RVDS) ,目前主流工具,目前主流工具Embedded Workbench for ARM(EWARM) ,IAR System公司,入门简单,授权费用高公司,入门简单,授权费用高RealView Micro
3、controller Development Kit(MDK) ,源自德国,源自德国Keil公司,多用于低端公司,多用于低端ARM处理器开发处理器开发l基于基于Linux平台平台ARM-Linux-GCC ,GNU开发的编译器集,依赖于不开发的编译器集,依赖于不同的目标机的平台,使用繁琐但不需要授权费用同的目标机的平台,使用繁琐但不需要授权费用 RVDS开发环境简介开发环境简介 l替代替代ADS的新一代开发环境的新一代开发环境l集程序的编辑、编译及调试于一体集程序的编辑、编译及调试于一体 l支持软件仿真和硬件调试支持软件仿真和硬件调试 l持汇编、持汇编、C和和C+等多种源代码的编译等多种源代码
4、的编译 l目前广泛的应用于目前广泛的应用于ARM处理器开发处理器开发l包括包括CodeWarrior IDE集成开发环境和集成开发环境和RVDebugger调试器两部分调试器两部分 CodeWarrior IDE的主窗口的主窗口 RVD调试器主窗口调试器主窗口 汇编语言程序设计特点汇编语言程序设计特点l汇编语言依赖于机器硬件,不同汇编语言依赖于机器硬件,不同CPU提供的汇编指令可能有很提供的汇编指令可能有很大的不同,因此汇编源程序几乎不具有移植性;但汇编语言程大的不同,因此汇编源程序几乎不具有移植性;但汇编语言程序速度快、效率高,更能发挥机器硬件的长处;序速度快、效率高,更能发挥机器硬件的长处
5、;2. 汇编程序需要用户将汇编过程中需要的一些信息明确地写入源程汇编程序需要用户将汇编过程中需要的一些信息明确地写入源程序,如:内存逻辑段的划分情况、数据在内存中的存放情况,序,如:内存逻辑段的划分情况、数据在内存中的存放情况,等等。这些信息的说明由汇编程序指定相应的等等。这些信息的说明由汇编程序指定相应的伪指令伪指令来完成,来完成,并不由并不由CPU定义;定义;3. 伪指令伪指令 是在汇编过程中执行的,因而不会在机器语言程序中产生是在汇编过程中执行的,因而不会在机器语言程序中产生目标代码;只有目标代码;只有CPU定义的定义的(助记符)指令(助记符)指令才会生成目标代码,才会生成目标代码,并在
6、程序运行过程中执行;并在程序运行过程中执行;汇编语言源程序汇编语言源程序机器语言程序机器语言程序(目标代码)(目标代码)汇编(汇编程序)汇编(汇编程序)高级语言源程序高级语言源程序编译或解释(编译程序)编译或解释(编译程序)8/524. 4. 源程序经汇编得到的目标代码实际上也是不能运行源程序经汇编得到的目标代码实际上也是不能运行的,还要经过系统的链接定位后才能生成真正的的,还要经过系统的链接定位后才能生成真正的可执行可执行文件(文件(.EXE.EXE文件)。即一般用汇编语言开发文件)。即一般用汇编语言开发 应用软件时应应用软件时应依次依次 完成以下几个步骤:完成以下几个步骤:(1 1)编辑得
7、到源程序)编辑得到源程序(2 2)汇编得到目标代码(解决语法错误)汇编得到目标代码(解决语法错误)(3 3)链接得到可执行文件(解决定位错误)链接得到可执行文件(解决定位错误) (4 4)调试得到功能正确的应用软件(解决逻辑错误)调试得到功能正确的应用软件(解决逻辑错误)(以上第(以上第2 24 4步任何一步有错都应返回到第步任何一步有错都应返回到第1 1步重来)步重来)9/52符号定义伪指令符号定义伪指令 符号类型符号类型指示符指示符功能功能符号定义符号定义伪指令伪指令GBLA声明和初始化一个声明和初始化一个全局全局算术变量,初始值为算术变量,初始值为0GBLL声明和初始化一个全局逻辑变量,
8、初始值为声明和初始化一个全局逻辑变量,初始值为FALSEGBLS声明和初始化一个全局字符串变量,初始值为空声明和初始化一个全局字符串变量,初始值为空LCLA声明和初始化一个声明和初始化一个局部局部算术变量,初始值为算术变量,初始值为0。局部算术变量只。局部算术变量只能在宏中进行声明。能在宏中进行声明。LCLL声明和初始化一个局部逻辑变量,初始值为声明和初始化一个局部逻辑变量,初始值为FALSE。局部逻辑变。局部逻辑变量只能在宏中进行声明。量只能在宏中进行声明。LCLS声明和初始化一个局部字符串变量,初始值为空。局部字符串变声明和初始化一个局部字符串变量,初始值为空。局部字符串变量只能在宏中进行
9、声明。量只能在宏中进行声明。SETA给一个局部或全局算术变量给一个局部或全局算术变量置值置值SETL给一个局部或全局逻辑变量置值给一个局部或全局逻辑变量置值SETS给一个局部或全局字符串变量置值给一个局部或全局字符串变量置值RLIST给寄存器集给寄存器集命名命名CN给一个协处理器寄存器命名给一个协处理器寄存器命名CP给一个特定协处理器命名,协处理器号为给一个特定协处理器命名,协处理器号为015DN给一个双精度给一个双精度VFP寄存器命名寄存器命名SN给一个单精度给一个单精度VFP寄存器命名寄存器命名FN给一个特定的浮点寄存器命名给一个特定的浮点寄存器命名*10/52GBLA Test1;声明全
10、局数字变量声明全局数字变量Test1,赋值为,赋值为0 xaa Test1 SETA 0 xaaGBLL Test2;声明全局逻辑变量声明全局逻辑变量Test2,赋值为,赋值为“真真” Test2 SETL TRUEGBLS Test3;声明全局字符串变量为声明全局字符串变量为Test3,赋值为,赋值为Testing“ Test3 SETS Testing“LCLA Test4; 声明局部数字变量声明局部数字变量Test4,赋值为,赋值为0 xaa Test3 SETA 0 xaaLCLL Test5; 声明局部逻辑变量声明局部逻辑变量Test5 ,赋值为,赋值为“真真” Test4 SETL
11、 TRUELCLS Test6;声明局部字符串变量声明局部字符串变量Test6 ,赋值为,赋值为Testing“ Test6 SETS Testing“RegList RLIST R0-R5, R8, R10; 声明寄存器列表声明寄存器列表RegList,LDM/STM指令可通过该名称访问寄存器列表指令可通过该名称访问寄存器列表*11/52数据定义伪指令数据定义伪指令 数据定义数据定义伪指令伪指令LTORG指定指定一个文字池用以保存数据一个文字池用以保存数据 或或MAP指定一个内存表的首址指定一个内存表的首址# 或或FIELD指定内存表中的各数据域的长度(一般在指定内存表中的各数据域的长度(一
12、般在MAP之后)之后)% 或或SPACE指定一块存储器的长度并将其中单元初始化为指定一块存储器的长度并将其中单元初始化为0= 或或DCB分配分配一片连续的字节单元并一片连续的字节单元并初始化初始化分配一片连续的字节单元并用于存放代码分配一片连续的字节单元并用于存放代码& 或或DCD分配一片连续的字单元并初始化(字边界对齐)分配一片连续的字单元并初始化(字边界对齐)DCDU分配一片连续的字单元并初始化(任意边界)分配一片连续的字单元并初始化(任意边界)DCDO分配一片连续的分配一片连续的字单元字单元,并初始化为到静态基址寄存器,并初始化为到静态基址寄存器R9R9的偏移量的偏移量(字边界对齐)(字
13、边界对齐)DCFD分配一片连续的字单元给双精度浮点数并初始化(字边界对齐)分配一片连续的字单元给双精度浮点数并初始化(字边界对齐)分配一片连续的字单元给单精度浮点数并初始化(字边界对齐)分配一片连续的字单元给单精度浮点数并初始化(字边界对齐)DCFDU分配一片连续的字单元给双精度浮点数并初始化(任意边界)分配一片连续的字单元给双精度浮点数并初始化(任意边界)分配一片连续的字单元给单精度浮点数并初始化(任意边界)分配一片连续的字单元给单精度浮点数并初始化(任意边界)DCFSDCFSUDCIDCQ分配一片连续的分配一片连续的8字节单元并初始化(字边界对齐)字节单元并初始化(字边界对齐)DCQU分配
14、一片连续的分配一片连续的8字节单元并初始化(任意边界)字节单元并初始化(任意边界)DCW分配一片连续的半字单元并初始化(半字边界对齐)分配一片连续的半字单元并初始化(半字边界对齐)DCWU分配分配一片连续的半字单元并初始化(任意边界)一片连续的半字单元并初始化(任意边界)DATA标识标识代码段中的数据标号,该符号后是代码段中的数据标号,该符号后是DCBDCB等等*Str DCB “This is a test!”; ; 分配一片连续的分配一片连续的字节字节存储单元并初始化存储单元并初始化Test2Data DCW 1, 2, 3; ; 分配一片连续的分配一片连续的半字半字存储单元并初始化存储单
15、元并初始化DataTest DCD 4, 5, 6; ; 分配一片连续的分配一片连续的字字存储单元并初始化存储单元并初始化FdataTest DCFD 2E115, -5E7; ; 分配一片连续的分配一片连续的字字存储单元并初始化存储单元并初始化FdataTest DCFS 2E5, -5E-7; ; 分配一片连续的分配一片连续的字字存储单元并初始化存储单元并初始化DataTest DCQ 100; ; 分配一片连续的分配一片连续的8 8字节字节存储单元并初始化存储单元并初始化DataSpace SPACE 100; ; 分配连续分配连续100100个字节个字节存储单元并初始化为存储单元并初始
16、化为0 0 定义一个首址为定义一个首址为4096(0 x1000)4096(0 x1000)的内存表,该表中包含的内存表,该表中包含5 5个字段:个字段:A(4Bytes)A(4Bytes)、B(4Bytes)B(4Bytes)、X(8Bytes)X(8Bytes)、Y(8Bytes)Y(8Bytes)、String(256Bytes)String(256Bytes)。 MAP 0 x1000; ; 内存表首地址的值为内存表首地址的值为0 x10000 x1000A FIELD 4; ; 定义定义A A的长度为的长度为4 4字节,位置为字节,位置为0 x10000 x1000B FIELD 4
17、 4; ; 定义定义B B的长度为的长度为4 4字节,位置为字节,位置为0 x10040 x1004X FIELD 8; ; 定义定义X X的长度为的长度为8 8字节,位置为字节,位置为0 x10080 x1008Y FIELD 8; ; 定义定义Y Y的长度为的长度为8 8字节,位置为字节,位置为0 x10100 x1010String FIELD 256; ; 定义定义StringString为为256256字节,位置为字节,位置为0 x10180 x1018LDR R6, A R6, A 基于绝对地基于绝对地址的内存表址的内存表仅可访问指令前仅可访问指令前/ /后后4KB4KB地址范围的
18、数据字段地址范围的数据字段双精度双精度单精度单精度定义一个内存表,其首址为固定地址与定义一个内存表,其首址为固定地址与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的长度为的长度为4 4字节,相对位置为字节,相对位置为4 4X X FIELD FIELD 8 8; ; 定义定义X X的长度为
19、的长度为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 R5, B ; ; 相当于相当于LDR R5, R9, #4LDR R5, R9, #4可访问地址范围可访问地址范围
20、超过超过4 KB4 KB的数据的数据基于相对地基于相对地址的内存表址的内存表定义一个内存表,其首址为定义一个内存表,其首址为PCPC的值,表中包含同样字段。的值,表中包含同样字段。Dstruc Dstruc SPACE SPACE 280280; ; 分配分配280280个字节单元个字节单元MAP MAP Dstruc Dstruc ; ; 内存表首地址为内存表首地址为DstrucDstrucA A FIELDFIELD4 4; ; 定义定义A A的长度为的长度为4 4字节,相对位置为字节,相对位置为0 0B B FIELDFIELD4 4; ; 定义定义B B的长度为的长度为4 4字节,相对
21、位置为字节,相对位置为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 ; ; 相当于相当于LDR R5, PC, #4LDR R5, PC, #4基于基于PCPC的的内存表内存表可访问地址范围不可访问地址范围不超
22、过超过4 KB4 KB的数据的数据汇编控制伪指令汇编控制伪指令 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:LEOR:Y逻辑异或逻辑异或30/52注意:这些运算在汇注意:这些运算在汇编过程中计算,机器编过程中计算,机器码中出现的已经是表码中出现
23、的已经是表达式的值了。达式的值了。字符串表达式及运算符字符串表达式及运算符 字符串表达式一般由字符串表达式一般由字符串常量、字符串变量、运算符和括号字符串常量、字符串变量、运算符和括号构成。编构成。编译器支持的字符串最大长度为译器支持的字符串最大长度为512512字节字节。 LEN:XLEN:X 返回字符串返回字符串X X的长度的长度( (字符数字符数) )。 CHR:MCHR:M 将将02550255之间的整数之间的整数M M转换为一个字符。转换为一个字符。 STR:X STR:X 将数字或逻辑表达式将数字或逻辑表达式X X转换为一个字符串。转换为一个字符串。对于数字表达式,对于数字表达式,
24、STRSTR运算得到一个以十六进制字符组成的字符串;运算得到一个以十六进制字符组成的字符串;对于逻辑表达式,对于逻辑表达式,STRSTR运算得到字符串运算得到字符串“T T”或或“F F”。 X:LEFT:Y X:LEFT:Y 返回字符串返回字符串X X左端的一个子串。整数左端的一个子串。整数Y Y表示要返回的字符个数表示要返回的字符个数。 X:RIGHT:YX:RIGHT:Y 返回字符串返回字符串X X右端的一个子串。整数右端的一个子串。整数Y Y表示要返回的字符个数表示要返回的字符个数 X:CC:Y X:CC:Y 将字符串将字符串Y Y连接到字符串连接到字符串X X的后面形成一个新字符串。
25、的后面形成一个新字符串。*31/52其它常用运算符其它常用运算符 ?X?X返回定义符号返回定义符号X X的代码行所生成的可执行代码的长度(字的代码行所生成的可执行代码的长度(字节数)节数) :DEF:X:DEF:X 判断是否定义了符号判断是否定义了符号X X:如果符号:如果符号X X已经定义则结果为真,已经定义则结果为真,否则为假。否则为假。 BASE:X BASE:X 返回基于寄存器的表达式返回基于寄存器的表达式X X中寄存器的编号。中寄存器的编号。 INDEX:XINDEX:X 返回基于寄存器的表达式返回基于寄存器的表达式X X中相对于其基址寄存器的偏移中相对于其基址寄存器的偏移量。量。
26、*32/52ARM汇编语言程序结构汇编语言程序结构 ARM(Thumb)ARM(Thumb)汇编语言程序中,以汇编语言程序中,以程序段(代码段和数据段)程序段(代码段和数据段)为单位组织代码。为单位组织代码。 一个汇编程序至少应该有一个代码段。当程序较长时,可以一个汇编程序至少应该有一个代码段。当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译连接时最终形分割为多个代码段和数据段,多个段在程序编译连接时最终形成一个可执行的映象文件。成一个可执行的映象文件。可执行映象文件可执行映象文件通常由以下几部分构成:通常由以下几部分构成: l l 一个一个或多个代码段,代码段的属性默认为或多个代
27、码段,代码段的属性默认为READONLYREADONLY。 l l 零个或多个包含初始化数据的数据段,数据段的属性默认为零个或多个包含初始化数据的数据段,数据段的属性默认为READWRITEREADWRITE。 l l 零个或多个不包含初始化数据的数据段,数据段的属性为默认为零个或多个不包含初始化数据的数据段,数据段的属性为默认为READWRITEREADWRITE。*33/52ARM汇编语言程序结构示例汇编语言程序结构示例lGET option.slGET addr.sl lAREA Init,CODE,READONLYl ENTRYl sprl MULr1,r0,r0 lAREAData1
28、,DATA,READWRITEl numDCD10l lEND引用其它源文件引用其它源文件代码段数据段 定义代码段 指定程序入口 程序主体ARM汇编程序设计实例汇编程序设计实例 l重点介绍如何用重点介绍如何用ARM汇编语言实现:汇编语言实现:顺序结构顺序结构分支结构分支结构循环结构循环结构子程序调用与返回子程序调用与返回 顺序结构顺序结构 - 两个两个64位数相加位数相加 lAREA add64,CODE,READONLYlENTRYlstart LDRR0, =data1 ; R0中保存中保存data1的首地址的首地址lLDRR1, R0 ; 用寄存器间接寻址方式读数据用寄存器间接寻址方式读
29、数据1的高的高32位到位到R1lLDRR2,R0,#4 ; 用寄存器间接寻址方式读数据用寄存器间接寻址方式读数据1的低的低32位到位到R2lLDRR0, =data2 ; R0中保存中保存data2的首地址的首地址lLDRR3, R0 ; 用寄存器间接寻址方式读数据用寄存器间接寻址方式读数据2的高的高32位到位到R3lLDRR4,R0,#4 ; 用寄存器间接寻址方式读数据用寄存器间接寻址方式读数据1的低的低32位到位到R4lADDSR6,R2,R4 ; 低低32位相加,并影响标志位,保存进位位相加,并影响标志位,保存进位lADCR5,R1,R3 ; 高高32位相加,并使用标志位位相加,并使用标
30、志位ClLDRR0,=result ; R0中保存中保存result的首地址的首地址lSTRR5,R0 ; 保存结果的高位保存结果的高位lSTRR6,R0,#4 ; 保存结果的低位保存结果的低位ldata1DCD0 x11223344,0 xFFDDCCBBldata2DCD0 x11223344,0 xFFDDCCBBlresult DCD 0,0lEND例例9.1在在RVDS上的运行结果上的运行结果 分支结构分支结构 -“if else ”结构结构 lAREA add64,CODE,READONLYlENTRYlStart LDR R0, data1 ; R0中保存中保存data1l LD
31、R R1, data2 ; R1中保存中保存data2l CMP R0, R1 ; 比较比较R1和和R0中的值的大小中的值的大小l BHI save ; R0R1则跳转到标号为则跳转到标号为save处处l MOV R0,R1; 将将R1的值赋给的值赋给R0lSave STRR0, result ; 将结果保存到将结果保存到resultlData1 DCD0 x100lData2 DCD0 x200lResult DCD0lEND 例例9.3在在RVDS上的运行结果上的运行结果 分支结构分支结构 -“switch”结构结构 lAREA Jump, CODE, READONLY lnum EQU
32、2 ; 定义跳转表大小定义跳转表大小l ENTRYlstartl MOV r0, #1 ; 设置设置3个参数个参数l MOV r1, #3l MOV r2, #2larithfu; 运算运算l CMP r0, #num; 判断判断R0中的参数是否越界中的参数是否越界lintegerl BHI Outofrange; 参数超出跳转表范围直接赋值参数超出跳转表范围直接赋值R0=0 xFFl ADR r3, JumpTable; 读跳转表首地址读跳转表首地址l LDR pc, r3,r0,LSL#2; 查跳转表,确定跳转地址查跳转表,确定跳转地址lJumpTablel DCD DoAddl DCD
33、DoSub1l DCD DoSub2lDoAdd lDoSub1 lDoSub2 lOutofrange lSave lEND 跳转表 跳转后执行 程序跳转示意图程序跳转示意图LDR pc, r3,r0,LSL#2; 查跳转表,确定跳转地址查跳转表,确定跳转地址例例9.4在在RVDS上的运行结果上的运行结果 循环结构循环结构 lAREA Sort,CODE,READONLYl ENTRYlstartl MOV r4,#0l LDR r6,=src ; 设置设置R6保存待排序数组首地址保存待排序数组首地址l ADD r6,r6,#len ; 让让R6保存数组中最后一个地址保存数组中最后一个地址l
34、outer ; 外循环起始外循环起始l LDR r1,=srclinner ; 内循环起始内循环起始l LDR r2,r1llCMP r1,r6l BLT inner ; 内循环结束内循环结束l ADD r4,r4,#4llBLE outer ; 外循环结束外循环结束l AREA Array,DATA,READWRITElsrc DCD 2,4,10,8,14,1,20 ; 初始化待排序数组初始化待排序数组llen EQU 7*4 ; 初始化数组长度初始化数组长度l END内循环 外循环 例例9.5在在RVDS上的运行结果上的运行结果 子程序调用与返回子程序调用与返回 lN EQU 100 ;
35、 定义定义N的值的值100lAREA Examples,CODE,READONLY ; 声明代码段声明代码段Examples3l ENTRY ; 标识程序入口标识程序入口 l CODE32lARM_CODEl LDR SP,=0X30003F00 ; 设置堆栈指针设置堆栈指针l ADR R0,THUMB_CODE+1 ;l BX R0 ; 跳转并切换处理器状态跳转并切换处理器状态l LTORG ; 声明文字池声明文字池l CODE16lTHUMB_CODEl LDR R0,=N ; 设置子程序设置子程序SUM_N的入口参数的入口参数l BL SUM_N ; 调用子程序调用子程序SUM_Nl B
36、 THUMB_CODE lSUM_Nl PUSH R1-R7,LR ; 寄存器入栈保护寄存器入栈保护l MOVS R2,R0 ; 将将N的值复制到的值复制到R2,并影响相应条件标志并影响相应条件标志llSUN_L1l ADD R0,R1 ll BHS SUM_END ll B SUN_L1lSUM_ERR l MOV R0,#0lSUM_END l MOV R8,R0 ; 将结果保存在将结果保存在R8中中l POP R1-R7,PC ; 寄存器出栈,返回寄存器出栈,返回lEND 初始化设置 切换工作状态 调用子程序 保存现场和断点 计算1到N之和 恢复现场和断点例例9.6在在RVDS上的运行结
37、果上的运行结果 ARM汇编语言与汇编语言与C/C+的混合编程的混合编程 l在嵌入式软件开发过程中,通常会使用包括在嵌入式软件开发过程中,通常会使用包括ARM汇编语言和汇编语言和C/C+语语言在内的多种语言。一般情况下,一个言在内的多种语言。一般情况下,一个ARM工程工程(project)应该由多应该由多个文件组成,其中包括:个文件组成,其中包括:扩展名为扩展名为.s的汇编语言源文件的汇编语言源文件扩展名为扩展名为.c的的C语言源文件语言源文件扩展名为扩展名为.cpp的的C+源文件源文件以及扩展名为以及扩展名为.h的头文件等的头文件等 ARM汇编语言与C/C+的混合编程1 1初始化程序部分初始化
38、程序部分 硬件系统的初始化,包括设定CPU工作状态,中断使能,主频设定,以及RAM的控制参数设置及初始化等,通常都使用汇编代码。2 2初始化部分与主应用程序部分的衔接初始化部分与主应用程序部分的衔接当所有的系统初始化工作完成之后,就需要把程序流程转入到应用程序。最简单的方法是,在汇编语言程序末尾使用跳转指令B或BL直接从启动代码转移到C/C+程序入口。3.3.主应用程序的混合编程方式主应用程序的混合编程方式 汇编程序和C/C+程序之间的相互调用(ATPCS) 在C/C+代码中嵌入汇编指令53/52基于基于ARM/Thumb指令集过程调用的规则指令集过程调用的规则ATPCS PCS用于保证用于保
39、证使用不同编程语言的使用不同编程语言的子程序子程序可以分开可以分开编编写、写、编译,编译,并成功并成功连接,所以它实际上定义了一套有关过连接,所以它实际上定义了一套有关过程(函数)调用者与被调用者之间的协议。程(函数)调用者与被调用者之间的协议。PCS的制订是的制订是一系列指标的折衷(一系列指标的折衷(tradeoff),如生成代码的大小,),如生成代码的大小,调试功能的支持,函数调用上下文处理速度以及内存消耗。调试功能的支持,函数调用上下文处理速度以及内存消耗。 ARM基本基本的的ATPCS规定了规定了寄存器寄存器使用、使用、数据栈数据栈使用以使用以及及参数参数传递这三方面的基本规则;传递这
40、三方面的基本规则;而派生的其他几种特定而派生的其他几种特定的的ATPCS则则是在是在此此基础上再添加其他规则基础上再添加其他规则(如支持(如支持子程子程序可重入性序可重入性、数据栈数据栈界限界限检查检查等)等)而形成而形成的。的。 在基于在基于ARM的混合编程技术中,的混合编程技术中,C语言子程序只需开语言子程序只需开发者指定发者指定ATPCS类型,而汇编子程序则需完全依靠开发类型,而汇编子程序则需完全依靠开发者来保证。者来保证。基本基本ATPCS (1):寄存器使用规则:寄存器使用规则寄存器寄存器R0R3(A1A4 )用做子程序参数传递。被用做子程序参数传递。被调用的子程序在返回前无需恢复其
41、内容。调用的子程序在返回前无需恢复其内容。寄存器寄存器R4R11(V1V8 )用做子程序内的局部变量用做子程序内的局部变量保存。如有使用则应进行保护和恢复。(保存。如有使用则应进行保护和恢复。(Thumb程序通程序通常只能使用常只能使用R4R7) 寄存器寄存器R12(IP)用作临时用作临时(scratch)指针。指针。 寄存器寄存器R13用作数据栈指针用作数据栈指针SP ,不能用于其他用途。,不能用于其他用途。SP在子程序进入和退出时的值必须相等。在子程序进入和退出时的值必须相等。 寄存器寄存器R14用作连接寄存器用作连接寄存器LR。如果子程序中保存。如果子程序中保存了返回地址,则了返回地址,
42、则R14可用于其他用途。可用于其他用途。 寄存器寄存器R15是程序计数器是程序计数器PC,不能用于其他用途。,不能用于其他用途。 ATPCS中的寄存器使用规则中的寄存器使用规则寄存器寄存器别名别名用用 法法R0R3A1A4入口参数入口参数/返回值返回值/临时临时(scratch)寄存器)寄存器R4R11V1V8子程序局部变量寄存器,其中:子程序局部变量寄存器,其中:R7/V4也作为也作为Thumb状态工作寄存器状态工作寄存器WR;R9/V6在在支持可读写段位置无关的支持可读写段位置无关的ATPCS中用作静态基址寄存器中用作静态基址寄存器SB;R10/V7/在在支持数据栈检查的支持数据栈检查的A
43、TPCS中为数据栈限制指针中为数据栈限制指针SL;R11/V8/在在支持数据栈检查的支持数据栈检查的ATPCS中为数据帧指针中为数据帧指针FP;R12IP临时(临时(scratch)寄存器,用于过程链接胶合代码中(如连接器提供的)寄存器,用于过程链接胶合代码中(如连接器提供的veneers代码协助实现长跳转时会使用并修改其值)代码协助实现长跳转时会使用并修改其值)R13SP堆栈指针,不能用于其他用途堆栈指针,不能用于其他用途R14LR连接寄存器连接寄存器R15PC程序计数器,不能用于其他用途程序计数器,不能用于其他用途基本基本ATPCS (2):数据栈使用规则:数据栈使用规则ARM的数据栈可为
44、的数据栈可为FD(Full Descending),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 已占用的数据栈已占用的数
45、据栈(used stack)指栈基址和指栈基址和SP之间的区域,之间的区域,其中包括栈指针对应的内存单元。其中包括栈指针对应的内存单元。l l 数据栈中的数据栈中的数据帧数据帧(stack frame)指栈中为子程序分配的用指栈中为子程序分配的用来保存寄存器和局部变量的区域。来保存寄存器和局部变量的区域。 对于汇编代码来说,必须保证在进入该汇编代码后,直到调用外部代码之间,对于汇编代码来说,必须保证在进入该汇编代码后,直到调用外部代码之间,栈指针变化为偶数个字;栈指针变化为偶数个字; 应使用应使用PRESERVE8伪指令告诉连接器,本汇编代码是伪指令告诉连接器,本汇编代码是8字节对齐的;字节对
46、齐的; 应使用应使用FRAME伪指令描述数据帧伪指令描述数据帧;基本基本ATPCS(3):参数传递规则:参数传递规则1 1、子程序入口参数传递规则、子程序入口参数传递规则参数不超过参数不超过4 4个时使用寄存器个时使用寄存器R0R3R0R3,依次将各字数据传送到,依次将各字数据传送到寄存器;寄存器;参数超过参数超过4 4个时将剩余的字数据传送到个时将剩余的字数据传送到数据栈,数据栈,入栈的顺序与参数顺序相反,入栈的顺序与参数顺序相反,即最后一个参数先入栈。即最后一个参数先入栈。 2 2、子程序结果返回规则、子程序结果返回规则当结果为一个当结果为一个3232位的整数时通过寄存器位的整数时通过寄存
47、器R0R0返回子程序结果;返回子程序结果;当结果为一个当结果为一个6464位的整数时通过位的整数时通过R0R0和和R1R1返回子程序结果,以此类推;返回子程序结果,以此类推;当对于位数更多的子程序结果,需要通过调用内存来传递。当对于位数更多的子程序结果,需要通过调用内存来传递。58/52C程序调用汇编函数程序调用汇编函数 汇编程序的设置要遵循汇编程序的设置要遵循ATPCS 规则,保证程序调用规则,保证程序调用时时参数、寄存器和堆栈参数、寄存器和堆栈的正确使用。的正确使用。在汇编程序中使用在汇编程序中使用EXPORT 伪指令声明本子程序,使伪指令声明本子程序,使其它程序可以调用此子程序。其它程序
48、可以调用此子程序。在在C 语言程序中使用语言程序中使用extern关键字声明要调用的汇编关键字声明要调用的汇编子程序为外部函数。子程序为外部函数。 汇编程序调用C函数汇编程序的设置要遵循汇编程序的设置要遵循ATPCS 规则规则,保证程序调用时保证程序调用时参参数、寄存器和堆栈数、寄存器和堆栈的正确使用。的正确使用。在汇编程序中使用在汇编程序中使用IMPORT 伪指令声明将要调用的伪指令声明将要调用的C 程程序函数。序函数。1.在正确设置入口参数后使用在正确设置入口参数后使用BL 调用调用C程序函数。程序函数。AREA SCopy, CODE, READONLYEXPORT strcopy ;
49、声明声明strcopy为导出符号为导出符号strcopy LDRB R2, R1, #1 ; R1中的值为源数据块的首地址中的值为源数据块的首地址 STRB R2, R0, #1 ; R0中的值为目标数据块的首地址中的值为目标数据块的首地址 CMP R2, #0 BNE strcopy ; 未复制完,循环继续复制未复制完,循环继续复制 MOV PC, LR ; 复制完毕,返回复制完毕,返回ENDextern void strcopy(char *d,const char *s) /参数由左向右依次传递给参数由左向右依次传递给R0R3:d为目标指针为目标指针(R0);s为源指针为源指针(R1)i
50、nt main(void) const char *srcstr = First string - soure; char dststr = Second string - destination; strcopy(dest,src); /调用汇编函数调用汇编函数strcopy数据块复制数据块复制*60/52例例9.7在在RVDS上的运行结果上的运行结果 int g(int a, int b, int c, int d, int e) return a + b + c + d + e 在汇编函数在汇编函数f中调用中调用C函数函数g( ),以实现下面的功能:,以实现下面的功能: int f(in
51、t i) return - g(i, 2*i, 3*i, 4*i, 5*i)EXPORT f AREA f, CODE, READONLYIMPORT g ; 声明声明g为外部引用符号为外部引用符号 STR LR, SP, #-4 ; 将将断点断点存入堆栈存入堆栈 ADD R1, R0, R0 ; (R1)=i*2 ADD R2, R1, R0 ; (R2)=i*3 ADD R3, R1, R2 ; (R3)=i*5 STR R3,SP, #-4 ; 将将(R3)即第即第5个参数个参数i*5存入堆栈存入堆栈 ADD R3, R1, R1 ; (R3)=i*4 BL g ; 调用调用C函数函数g
52、(),返回值在,返回值在R0中中 ADD SP, SP, #4 ; 调整数据栈指针,准备返回调整数据栈指针,准备返回 LDR PC, SP, #4 ; 恢复恢复断点断点END*62/52例例9.8在在RVDS上的运行结果上的运行结果 C程序中嵌入汇编代码程序中嵌入汇编代码 ARM体系结构支持体系结构支持C、C+以及汇编语言的混合使用,内以及汇编语言的混合使用,内嵌汇编器还允许在嵌汇编器还允许在C程序中程序中嵌入汇编代码嵌入汇编代码,以提高程序的效率。,以提高程序的效率。 在在ARM C语言程序中使用关键词语言程序中使用关键词_asm来标识一段汇编指令来标识一段汇编指令程序,其格式如下:程序,其
53、格式如下:_asm instruction ; instruction instruction 如果一行有多个汇编指令,则指令之间用分号隔开;如果一行有多个汇编指令,则指令之间用分号隔开;如果一条指令占多行,则要使用续行符号如果一条指令占多行,则要使用续行符号();在汇编指令段中可以使用在汇编指令段中可以使用C语言的注释语句。语言的注释语句。内嵌汇编中使用物理寄存器的注意事项内嵌汇编中使用物理寄存器的注意事项1 一般不要直接指定一般不要直接指定物理寄存器物理寄存器存放数据存放数据,而应该而应该使用使用C变量变量,让编译器自动分配寄存器。,让编译器自动分配寄存器。_asm/*错误错误 MOV R0, xADD
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年牙齿外伤选择题库及答案
- 电路分析期末试卷及答案
- 后期制作考试题及答案
- 互联网创业项目方案
- 公务员面试陪练面试题及答案
- 华夏航空秋招真题及答案
- 公务员面试乱答面试题及答案
- 河钢集团秋招试题及答案
- 广汽集团秋招面试题及答案
- 供应链管理招聘笔试题及答案
- 2025年河北省专技人员继续教育公需课(新课程答案七)
- 浙江赞生药业有限公司年产20亿片(粒)中成药口服固体制剂项目环评报告
- 国家生态安全课件
- 师生交通安全教育:筑牢校园平安防线
- 2025-2030中国酸枣市场供需格局与营销渠道发展趋势报告
- 股骨粗隆间骨折护理疑难病例讨论
- 《资治通鉴》与为将之道知到课后答案智慧树章节测试答案2025年春武警指挥学院
- 2024年广东春季高考语文试题及答案
- T-QASE 005-2024 岸边集装箱起重机设备使用管理和维护保养作业规范
- 招标代理服务投标方案(技术标)
- 2024年金钥匙科技知识竞赛试题及答案
评论
0/150
提交评论