标签:mode 状态 nbsp 9.png 修改 类型 第一个 通用 The
经典ARM指令格式如下:
<opcode> {<cond>} {S} <Rd>,<Rn>,<operand2>
ARM指令可以通过添加适当的条件码后缀来达到条件执行的目的
这样可以提高代码密度,减少分支跳转指令数目,提高性能。
默认情况下,数据处理指令不影响条件码标志位,但可以选择通过添加“S”来影响标志位
CMP不需要增加 “S”就可改变相应的标志位。
使用条件码可以实现高效的逻辑操作,节省跳转和条件语句,提高代码效率
如果指令不标明条件码,将默认为无条件(AL)执行。
条件码表
跳转指令用于实现程序流程的跳转,在ARM程序中有两种方法可以实现程序的跳转,一种是使用跳转指令直接跳转,另一种是直接向PC寄存器赋值实现跳转。
B{条件} 目标地址
B指令最简单的跳转指令,一旦遇到一个B指令,ARM处理器立即跳转至给定的目标地址,由此处继续执行。跳转指令B限制在当前指令的土32MB范围内
BL{条件} 目标地址
BL是一另个跳转指令,在跳转前会将下一条指令的地址复制到R14中,然后跳转到指定的地址运行程序。可以通过将R14的内容重新加载到PC中,并返回到跳转指令之后的那个指令处执行。 BL是实现子程序调用的一个基本但常用的手段。
BLX{条件} 目标地址
BLX指令从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态由ARM状态切换到Thumb状态,该指令同时将PC的当前内容到寄存器R14中。当程序使用Thumb指令集,而调用者使用ARM指令集时,可以通过BLX指令实现程序的调用和处理器工作状态的切换。子程序的返回可以通过将寄存器R14复制到PC中来完成。
BX{条件} 目标地址
BX指令是带状态切换的跳转指令,跳转到指定的目标地址执行程序。若目标地址寄存器的[0]位为1,则跳转时自动将CPSR中的标志T置位,即把目标地址的代码解释为Thumb指令。若目标地址寄存器的[0]位为0,则跳转时自动将CPSR中的标志T复位,即把目标地址的代码解释为ARM指令。
MOV R0,R1
MOVS R1,R3,LSL,#3
MOV PC,LR
MVN R1,#0xFF
MVN R1,R2
MVN R0,#0
ADDS R1,R1,#1
ADD R1,R1,R2
ADD R0,R2,R3,LSL,#1
SUB R0,R0,#1
SUBS R0,R1,R2
SUB R0,R2,R3,LSL,#1
RSB R3,R1,#0xFF00
RSB R0,R2,R3,LSL,#1
RSB R0,R1,#0
ADDS R0,R0,R2
ADC R1,R2,R3
SUBS R0,R0,R2
SUB R1,R1,R3
RSBS R2,R0,#0
RSC R3,R1,#0
RSC R0,R1,R2
AND R0,R0,#3
AND R2,R1,R3
ORR R0,R0,#3
MOV R1,R2,LSR,#4
ORR R3,R1,R3,LSL,#4
EOR R1,R1,#0x0F
EOR R2,R1,R0
EORS R0,R5,#0x01
BIC R0,R0,#%1011
BIC R1,R1,#0x0F
BIC R1,R2,R3
CMP{条件} 操作数1,操作数2
CMP指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新CPSR中的条件标志位的值。该指令进行一次减法运算,但不存储结果,只更改条件标志位,标志位表示的是操作数1与操作数2的关系。如果操作数1大于操作数2,则此后GT后缀的指令将执行,不需显示的指定S后缀更改状态标志,如果指定了则忽略。
CMN{条件} 操作数1,操作数2
CMN指令用于把一个寄存器的内容和另一个寄存器的内容或立即数据取反后进行比较。同时更新CPSR中条件标志位的值,该指令实际完成操作数1和操作数2相加,并根据结果更改条件标志位。CMN指令与ADD指令的区别在于CMN指令不保存运算结果。
CMN R1,R0
CMN R1,#100
TST R0,#0x01
TST R0,#0x0F
TEQ R1,R2
ARM指令有两条指令用于状态寄存器和通用寄存器之间传送数。修改寄存器一般是通过 “读取-修改-写回” 三个步骤的操作来实现的。这两指令分别是状态寄存器到通用寄存器的传送指令MRS,通用寄存器到状态寄存器的传送指令MSR。
MRS R0,CPSR
MRS R0,SPSR
MSR CPSR_c,#0xD3
MSR CPSR_cxsf,R3
Load指令用于从内存中读取数据放入寄存器中,Store指令用于将寄存器中的数据保存到内存。
LDR R0,#8
LDR R0,[R1,R2]
LDR R0,[R1,# 8]
STR #8,R0
STR R0,[R1,#8]
STMFD R13,{R0,R4-R12,LR}
DMFD R13,{R0,R4-R12,LR}
SWI,即software interrupt软件中断。该指令产生一个SWI异常。意思就是处理器模式改变为超级用户模式,CPSR寄器保存到超级用户模式下的SPSR寄存器,并且跳转到SWI向量。
指令格式如下:SWI{cond} immed_24
Cond域:是可选的条件码 (参见 ARM汇编指令条件执行详解).
immed_24域:范围从 0 到 224-1 的表达式, (即0-16777215)。用户程序可以使用该常数来进入不同的处理流程。
标签:mode 状态 nbsp 9.png 修改 类型 第一个 通用 The
原文地址:https://www.cnblogs.com/usingnamespace-caoliu/p/9691663.html