arm汇编编程(示例)
子程序调用,程序的返回可通过把LR寄存器的值到PC寄存器中来实现。
例:
BLfunc;调用子程序func
…
func
…
MOVR15,R14;子程序返回
3)其它跳转指令
BLX带返回和状态切换的跳转指令,用于子程序调用和程序Thumb状态的切换。
BX带状态切换的跳转指令,处理器跳转到目标地址处,目标地址处的指令可以是ARM指令,也可以是Thumb指令。
跳转指令用于实现程序的跳转和程序状态的切换。
ARM程序设计中,实现程序跳转有两种方式:跳转指令、直接向程序寄存器PC中写入目标地址值。
//----------------------------------------------------------------------------------------
(三)、程序状态指令
用于状态寄存器和通用寄存器间传送数据。总共有两条指令:MRS和MSR。两者结合可用来修改程序状态寄存器的值。
1)MRS程序状态寄存器到通用寄存器的数据传送指令
格式:MRS{
功能:用于将程序状态寄存器的内容传送到目标寄存器Rd中。
例:
MRSR0,CPSR;状态寄存器CPSR的值存入寄存器R0中
2)MSR通用寄存器到程序状态寄存器的数据传送指令
格式:MSR{
功能:用于将寄存器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:基址寄存
arm汇编编 相关文章:
- ARM汇编编程基础之四-ARM汇编伪操作(11-27)
- ARM汇编编程基础之三-基本寻址方式与基本指令(11-27)
- ARM汇编编程基础之一-寄存器(11-27)
- ARM汇编编程基础之五-ADS开发环境的使用(11-27)
- ARM汇编编程基础之二-流水线对PC值的影响(11-27)
- ARM汇编编程基础之六-其它寻址模式与其它指令(11-27)