微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > arm汇编编程(示例)

arm汇编编程(示例)

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

子程序调用,程序的返回可通过把LR寄存器的值到PC寄存器中来实现。

例:

BLfunc;调用子程序func

func

MOVR15,R14;子程序返回

3)其它跳转指令

BLX带返回和状态切换的跳转指令,用于子程序调用和程序Thumb状态的切换。

BX带状态切换的跳转指令,处理器跳转到目标地址处,目标地址处的指令可以是ARM指令,也可以是Thumb指令。

跳转指令用于实现程序的跳转和程序状态的切换。

ARM程序设计中,实现程序跳转有两种方式:跳转指令、直接向程序寄存器PC中写入目标地址值。

//----------------------------------------------------------------------------------------

(三)、程序状态指令

用于状态寄存器和通用寄存器间传送数据。总共有两条指令:MRS和MSR。两者结合可用来修改程序状态寄存器的值。

1)MRS程序状态寄存器到通用寄存器的数据传送指令

格式:MRS{},CPSR/SPSR;

功能:用于将程序状态寄存器的内容传送到目标寄存器Rd中。

例:

MRSR0,CPSR;状态寄存器CPSR的值存入寄存器R0中

2)MSR通用寄存器到程序状态寄存器的数据传送指令

格式:MSR{}CPSR/SPSR_,;

功能:用于将寄存器Rd的值传送到程序状态寄存器中。

:用来设置状态寄存器中需要操作的位。

32位的状态寄存器可以分为4个域:

位[31:24]为条件标志位域,用f表示。

位[23:16]为状态位域,用s表示。

位[15:8]为扩展位域,用x表示。

位[7:0]为控制位域,用c表示。

例:

MSRCPSR_f,R0;用R0的值修改CPSR的条件标志域

MSRCPSR_fsxc,#5;CPSR的值修改为5

(四)、加载存储指令

该集合的指令使用频繁,当数据存放在内存中时,必须先把数据从内存装载到寄存器,执行完后再把寄存器

中的数据存储到内存中

1.单数据访存指令

1)单数据加载指令

格式:LDR(或LDRB、LDRBT、LDRH、LDRSB、LDRSH、LDRT、STR、STRB、STRBT、STRH、STRT),;

功能:内存地址中的数据装载到目标寄存器Rd中,同时还可以把合成的有效地址写回到基址寄存器。

寻址方式:Rn:基址寄存器。Rm:变址寄存器。Index:偏移量,12位的无符号数。

LDRRd,[Rn];把内存中地址为Rn的字数据装入寄存器Rd中

LDRRd,[Rn,Rm];将内存中地址为Rn+Rm的字数据装入寄存器Rd中

LDRRd,[Rn,#index];将内存中地址为Rn+index的字数据装入Rd中

LDRRd,[Rn,Rm,LSL#5];将内存中地址为Rn+Rm×32的字数据装入Rd

LDRRd,[Rn,Rm]!;将内存中地址为Rn+Rm的字数据装入Rd,并将新地址Rn+Rm写入Rn

LDRRd,[Rn,#index]!;将内存中地址为Rn+index的字数据装入Rd,并将新地址Rn+index写入Rn

LDRRd,[Rn,Rm,LSL#5]!;将内存中地址为Rn+Rm×32的字数据装入Rd,并将新地址Rn+Rm×32写入Rn

LDRRd,[Rn],Rm;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+Rm写入Rn

LDRRd,[Rn],#index;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+index写入Rn

LDRRd,[Rn],Rm,LSL#5;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+Rm×32写入Rn

各指令的区别:

(1)LDR字数据加载指令

将内存地址中的字数据装载到目标寄存器Rd中

例:LDRR0,[R1,R2,LSL#5]!;将内存中地址为R1+R2×32的字数据装入寄存器R0,并将新地址R1+R2×32写入R1

(2)LDRB字节数据加载指令

同LDR,只是从内存读取一个8位的字节数据而不是一个32位的字数据,并将Rd的高24位清0。

例:LDRBR0,[R1];将内存中起始地址为R1的一个字节数据装入R0中

(3)LDRBT用户模式的字节数据加载指令

同LDRB指令,但无论处理器处于何种模式,都将该指令当作一般用户模式下的内存操作。

(4)LDRH半字数据加载指令

同LDR指令,但该指令只是从内存读取一个16位的半字数据而不是一个32位的字数据,并将Rd的高16位清0。

例:LDRHR0,[R1];将内存中起始地址为R1的一个半字数据装入R0中

(5)LDRSB有符号的字节数据加载指令

同LDRB指令,但该指令将寄存器Rd的高24位设置成所装载的字节数据符号位的值。

例:LDRSBR0,[R1];将内存中起始地址为R1的一个字节数据装入R0中,R0的高24位设置成该字节数据的符号位

(6)LDRSH有符号的半字数据加载指令

同LDRH指令,但该指令将寄存器Rd的高16位设置成所装载的半字数据符号位的值。

例:LDRSHR0,[R1];将内存中起始地址为R1的一个16位半字数据装入R0中,R0的高16位设置成该半字数据的符号位

(7)LDRT用户模式的字数据加载指令

同LDR指令,但无论处理器处于何种模式,都将该指令当作一般用户模式下的内存操作。有效地址必须是字对齐的

2)单数据存储指令

格式:STR(或STR、STRB、STRBT、STRH、STRT),;

功能:将寄存器数据写入到内存中

寻址方式:Rn:基址寄存

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

网站地图

Top