微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM程序设计基础

ARM程序设计基础

时间:11-22 来源:互联网 点击:

文件包含到当前的源文件中,被包含的文件不作任何变动的存放在当前文件中,编译器从其后开始继续处理。

使用示例:

AREA Init,CODE,READONLY

INCBIN a1.dat ;通知编译器当前源文件包含文件a1.dat

INCBIN C:\a2.txt ;通知编译器当前源文件包含文件C:\a2.txt

……

END

12、RN

语法格式:

名称 RN 表达式

RN伪指令用于给一个寄存器定义一个别名。采用这种方式可以方便程序员记忆该寄存器的功能。其中,名称为给寄存器定义的别名,表达式为寄存器的编码。

使用示例:

Temp RN R0 ;将R0定义一个别名Temp

13、ROUT

语法格式:

{名称} ROUT

ROUT伪指令用于给一个局部变量定义作用范围。在程序中未使用该伪指令时,局部变量的作用范围为所在的AREA,而使用ROUT后,局部变量的作为范围为当前ROUT和下一个ROUT之间。

2ARM汇编器所支持的伪指令

ARM微处理器的指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产生指令六大类。

2.1 指令的条件域

当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行。当指令的执行条件满足时,指令被执行,否则指令被忽略。

每一条ARM指令包含4位的条件码,位于指令的最高4位[31:28]。条件码共有16种,每种条件码可用两个字符表示,这两个字符可以添加在指令助记符的后面和指令同时使用。

2.2 寻址方式

n立即寻址

n寄存器寻址

n寄存器间接寻址

n基址变址寻址

n多寄存器寻址

n相对寻址

n堆栈寻址

1立即寻址

立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。

ADDR0,R0,#1 ;R0←R0+1

ADDR0,R0,#0x3f ;R0←R0+0x3f

2寄存器寻址

寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。

ADDR0,R1,R2 ;R0←R1+R2

3寄存器间接寻址

寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。

ADDR0,R1,[R2] ;R0←R1+[R2]

LDRR0,[R1] ;R0←[R1]

STRR0,[R1] ;[R1]←R0

4基址变址寻址

基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。

LDR R0,[R1,#4] ;R0←[R1+4]

LDR R0,[R1,#4]! ;R0←[R1+4]、R1←R1+4

LDR R0,[R1] ,#4 ;R0←[R1]、R1←R1+4

LDR R0,[R1,R2] ;R0←[R1+R2]

5多寄存器寻址

采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。这种寻址方式可以用一条指令完成传送最多16个通用寄存器的值。

LDMIA R0,{R1,R2,R3,R4}

;R1←[R0],R2←[R0+4],R3←[R0+8],R4←[R0+12]

该指令的后缀IA表示在每次执行完加载/存储操作后,R0按字长度增加,因此,指令可将连续存储单元的值传送到R1~R4。

6相对寻址

与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式:

BL NEXT ;跳转到子程序NEXT处执行

……

NEXT:

……

MOV PC,LR ;从子程序返回

7 堆栈寻址

操作顺序为“后进先出” 。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种:

    • 向上生长:向高地址方向生长,称为递增堆栈
    • 向下生长:向低地址方向生长,称为递减堆栈

堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个待压入数据的空位置,称为空堆栈。

四种类型的堆栈方式:

  • 满递增:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA等;
  • 空递增:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等;
  • 满递减:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD、STMFD等;
  • 空递减:堆栈向下增长,堆栈指针向堆栈下的第一个空位置。指令如LDMED、STMED等。

8块拷贝寻址

多寄存器传送指令用于将一块数据从存储器的某一位置拷贝到另一位置。如:

STMIA R0!,{R1-R7};将R1~R7的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top