ARM系统硬件设计基础_第1页
ARM系统硬件设计基础_第2页
ARM系统硬件设计基础_第3页
ARM系统硬件设计基础_第4页
ARM系统硬件设计基础_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

1、第4章 ARM系统硬件设计基础,1、汇编语言程序常用的符号,(1)常量 常量是指其值在程序运行过程中不能被改变的量。 ARM汇编程序支持的常量有数字常量、逻辑常量和字符串常量。 数字常量一般为32位的整数; 逻辑常量只有两种取值:真或假; 字符串常量为一个固定的字符串。,(2)变量,变量是指其值在程序运行过程中可以改变的量。 在ARM汇编语言程序中,可使用GBLA、GBLL、GBLS伪指令声明全局变量,使用LCLA、LCLL、LCLS伪指令声明局部变量,并可使用SETA、SETL和SETS对其进行初始化。,(3)变量代换,程序中的变量可通过代换操作取得一个常量。代换操作符为“$” 。 数字变量

2、前面有一个代换操作符“$” ,编译器会将该数字变量的值转换为十六进制的字符串,并将该十六进制的字符串代换“$”后的数字变量。 逻辑变量前面有一个代换操作符“$” ,编译器会将该逻辑变量代换为它的取值(真或假)。 字符串变量前面有一个代换操作符“$” ,编译器会将该字符串变量的值代换“$”后的字符串变量。,(3)变量代换,LCLSS1;定义局部字符串变量S1和S2 LCLSS2 S1SETS “Test!” S2SETS “This is a $S1” ;字符串变量S2的值为“This is a Test!”,4.2.1 ARM汇编器支持的伪指令,伪操作不像机器指令一样在CPU运行时执行,而是在

3、汇编程序期间进行处理的。 1、符号定义(Symbol Definition)伪操作 2、数据定义(Data Definition)伪操作 3、汇编控制(Assembly Control)伪操作 4、其他常用的伪操作,1、符号定义伪操作,符号定义伪指令用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。 常见的符号定义伪指令有如下几种: (1)定义全局变量 GBLA、GBLL和GBLS (2)定义局部变量 LCLA、LCLL和LCLS (3)对变量赋值 SETA、SETL、SETS,(1)GBLA、GBLL和GBLS,语法 GBLA(GBLL或GBLS) 全局变量名 GBLA

4、(Global Arithmetic) 定义一个全局的数字变量,并初始化为0 GBLL (Global Logic) 定义一个全局的逻辑变量,并初始化为F(假) GBLS (Global String) 定义一个全局的字符串变量,并初始化为空,(1)GBLA、GBLL和GBLS,GBLATest1 Test1SETA0 xaa GBLLTest2 Test2SETLTRUE GBLSTest3 Test3SETS“Testing”,(2)LCLA、LCLL和LCLS,语法格式 LCLA(LCLL或LCLS) 局部变量名 LCLA伪指令用于定义一个局部的数字变量,并初始化为0 LCLL伪指令用于

5、定义一个局部的逻辑变量,并初始化为F(假) LCLS伪指令用于定义一个局部的字符串变量,并初始化为空,(2)LCLA、LCLL和LCLS,LCLATest4 Test1SETA0 xaa LCLLTest5 Test2SETLTRUE LCLSTest6 Test3SETS“Testing”,(3)SETA、SETL和SETS,语法 变量名 SETA(SETL或SETS) 表达式 SETA伪指令用于给一个数字变量赋值 SETL伪指令用于给一个逻辑变量赋值 SETS伪指令用于给一个字符串变量赋值,(4) RLIST (Register List),语法 名称 RLIST 寄存器列表 作用 对一个

6、通用寄存器列表定义名称,使用该伪指令定义的名称可在ARM指令LDM/STM中使用 实例 RegListRLIST R0-R5,R8,R10,2、数据定义伪操作,数据定义伪操作一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。,(1) DCB (Distribute Continuous Byte),语法 标号 DCB 表达式 作用 分配一片连续的字节存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为0255的数字或字符串。DCB也可用“=”代替。 实例 Str DCB“This is a test!”,(2) DCW,语法 标号 DCW 表达式 作用 分配一片连续的半

7、字存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为程序标号或数字表达式。 实例 DataTest DCW1, 2, 3,(3) DCD,语法 标号 DCD 表达式 作用 分配一片连续的字存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为程序标号或数字表达式。DCD也可用“注释 每条指令的助记符可以全部用大写、或全部用小写,但不允许在一条指令中大、小写混用。 如果一条语句太长,可分为若干行,在行尾用续行符“” 。,汇编语言的语句格式,1、标号是代表地址的符号,必须在一行的顶格书写,其后不能添加冒号“:”。 2、程序中所有指令均不能顶格书写。 3、在ARM汇编语言中,ARM指令、

8、伪指令、寄存器名等可以全部大写或者全部小写,但不能大小写混合使用。,4.2.3 ARM汇编语言程序的基本结构,在ARM汇编程序中,以程序段为单位组织代码。段是相对独立的指令或数据序列,具有特定的名称。 段可以分为代码段和数据段,代码段的内容为执行代码,数据段存放代码运行时需要用到的数据。 一个汇编程序至少应该有一个代码段,当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译链接时最终形成一个可执行的映象文件。,AREAInit,CODE,READONLY ENTRY Start LDRR0,= 0 x3FF5000 LDRR1,= 0 xFF STRR1,R0 LDRR0,= 0 x3

9、FF5008 LDRR1,= 0 x01 STRR1,R0 . END,在汇编语言程序中,用AREA伪指令定义一个段,并说明所定义段的相关属性,本例定义一个名为Init的代码段,属性为只读。 ENTRY伪指令标识程序的入口点,接下来为指令序列。 程序的末尾为END伪指令,该伪指令告诉编译器源文件的结束,每一个汇编程序段都必须有一条END伪指令,指示代码段的结束。,汇编语言的子程序调用,在ARM汇编语言程序中,子程序的调用一般是通过BL指令来实现的。 BL 子程序名,汇编语言的子程序调用,该指令在执行时完成如下操作:将子程序的返回地址存放在连接寄存器LR中,同时将程序计数器PC指向子程序的入口点

10、。 当子程序执行完毕需要返回调用处时,只需要将存放在LR中的返回地址重新拷贝给程序计数器PC即可。 在调用子程序的同时,也可以完成参数的传递和从子程序返回运算的结果,通常可以使用寄存器R0R3完成。,AREAInit,CODE,READONLY ENTRY Start LDRR0,= 0 x3FF5000 LDRR1,= 0 xFF STRR1,R0 LDRR0,= 0 x3FF5008 LDRR1,= 0 x01 STRR1,R0 BLPRINT_TEXT .,PRINT_TEXT . MOVPC,LR . END,一个数据段的例子,AREA DataArea, DATA, NOINIT,

11、ALIGN=2 DISPBUFSPACE200 RCVBUFSPACE200 其中DATA为数据段的标识。,4.2.4 基于ARM的汇编语言程序举例,以下是一个基于S3C2410的LED点灯程序。 ;LED点灯实验 ; 端口F寄存器预定义 rGPFCON EQU 0 x56000050 rGPFDAT EQU 0 x56000054 rGPFUP EQU 0 x56000058,AREAInit,CODE,READONLY ENTRY ResetEntry ldr r0, = rGPFCON ldr r1, = 0 x4000 ; 设置I/O口GPF7为输出属性 str r1, r0 ldr

12、r0, = rGPFUP ldr r1, = 0 xff ; 禁止GPF端口的上拉电阻 str r1, r0 ldr r2, = rGPFDAT,ledloop ldr r1, = 0 x80 str r1, r2 ;使GPF7输出高电平,D14灯亮 bl delay ;调用延迟子程序 ldr r1, = 0 x00 str r1, r2 ;使GPF7输出低电平,D14灯灭 bl delay ;调用延迟 b ledloop ;不断的循环,D14将不停的闪烁,;下面是延迟子程序 delay ldr r3, = 0 x1ffff ;设置延迟的时间 delay1 sub r3, r3, #1 ;r3

13、=r3-1 cmp r3, #0 x0 ;将r3的值与0相比较 bne delay1 ;比较的结果不为0,继续调 用delay1,否则执行下一条语句 mov pc, lr ;返回 END,4.4 基于ARM的C语言与汇编语言混合编程,汇编语言与C/C+的混合编程通常有以下几种方式: 在C/C+代码中嵌入汇编指令 在汇编程序和C/C+的程序之间进行变量的互访 汇编程序、C/C+程序间的相互调用 在实际的编程应用中,使用较多的方式是:程序的初始化部分用汇编语言完成,然后用C/C+完成主要的编程任务,程序在执行时首先完成初始化过程,然后跳转到C/C+程序代码中。,4.4.1 C语言与汇编语言混合编程

14、应遵守的规则,在C程序和ARM汇编程序之间相互调用时必须遵守ATPCS规则。ATPCS规定了一些子程序间调用的基本规则,比如: 寄存器的使用规则 子程序之间通过寄存器r0r3来传递参数,当参数个数多于4个时,使用堆栈来传递参数。 在子程序中,使用寄存器r4r11保存局部变量。 寄存器r12用于保存堆栈指针SP,当子程序返回时使用该寄存器出栈,记作IP。寄存器r13用作堆栈指针,记作SP。寄存器r14称为链接寄存器,记作LR。该寄存器用于保存子程序的返回地址。寄存器r15称为程序计数器,记作PC。,4.4.1 C语言与汇编语言混合编程应遵守的规则,在C程序和ARM汇编程序之间相互调用时必须遵守A

15、TPCS规则。ATPCS规定了一些子程序间调用的基本规则,比如: 堆栈的使用规则 堆栈采用满递减类型(FD,Full Descending),即堆栈通过减小存储器地址而向下增长,堆栈指针指向内含有效数据项的最低地址。 参数的传递规则 整数参数的前4个使用r0r3传递,其他参数使用堆栈传递;浮点参数使用编号最小且能够满足需要的一组连续的FP寄存器传递参数 子程序的返回结果为一个32位整数时,通过r0返回;返回结果为一个64位整数时,通过r0和r1返回;依此类推。结果为浮点数时,通过浮点运算部件的寄存器F0、D0或S0返回,4.4.2 汇编程序调用C程序的方法,汇编程序调用C程序的方法为:首先在汇

16、编程序中使用IMPORT伪指令事先声明将要调用的C语言函数;然后通过BL指令来调用C函数。,例如在一个C源文件中定义了如下求和函数: int add(int x,int y) return(x+y); 调用add()函数的汇编程序结构如下: IMPORT add ;声明要调用的C函数 MOV r0,1 MOV r1,2 BL add ;调用C函数add,4.4.3 C程序调用汇编程序的方法,C程序调用汇编子程序的方法为:首先在汇编程序中使用EXPORT伪指令声明被调用的子程序,表示该子程序将在其他文件中被调用;然后在C程序中使用extern关键字声明要调用的汇编子程序为外部函数。,例如在一个汇编源文件中定义了如下求和函数: EXPORT add ;声明add子程序将被外部函数调用 add ;求和子程序add ADD r0,r0,r1 MOV pc,lr 在一个C程序的main()函数中对add汇编子程序进行了调用: extern int

温馨提示

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

评论

0/150

提交评论