ARM指令集

ARM编程模型-常用指令集 由上述例子所示,每调用一级子函数,我们都把返回地址存入到未分组寄存器中,但是未分组寄存器毕竟是有限的,像Linux内核函数的调用层次往往很深,通用寄存器根本不够用,要想保存返回地址,就需要对数据进行压栈,那我们就要为每个模式的栈设置空间。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。未设置的掩码位保持不变。对大多数的Thumb指令而言,没有使用条件执行(标志一直都是置位的),源寄存器和目标寄存器是相同的,只使用了低端寄存器,常量有大小的限制,没有使用内嵌桶形移位器。 阅读详情

原文:http://www.eefocus.com/article/08-08/49787s.html

ARM指令集
6种类型(53种主要助记符) :
数据处理指令(22种主要助记符)
跳转指令(4种主要助记符)
Load/Store指令(16种主要助记符)
程序状态寄存器指令(2种主要助记符)
协处理器指令(5种主要助记符)
软件中断指令 (2种主要助记符)

数据处理指令
数据处理指令大致可分为3类:
数据传送指令;
算术逻辑运算指令;
乘法指令
比较指令。
数据处理指令只能对寄存器的内容进行操作,而不能对内存中的数据进行操作。所有ARM数据处理指令均可选择使用S后缀,并影响状态标志。

数据处理指令1
MOV 数据传送指令
格式:MOV{<cond>}{S} <Rd>,<op1>;
功能:Rd=op1
op1可以是寄存器、被移位的寄存器或立即数。
例如:
MOV R0,#5 ;R0=5
MOV R0,R1 ;R0=R1
MOV R0,R1,LSL#5 ;R0=R1左移5位

数据处理指令2
2.MVN 数据取反传送指令
格式:MVN{<cond>}{S} <Rd>,<op1>;
功能:将op1表示的值传送到目的寄存器Rd中,但该值在传送前被按位取反,即Rd=!op1;
op1可以是寄存器、被移位的寄存器或立即数。
例如:
MVN R0,#0 ;R0=-1

数据处理指令3
3.ADD 加法指令
格式:ADD{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn+op2
op2可以是寄存器,被移位的寄存器或立即数。
例如:
ADD R0,R1,#5 ;R0=R1+5
ADD R0,R1,R2 ;R0=R1+R2
ADD R0,R1,R2,LSL#5 ;R0=R1+R2左移5位

数据处理指令4
4.ADC 带进位加法指令
格式:ADC{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn+op2+carry
op2可以是寄存器、被移位的寄存器或立即数;carry为进位标志值。该指令用于实现超过32位的数的加法。
例如:
第一个64位操作数存放在寄存器R2,R3中;
第二个64位操作数存放在寄存器R4,R5中;
64位结果存放在R0,R1中。
64位的加法可由以下语句实现:
ADDS R0,R2,R4 ;低32位相加,S表示结果影响条件标志位的值
ADC R1,R3,R5 ;高32位相加

数据处理指令5
5.SUB 减法指令
格式:SUB{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn-op2
op2可以是寄存器、被移位的寄存器或立即数。
例如:
SUB R0,R1,#5 ;R0=R1-5
SUB R0,R1,R2 ;R0=R1-R2
SUB R0,R1,R2,LSL#5 ;R0=R1-R2左移5位

数据处理指令6
6.RSB 反向减法指令
格式:RSB{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:同SUB指令,但倒换了两操作数的前后位置,即Rd=op2-Rn。
例如:
RSB R0,R1,#5 ;R0=5-R1
RSB R0,R1,R2 ;R0=R2-R1
RSB R0,R1,R2,LSL#5 ;R0=R2左移5位-R1

数据处理指令7
7.SBC 带借位减法指令
格式:SBC{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn-op2-!carry
op2可以是寄存器、被移位的寄存器或立即数。
SUB和SBC生成进位标志的方式不同于常规,如果需要借位则清除进位标志,所以指令要对进位标志进行一个非操作。
例如:
第一个64位操作数存放在寄存器R2,R3中;
第二个64位操作数存放在寄存器R4,R5中;
64位结果存放在R0,R1中。
64位的减法(第一个操作数减去第二个操作数)可由以下语句实现:
SUBS R0,R2,R4; 低32位相减,S表示结果影响条件标志位的值
SBC R1,R3,R5; 高32位相减

数据处理指令8
8.RSC 带借位的反向减法指令
格式:RSC{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:同SBC指令,但倒换了两操作数的前后位置,即Rd=op2-Rn-!carry。
例如:
前提条件与SBC例子相同,操作数1-操作数2的实现语句需改为:
SUBS R0,R2,R4; 低32位相减,S表示结果影响寄存器CPSR的值
RSC R1,R5,R3; 高32位相减

数据处理指令——乘法指令
ARM7TDMI具有三种乘法指令,分别为:
32×32位乘法指令;
32× 32位乘加指令;
32× 32位结果为64位的乘/乘加指令。

数据处理指令9
9.MUL 32位乘法指令
格式:MUL{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn×op2
该指令根据S标志,决定操作是否影响CPSR的值;其中op2必须为寄存器。Rn和op2的值为32位的有符号数或无符号数。
例如:
MULS R0,R1,R2 ;R0=R1×R2,结果影响寄存器CPSR的值

数据处理指令10
10.MLA 32位乘加指令
格式:MLA{<cond>}{S} <Rd>,<Rn>,<op2>,<op3>;
功能:Rd=Rn×op2+op3
op2和op3必须为寄存器。Rn、op2和op3的值为32位的有符号数或无符号数。
例如:
MLA R0,R1,R2,R3 ;R0=R1×R2+R3

数据处理指令11
11.SMULL 64位有符号数乘法指令
格式:
SMULL{<cond>}{S} <Rdl>,<Rdh>,<Rn>,<op2>;
功能:Rdh Rdl=Rn×op2
Rdh、Rdl和op2均为寄存器。Rn和op2的值为32位的有符号数。
例如:
SMULL R0,R1,R2,R3
;R0=R2×R3的低32位
;R1=R2×R3的高32位

数据处理指令12
12.SMLAL 64位有符号数乘加指令
格式:
SMLAL{<cond>}{S} <Rdl>,<Rdh>,<Rn>,<op2>;
功能:Rdh Rdl=Rn×op2+Rdh Rdl
Rdh、Rdl和op2均为寄存器。Rn和op2的值为32位的有符号数,Rdh Rdl的值为64位的加数。
例如:
SMLAL R0,R1,R2,R3
;R0=R2×R3的低32位+R0
;R1=R2×R3的高32位+R1

数据处理指令13
13.UMULL 64位无符号数乘法指令
格式:
UMULL{<cond>}{S} <Rdl>,<Rdh>,<Rn>,<op2>;
功能:同SMULL指令,但指令中Rn和op2的值为32位的无符号数。
例如:
UMULL R0,R1,R2,R3
;R0=R2×R3的低32位
;R1=R2×R3的高32位
其中R2,R3的值为无符号数

数据处理指令14
14.UMLAL 64位无符号数乘加指令
格式:
UMLAL {<cond>}{S} <Rdl>,<Rdh>,<Rn>,<op2>;
功能:同SMLAL指令,但指令中Rn,op2的值为32位的无符号数,Rdh Rdl的值为64位无符号数。
例如:
UMLAL R0,R1,R2,R3
;R0=R2×R3的低32位+R0
;R1=R2×R3的高32位+R1
其中R2,R3的值为32位无符号数
R1,R0的值为64位无符号数

数据处理指令15
15.AND 逻辑与指令
格式:AND{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn AND op2
op2可以是寄存器,被移位的寄存器或立即数。一般用于清除Rn的特定几位。
例如:
AND R0,R0,#5
;保持R0的第0位和第2位,其余位清0

数据处理指令16
16.ORR 逻辑或指令
格式:ORR{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn OR op2
op2可以是寄存器、被移位的寄存器或立即数。一般用于设置Rn的特定几位。
例如:
ORR R0,R0,#5
;R0的第0位和第2位设置为1,其余位不变

数据处理指令17
17.EOR 逻辑异或指令
格式:EOR{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn EOR op2
op2可以是寄存器、被移位的寄存器或立即数。一般用于将Rn的特定几位取反。
例如:
EOR R0,R0,#5
;R0的第0位和第2位取反,其余位不变

数据处理指令18
18.BIC 位清除指令
格式:BIC{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn AND (!op2)
用于清除寄存器Rn中的某些位,并把结果存放到目的寄存器Rd中.
操作数op2是一个32位掩码(mask),如果在掩码中设置了某一位,则清除Rn中的这一位;未设置的掩码位指示Rn中此位保持不变。其中,op2可以是寄存器、被移位的寄存器或立即数。
例如:
BIC R0,R0,#5
;R0中第0位和第2位清0,其余位不变

数据处理指令19
19.CMP 比较指令
格式:CMP{<cond>} <Rn>,<op1>;
功能:Rn-op1
该指令进行一次减法运算,但不存储结果,根据结果更新CPSR中条件标志位的值。
该指令不需要显式地指定S后缀来更改状态标志。其中,操作数op1为寄存器或立即数。
例如:
CMP R0,#5
;计算R0-5,根据结果设置条件标志位
ADDGT R0,R0,#5
;如果R0>5,则执行ADDGT指令

数据处理指令20
20.CMN 反值比较指令
格式:CMN{<cond>} <Rn>,<op1>;
功能:同CMP指令,但寄存器Rn的值是和op1取负的值进行比较。
例如:
CMN R0,#5 ;把R0与-5进行比较

数据处理指令21
21.TST 位测试指令
格式:TST{<cond>} <Rn>,<op1>;
功能: Rn AND op1
根据结果更新CPSR中条件标志位的值,但不存储结果。
用于检查寄存器Rn是否设置了op1中相应的位。
例如:
TST R0,#5
;测试R0中第0位和第2位是否为1

数据处理指令22
22.TEQ 相等测试指令
格式:TEQ{<cond>} <Rn>,<op1>;
功能: Rn EOR op1
将寄存器Rn的值和操作数op1所表示的值按位作逻辑异或操作,根据结果更新CPSR中条件标志位的值,但不存储结果。
用于检查寄存器Rn的值是否和op1所表示的值相等。
例如:
TEQ R0,#5 ;判断R0的值是否和5相等

跳转指令
跳转指令用于实现程序的跳转和程序状态的切换。
ARM程序设计中,实现程序跳转有两种方式:
(1)跳转指令,
(2)直接向程序寄存器PC(R15)中写入目标地址值。
通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转。
使用跳转指令,其跳转空间受到限制。

跳转指令1
1.B 跳转指令
格式:B{<cond>} <addr>;
功能: PC= PC+ addr左移两位
addr的值是相对当前PC(即寄存器R15)的值的一个偏移量,而不是一个绝对地址,它是24位有符号数。实际地址的值由汇编器来计算.
addr的值有符号扩展为32位后,左移两位,然后与PC值相加,即得到跳转的目的地址。
跳转的范围为-32MB~+32MB。
例如:
B exit; 程序跳转到标号exit处
…exit…

跳转指令2
2.BL 带返回的跳转指令
格式:BL{<cond>} <addr>;
功能:同B指令,但BL指令执行跳转操作的同时,还将PC(寄存器R15)的值保存到LR寄存器(寄存器R14)中。
该指令用于实现子程序调用,程序的返回可通过把LR寄存器的值复制到PC寄存器中来实现。
例如:
BL func; 调用子程序func
…
func
…
MOV R15,R14; 子程序返回

跳转指令2
由于返回地址保存在寄存器里,在保存R14之前不应再调用下一级的嵌套子程序;否则,新的返回地址将覆盖原来的返回地址,就无法返回到原来的调用位置。这时一般是把R14压入存储器中的堆栈。由于子程序经常还需要一些工作寄存器,所以可使用多寄存器存储指令同时把这些寄存器中原有的数据一起存储。
例如:
BL SUB1
…
SUB1 STMFD R13!,{R0-R2,R14};保存工作和链接寄存器
BL SUB2
…SUB2…
对于不调用其他子程序的子程序(叶子程序),不需要保存R14,因为它不会被覆盖。

跳转指令3
3.BLX 带返回和状态切换的跳转指令
格式:BLX <addr>;或BLX <Rn>;
功能:处理器跳转到目标地址处,并将PC(寄存器R15)的值保存到LR寄存器(R14)中。
若为第二种格式,寄存器Rn的值是转移目标,Rn的第0位拷贝到CPSR中的T位(决定是继续执行还是切换到Thumb指令),[31:0]位移入PC;
如果Rn[0]是1,则处理器切换执行Thumb指令,并在Rn中的地址开始执行,但是需将最低为清零;如果Rn[0]是0,则处理器继续执行ARM指令,并在Rn中的地址处开始执行,但需将Rn[1]清零。
该指令用于子程序调用和程序状态的切换。
例如:
BLX T16; 跳转到标号T16处执行,T16后面的指令为Thumb指令
…
CODE16
T16 后面指令为Thumb指令
…

跳转指令4
4.BX 带状态切换的跳转指令
格式:BX <Rn>;
功能:处理器跳转到目标地址处,从那里继续执行;
目标地址为寄存器Rn的值和0xFFFFFFFE作与操作的结果。
目标地址处的指令可以是ARM指令,也可以是Thumb 指令。
例如:
ADR R0,exit ;标号exit处的地址装入R0中
BX R0 ;跳转到exit处

Load/Store指令
Load/Store指令用于寄存器和内存间数据的传送。
Load用于把内存中的数据装载到寄存器中。
Store用于把寄存器中的数据存入内存。
该集合的指令使用频繁,在指令集中最为重要,因为其他指令只能操作寄存器,当数据存放在内存中时,必须先把数据从内存装载到寄存器,执行完后再把寄存器中的数据存储到内存中。
Load/Store指令分为3类:
(1)单一数据传送指令(LDR和STR等)
(2)多数据传送指令(LDM和STM)
(3)数据交换指令(SWP和SWPB)

条件执行的举例
将流程图对应GCD算法转换成
1) 普通汇编代码
2)ARM 汇编代码.
只使用 CMP, B 及 SUB指令

条件执行的举例
普通汇编代码
gcd cmp r0, r1 ;reached the end?
beq stop
blt less ;if r0 > r1
sub r0, r0, r1 ;subtract r1 from r0
bal gcd
less sub r1, r1, r0 ;subtract r0 from r1
bal gcd
stop
ARM 代码
gcd cmp r0, r1 ;if r0 > r1
subgt r0, r0, r1 ;subtract r1 from r0
sublt r1, r1, r0 ;else subtract r0 from r1
bne gcd ;

Load/Store指令1-1
1.LDR 字数据加载指令
格式:LDR{<cond>} <Rd>,<addr>;
功能:把addr所表示的内存地址中的字数据装载到目标寄存器Rd中,同时还可以把合成的有效地址写回到基址寄存器。
地址addr可以是一个简单的值、一个偏移量,或者是一个被移位的偏移量。
寻址方式:
Rn:基址寄存器。
Rm:变址寄存器。
Index:偏移量,12位的无符号数。
LDR Rd,[Rn]
;把内存中地址为Rn的字数据装入寄存器Rd中
LDR Rd,[Rn,Rm]
;将内存中地址为Rn+Rm的字数据装入寄存器Rd中

Load/Store指令1-2
LDR Rd,[Rn,#index]
;将内存中地址为Rn+index的字数据装入Rd中
LDR Rd,[Rn,Rm,LSL#5]
;将内存中地址为Rn+Rm×32的字数据装入Rd
LDR Rd,[Rn,Rm] !
;将内存中地址为Rn+Rm的字数据装入Rd,并将新地址Rn+Rm写入Rn
LDR Rd,[Rn,#index] !
;将内存中地址为Rn+index的字数据装入Rd,并将新地址Rn+index写入Rn
LDR Rd,[Rn,Rm,LSL#5]!
;将内存中地址为Rn+Rm×32的字数据装入Rd,并将新地址Rn+Rm×32写入Rn

Load/Store指令1-3
LDR Rd,[Rn],Rm
;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+Rm写入Rn
LDR Rd,[Rn],#index
;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+index写入Rn
LDR Rd,[Rn],Rm,LSL#5
;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+Rm×32写入Rn
例如:
LDR R0,[R1,R2,LSL#5]!
; 将内存中地址为R1+R2×32的字数据装入寄存器R0,并将新地址R1+R2×32写入R1

Load/Store指令2
LDRB 字节数据加载指令
格式:LDR{<cond>}B <Rd>,<addr>;
功能:同LDR指令,但该指令只是从内存读取一个8位的字节数据而不是一个32位的字数据,并将Rd的高24位清0。
例如:
LDRB R0,[R1]
;将内存中起始地址为R1的一个字节数据装入R0中

Load/Store指令3
3.LDRBT 用户模式的字节数据加载指令
格式:LDR{<cond>}BT <Rd>,<addr>;
功能:同LDRB指令,但无论处理器处于何种模式,都将该指令当作一般用户模式下的内存操作。

Load/Store指令4
4.LDRH 半字数据加载指令
格式:LDR{<cond>}H <Rd>,<addr>;
功能:同LDR指令,但该指令只是从内存读取一个16位的半字数据而不是一个32位的字数据,并将Rd的高16位清0。
例如:
LDRH R0,[R1]
;将内存中起始地址为R1的一个半字数据装入R0中

Load/Store指令5
5.LDRSB 有符号的字节数据加载指令
格式:LDR{<cond>}SB <Rd>,<addr>;
功能:同LDRB指令,但该指令将寄存器Rd的高24位设置成所装载的字节数据符号位的值。
例如:
LDRSB R0,[R1]
;将内存中起始地址为R1的一个字节数据装入R0中,R0的高24位设置成该字节数据的符号位

Load/Store指令6
6.LDRSH 有符号的半字数据加载指令
格式:LDR{<cond>}SH <Rd>,<addr>;
功能:同LDRH指令,但该指令将寄存器Rd的高16位设置成所装载的半字数据符号位的值。
例如:
LDRSH R0,[R1]
;将内存中起始地址为R1的一个16位半字数据装入R0中,R0的高16位设置成该半字数据的符号位

Load/Store指令7
7.LDRT 用户模式的字数据加载指令
格式:LDR{<cond>}T <Rd>,<addr>;
功能:同LDR指令,但无论处理器处于何种模式,都将该指令当作一般用户模式下的内存操作。
addr所表示的有效地址必须是字对齐的,否则从内存中读出的数值需进行循环右移操作。

Load/Store指令8
8.STR 字数据存储指令
格式:STR{<cond>} <Rd>,<addr>;
功能:把寄存器Rd中的字数据(32位)保存到addr所表示的内存地址中,同时还可以把合成的有效地址写回到基址寄存器。
地址addr可以是一个简单的值、一个偏移量,或者是一个被移位的偏移量。
寻址方式同LDR指令。
例如:
STR R0,[R1,#5]!
;把R0中的字数据保存到以R1+5为地址的内存中,然后R1=R1+5

STR指令应用举例

 STR指令应用举例


Load/Store指令9
9.STRB 字节数据存储指令
格式:STR{<cond>}B <Rd>,<addr>;
功能:把寄存器Rd中的低8位字节数据保存到addr所表示的内存地址中。
其他用法同STR指令。
例如:
STRB R0,[R1]
;将寄存器R0中的低8位数据存入R1表示的内存地址中

Load/Store指令10
10.STRBT 用户模式的字节数据存储指令
格式:STR{<cond>}BT <Rd>,<addr>;
功能:同STRB指令,但无论处理器处于何种模式,该指令都将被当作一般用户模式下的内存操作。

Load/Store指令11
11.STRH 半字数据存储指令
格式:STR{<cond>}H <Rd>,<addr>;
功能:把寄存器Rd中的低16位半字数据保存到addr所表示的内存地址中,而且addr所表示的地址必须是半字对齐的。
其他用法同STR指令。
例如:
STRH R0,[R1]
;将寄存器R0中的低16位数据存入R1表示的内存地址中

存储格式对于加载/存储指令的影响

Load/Store指令12
12.STRT 用户模式的字数据存储指令
格式:STR{<cond>}T <Rd>,<addr>;
功能:同STR指令,但无论处理器处于何种模式,该指令都将被当作一般用户模式下的内存操作。

Load/Store指令13-1
13.LDM 批量数据加载指令
格式:
LDM{<cond>}{<type>} <Rn>{!},<regs>{^};
功能:从一片连续的内存单元读取数据到各个寄存器中,内存单元的起始地址为基址寄存器Rn的值,各个寄存器由寄存器列表regs表示。
该指令一般用于多个寄存器数据的出栈。
type字段种类:
IA:每次传送后地址加1。
IB:每次传送前地址加1。
DA:每次传送后地址减1。
DB:每次传送前地址减1。
FD:满递减堆栈。
ED:空递减堆栈。
FA:满递增堆栈。
EA:空递增堆栈。
注意:有一个约定,编号低的寄存器在存储数据或者加载数据时对应于存储器的低地址。

Load/Store指令13-2
例如 LDMIA/IB/DA/DB R13!,{R0-R1,R3};
各指令执行完后,结果如图所示。

Load/Store指令13-4
FD、ED、FA和EA指定是满栈还是空栈,是升序栈还是降序栈,用于堆栈寻址。
一个满栈的栈指针指向上次写的最后一个数据单元.
空栈的栈指针指向第一个空闲单元。
一个降序栈是在内存中反向增长而升序栈在内存中正向增长。

Load/Store指令13-5
格式:
LDM{<cond>}{<type>} <Rn>{!},<regs>{^};
{!}:若选用了此后缀,则当指令执行完毕后,将最后的地址写入基址寄存器。
{^}:当regs中不包含PC时,该后缀用于指示指令所用的寄存器为用户模式下的寄存器,否则指示指令执行时,将寄存器SPSR的值复制到CPSR中。

Load/Store指令14-1
14.STM 批量数据存储指令
格式:STM{<cond>}{<type>} <Rn>{!},<regs>{^};
功能:将各个寄存器的值存入一片连续的内存单元中,内存单元的起始地址为基址寄存器Rn的值,各个寄存器由寄存器列表regs表示。
该指令一般用于多个寄存器数据的入栈。
{^}:指示指令所用的寄存器为用户模式下的寄存器。
其他参数用法同LDM指令。
例如:
STMEA R13!,{R0-R12,PC}
;将寄存器R0~R12以及程序计数器PC的值保存到R13指示的堆栈中

Load/Store指令14-2
举例:其中R1为指令执行前的基址寄存器,R1’则为指令执行后的基址寄存器

Load/Store指令14-3
堆栈操作和数据块传送指令类似,也有4种模式,它们之间的关系如下表所示:

 Load/Store指令15
15.SWP 字数据交换指令
格式:SWP{<cond>} <Rd>,<op1>,[<op2>];
功能: Rd=[op2],[op2]=op1
从op2所表示的内存装载一个字并把这个字放置到目的寄存器Rd中,然后把寄存器op1的内容存储到同一内存地址中。
op1,op2均为寄存器。
例如:
SWP R0,R1,[R2]
;将R2所表示的内存单元中的字数据装载到R0,然后将R1中的字数据保存到R2所表示的内存单元中

Load/Store指令16
16.SWPB 字节数据交换指令
格式:SWP{<cond>}B <Rd>,<op1>,[<op2>];
功能:从op2所表示的内存装载一个字节并把这个字节放置到目的寄存器Rd的低8位中,Rd的高24位设置为0;然后将寄存器op1的低8位数据存储到同一内存地址中。
例如:
SWPB R0,R1,[R2]
;将R2所表示的内存单元中的一个字节数据装载到R0的低8位,然后将R1中的低8位字节数据保存到R2所表示的内存单元中

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

程序状态寄存器指令1
1.MRS 程序状态寄存器到通用寄存器的数据传送指令
格式:MRS{<cond>} <Rd>,CPSR/SPSR;
功能:用于将程序状态寄存器的内容传送到目标寄存器Rd中。
当进入中断服务程序或进程切换时,该指令可用来保存当前状态寄存器的值。
例如:
MRS R0,CPSR
;状态寄存器CPSR的值存入寄存器R0中

程序状态寄存器指令2
2.MSR 通用寄存器到程序状态寄存器的数据传送指令
格式:MSR{<cond>} CPSR/SPSR_<field>,<op1>;
功能:用于将寄存器Rd的值传送到程序状态寄存器中。
当退出中断服务程序或进程切换时,该指令可用来恢复状态寄存器的值。
操作数op1可以是通用寄存器或立即数。
<field>:用来设置状态寄存器中需要操作的位。
32位的状态寄存器可以分为4个域:
位[31:24]为条件标志位域,用f表示。
位[23:16]为状态位域,用s表示。
位[15:8]为扩展位域,用x表示。
位[7:0]为控制位域,用c表示。
例如:MSR CPSR_f,R0
;用R0的值修改CPSR的条件标志域
MSR CPSR_fsxc,#5; CPSR的值修改为5

协处理器指令
ARM处理器最多可支持16个协处理器,用于辅助ARM完成各种协处理操作。
在程序执行过程中,各协处理器只执行自身的协处理指令,而忽略属于ARM处理器和其他协处理器的指令。
ARM协处理器指令可分为3类:
(1)ARM处理器用于初始化协处理器的数据操作指令(CDP)。
(2)协处理器寄存器和内存单元之间的数据传送指令(LDC,STC)。
(3)ARM处理器寄存器和协处理器寄存器之间的数据传送指令(MCR,MRC)。

CDP协处理器操作指令
格式:CDP{<cond>}<p>,<opcode1>,<CRd>,<CRm>,<CRn>,<opcode2>;
功能:用于传递指令给协处理器p,要求其在寄存器CRn和CRm上,进行操作opcode1,并把结果存放到CRd中,可以使用opcode2提供与操作有关的补充信息。
指令中的所有寄存器均为协处理器的寄存器,操作由协处理器完成。
指令中:
P为协处理器编号;
CRd为目的寄存器的协处理器寄存器;
CRm和CRn为存放操作数的协处理器寄存器;
Opcode1和opcode2为协处理器即将执行的操作。
例如:CDP p5,5,c0,c1,c2,9;
该指令用于通知协处理器p5,在c1和c2上执行操作5和9,并将结果存放到c0中。

LDC协处理器数据读取指令
格式:LDC {<cond>}{L}<p>,<CRd>,<addr>;
功能:将addr表示的内存地址中的连续数据传送到目的寄存器CRd中。
L表示指令为长读取操作,比如用于双精度数据的传输;
目的寄存器CRd为协处理器的寄存器;
addr的寻址方式同LDR指令,其寄存器为ARM处理器的寄存器。
例如:
LDC p5,c1,[R1+5]:该指令用于将R1+5所对应的存储单元中的数据,传送到协处理器p5的寄存器c1中。

STC协处理器数据存储指令
格式:STC{<cond>}{L}<p>,<CRd>,<addr>;
功能:将寄存器CRd的值传送到addr表示的内存地址中。指令中各参数用法同LDC。
例如:STC p5,c1,[R1+5];
该指令用于将协处理器p5中寄存器c1的数据传送到R1+5所对应的存储单元中。

MCR ARM寄存器到协处理器寄存器的数据传送指令
格式:MCR{<cond>}<p>,<op1>,<Rd>,<CRn>,<CRm>{,op2};
功能:将ARM处理器的寄存器Rd中的数据传送到协处理器p的寄存器CRn,CRm中;op1,op2为协处理器将要执行的操作。
例如:MCR p5,5,R1,C1,C2,9;该指令将R1中的数据传送到协处理器p5的寄存器C1,C2中,协处理器执行操作5和9。

MRC 协处理器寄存器到ARM寄存器的数据传送指令
格式:MRC {<cond>}<p>,<op1>,<Rd>,<CRn>,<CRm>{,op2};
功能:将协处理器p的寄存器CRn,CRm的数据传送到ARM处理器的寄存器Rd中;op1,op2为协处理器将要执行的操作。
例如:MRC p5,5,R1,C1,C2,9;该指令将寄存器C1,C2中的数据传送到R1中,协处理器p5协处理器执行操作5和9。

异常中断指令1
1.SWI 软件中断指令
格式:SWI {<cond>} 24位的立即数;
功能:用于产生软件中断,以使用户程序调用操作系统的系统例程。
指令中24位的立即数指定用户程序调用系统例程的类型,其参数通过通用寄存器传递。
当24位的立即数被忽略时,系统例程类型由寄存器R0指定,其参数通过其他通用寄存器传递。
例如:
SWI 0X05; 调用编号为05的系统例程。

异常中断指令3
2.BKPT 断点中断指令
格式:BKPT 16位的立即数;
功能:用于产生软件断点中断,以便软件调试时使用。16位的立即数用于保存软件调试中额外的断点信息。
指令操作的伪代码:
if (not overdiden by debug hardware) then
R14_abt = adderss of BKPT instruction + 4
SPSR_abt = CPSR
CPSR[4:0] = 0b10111 /* 中止模式 */
CPSR[5] = 0 /* 使程序处于 ARM 状态, T Bit = 0*/
/* CPSR[6] is unchanged, fiq不变*/
CPSR[7] = 1 /* 禁止正常中断,I Bit = 1, 禁止irq */
if high vectors configured then
PC = 0xFFFF000C
else
PC = 0x0000000C



ARM处理器的指令集(3) 用于操作数传送到目的寄存器中。 **MOV R1,R0** ;将寄存器R0的值传送到寄存器R1中。 **MVN R0,#0** ;将立即数0按位取反传送到寄存器R0中。 可以在MOV和MVN后面加S,S会改变CPSR的值,不加就不会改变。 阅读详情

相关推荐

ARM NEON指令集总结

ARM的NEON是类似于X86的SSE2的一种优化的指令集,主要就是为了实现SIMD全称Single Instruction Multiple Data,单指令多数据流,能够复制多个操作数,并把它们打包在大型寄存器的一组指令集。简单来说就是处理一些算法的时候,可以并行处理,大大提高了效率。 在Android手机上大部分都是ARM架构的,我们开启NEON后就可以使用这些指令集了,当然可以使用汇编,...

JabamiYu的博客 2万+

ARM 指令集

http://wenku.baidu.com/view/7efbd1116edb6f1aff001fc9.html 文章转载于该网页,留下记号,以后供参考~谢谢作者! ARM指令集详解 ARM可以用两套指令集:ARM指令集和Thumb指令集。本文介绍ARM指令集。在介绍ARM指令集之前,先介绍指令的格式。 1  指令格式         (1)基本格式         {}{S},{

digent的专栏 3306

ARM 指令集(ubuntu环境学习) 第一章:ARM 指令集概述

本文介绍了 ARM 架构及其指令集的基本概念,包括 ARM、Thumb、Thumb-2 和 AArch64 指令集的特点和应用场景。ARM 架构的精简指令集、高效能和低功耗特性,使其成为嵌入式开发和高效能计算应用的首选。接下来的章节将深入探讨 ARM 指令集的具体使用方式,并演示如何在 Ubuntu 环境中调试 ARM 程序,帮助开发者快速掌握 ARM 开发技巧。

hemoparrot的专栏 1874

【ARM汇编】ARM 指令集和Thumb 指令集

指令集汇总关于指令集ARM指令集Thumb指令集简单的指令集操作 关于指令集 指令集是汇编的基础,是芯片的架构,不懂指令集看着汇编就只能干瞪眼了,所以把ARM指令集全都记录下来做个笔记。 可能会和WIN32的指令集有出入,比如WIN32中MOV可以把数据从内存中加载到寄存器中去,但在ARM的RISC结构中,MOV只能将数据从寄存器移动到寄存器,WIM32的看小甲鱼的视频。说白了X86是复杂指令集(CISC),ARM是精简指令集(RISC)。 复杂指令集是将很多操作集成起来,精简是可以很细节的去处理。 51的

阿蛋的博客 3312

ARM 之十五 扫盲 ARM 架构、指令集、ARM IP、授权方式

  ARM 架构的 MCU 用了好多年,对于 ARM 架构也或多或少的有了一些了解。之前都是遇到啥问题直接去官网找对应的手册,一直没有系统的总结一下。是时候总结一下,好进行下一步学习了! ARM 文档   在了解 ARM 相关的各种概念之前,先来简单说一下 ARM 官方提供的文档的组织结构。其实,国外这些大公司对于文档的组织都是比较规范的,例如,ST 的 参考手册、数据手册、应用手册等等,ARM 文档也基本如此,分为参考手册、用户指南。这么划分的目的就是为了让各部分更加独立。简单来说,参考手册仅介绍原理,用

技术干货 2万+

【愚公系列】2023年06月 ARM汇编教程(ARM和X86指令集比较)

ARM指令集和X86指令集都是计算机处理器的指令集架构。它们指定了一组可执行的机器指令,用于运行程序和控制计算机的各个部分。ARM指令集是一种基于精简指令集(RISC)的架构,用于移动设备和嵌入式系统。它由英国的ARM公司开发,并广泛用于智能手机、平板电脑、手持式游戏机等设备中。X86指令集是一种基于复杂指令集(CISC)的架构,用于桌面电脑和服务器等计算机系统。它最初由英特尔公司开发,现在还由AMD等公司使用和发展着。

愚公智库 4698

ARM指令集和X86指令集的比较

一、背景知识:   指令的强弱是CPU的重要指标,指令集是提高微处理器效率的最有效工具之一。从现阶段的主流体系结构讲,指令集可分为复杂指令集(CISC)和精简指令集(RISC)两部分。相应的,微处理随着微指令的复杂度也可分为CISC及RISC这两类。   CISC是一种为了便于编程和提高记忆体访问效率的晶片设计体系。在20世纪90年代中期之前,大多数的微

zhaozhy55555的专栏 1万+

Deep Reinforcement Learning - 1. DDPG原理和算法

Deep Reinforcement Learning - 1. DDPG原理和算法 背景描述 DDPG的定义和应用场景 DDPG算法相关基本概念定义 DDPG实现框架和算法 DDPG对于DPG的关键改进 下一篇 以下用RL作为Reinforcement Learning 的简称。背景描述概括来说,RL要解决的问

kenneth_yu的博客 14万+

ARM 指令集 和 Thumb 指令集

From:https://gitee.com/lsliushuang/ASM/blob/master/arm汇编.txt ARM 汇编指令集汇总:https://blog.youkuaiyun.com/qq_40531974/article/details/83897559 ARM 指令集详解(超详细!带实例!):https://blog.youkuaiyun.com/mickey35/article/details/82011449 ARM 基础编程实验:https://blog.youkuaiyun.com/qq_405319...

freeking101的博客 5716

37张图详解MAC地址、以太网、二层转发、VLAN

MAC 地址 每个网卡或三层网口都有一个 MAC 地址, MAC 地址是烧录到硬件上,因此也称为硬件地址。MAC 地址作为数据链路设备的地址标识符,需要保证网络中的每个 MAC 地址都是唯一的,才能正确识别到数据链路上的设备。 MAC 地址由 6 个字节组成。前 3 个字节表示厂商识别码,每个网卡厂商都有特定唯一的识别数字。后 3 个字节由厂商给每个网卡进行分配。厂商可以保证生产出来的网卡不会有相同 MAC 地址的网卡。 现在可以通过软件修改 MAC 地址,虚拟机使用物理机网卡的 MAC 地址,并不能保.

networktp的博客 4745

VOSviewer文献可视化006:修改节点标签文字

由VOSviewer软件生成的可视化图形所显示的文字是小写的,有时候,我们希望其所显示的数据(如国家或作者的首字母等)能够以大写的方式呈现,这时可以进行对节点标签文字的修改操作,使图形显示我们想要的一个效果。

qq_41725964的博客 6150

CM4_ 3、ARM指令集

本文脉络一、导引何为指令1、经典ARM体系架构的指令集—ARM指令集、Thumb指令集1.1、Thumb指令集1.2、比较ARM指令集和Thumb指令集1.3、经典ARM体系架构指令集的缺点2、Cortex-M4体系架构的指令集—Thumb-2指令集二、指令的格式1、ARM 指令格式①ARM指令的条件码域②APSR 中的 5 个标志位:三、CM4常用的Thumb-2指令(待完善)分支指令: 一、...

言叶之庭 2165

手把手教你绕过网易易盾验证码:滑块、点选、语序全攻略

本文深度解析了以网易易盾为代表的现代验证码技术,重点探讨了滑块、点选、语序及空间推理等交互式验证码的工作原理与对抗策略。文章从行为验证和空间推理的核心逻辑出发,剖析了验证码交互的数据流与关键参数,并提供了模拟人类行为轨迹、维护设备指纹等工程实践方法,旨在帮助开发者在合规前提下设计更健壮的自动化流程。

3c4x5z6v7b的博客 704

ARM指令集与Thumb指令集

1、Thumb指令集来源 ARM的RISC体系结构的发展中已经提供了低功耗、小体积、高性能的方案。而为了解决代码长度的问题,ARM体系结构又开发了一种新的指令体系,就是Thumb指令集,称之为T变种。 Thumb是ARM体系结构的扩展(thumb不是一个完整的体系结构,不能指望处理器只执行thumb指令集而不支持arm指令集)。它从标准32位ARM指令集抽出来的36条指令格式,重新编成16位的操作码。这能带来很高的代码密度,例如:在1K的存储空间中,可以放32条ARM指令,就可以放64条Thumb指令,

wwwlyj123321的博客 6000

《统计学习方法》——李航 学习大纲

最近在学习李航写的统计学习方法概论, 每一章都用xmind理清了思路,括号里是书里的公式,第一次写博文,敬请指教~~~~ 第一章 统计学习方法论 第二章 感知机 每个方法其实只需要着重掌握三要素和输入输出就可以了,主要看模型、策略和算法。 感知机主要是二类分类的线性分类模型。 看到后面会注意感知机和支持向量机的区别。 第三章 k近

wjy619251334的博客 1万+

SAP-ABAP:SAP中的用户确认对话框:深入理解与实践POPUP_TO_CONFIRM

本文深入介绍了SAP中的用户确认对话框函数POPUP_TO_CONFIRM,包括其核心参数配置、返回值处理、应用场景和最佳实践。该函数是SAP二次开发中重要的交互工具,用于关键操作前获取用户确认,防止误操作。文章详细解析了参数设置技巧,强调必须全面处理所有可能的返回值,并提供了删除数据、批量操作等典型应用场景的代码示例。同时对比了其他类似弹出函数,帮助开发者选择合适工具。正确使用该函数可提升系统安全性、改善用户体验并符合SAP设计规范。

baidu_35680696的博客 970

一篇保你够用之ARM指令集总结

一.概念: 指令集指一个微处理器所有指令的集合。处理器的指令集可以分为CISC(复杂指令集)和RISC(精简指令集),ARM处理器使用RISC。 ARM处理器支持ARM和Thumb两种指令集:ARM指令集工作在32位模式下,指令长度都是32b;Thumb指令集工作在16位模式下,指令长度都是16b。 二.指令集种类 1.算术运算指令 1.1.ADD指令 ADD指令

1、测试博主技术知识分享 2、pos行业知识技术分享 3、java后端技术知识分享 4、嵌入式技术知识分享 5、运维部署相关知识分享 5264

9、硬件工程师笔试面试知识器件篇——三极管(2025版本)

本文全面介绍了三极管的基础知识与应用,包括其结构、类型、工作原理、工作状态、功能、应用场景及特性参数。详细探讨了三极管在信号放大、无线通信、音频设备及医疗设备中的具体应用,并深入分析了设计放大电路时如何平衡增益与噪声、优化偏置电路以提高稳定性、使用负反馈改善性能等关键问题。此外,文章还涵盖了高频电路设计、温度补偿策略、电磁干扰防护等实用内容,为硬件工程师提供了全面的技术参考和设计指导。

XU157303764的博客 7312

ARM和x86指令集简介

【代码】ARM和x86指令集简介。

qq_42233059的博客 1626

【EB-02】TC397 Tresos 最小工程配置

主要设置McalLibPublishedInformation 参数,会根据ResourceM配置的芯片自动加载。可以看到再工程目录中生成了output文件夹,里面由这些模块生成的头文件,编译脚本和epc文件。如果选择生成swcd,可以生成xxx_Bswmd.arxml给别的工具使用。如果没有Error和Problems就可以点击生成代码。点击工程校验看看工程是否由错误。

libuping2023的博客 324

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ARM指令集学习

ARM的指令集以精简、高效为特点,结合32位ARM指令、16位Thumb指令和Thumb-2扩展指令,提供了极高的灵活性。对于不同的应用场景,可以根据需求选择合适的指令模式,以达到性能与功耗的最佳平衡。

weixin_42452513的博客 858

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

ARM指令集和X86指令集对比

参考资料: ARM 和 x86 有什么区别? 0. 基础知识 指令的强弱是CPU的重要指标,指令集是提高微处理器效率的最有效工具之一。从现阶段的主流体系结构讲,指令集可分为复杂指令集(CISC)和精简指令集(RISC)两部分。相应的,微处理随着微指令的复杂度也可分为 CISC 及 RISC 这两类。 CISC是一种为了便于编程和提高存储器访问效率的芯片设计体系。在20世纪90年代中期之前,大多数的微处理器都采用CISC体系,包括Intel 的 80x86 和 Motorola 的 68K 系列等。即通常所

sally的jerry 8022

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ARM指令集 VS thumb指令集

1 thumb指令集概述 为兼容数据总线宽度为16位的应用系统,ARM体系结构除了支持执行效率很高的32位ARM指令集以外,同时支持16位的Thumb指令集。 Thumb指令集是ARM指令集的一个子集,是针对代码密度问题而提出的,它具有16位的代码宽度。与等价的32位代码相比较,Thumb指令集在保留32位代码优势的同时,大大的节省了系统的存储空间。Thumb不是一个完整的体系结构,不

NoteFAN的专栏 2046
上一篇: ARM指令格式和寻址方式
下一篇: 【嵌入式Linux学习七步曲之第三篇 Linux系统bootlaoder移植】U-BOOT全线移植分析系列之一--BOOTLOADER介绍
小文兄弟
博客等级 码龄17年 28粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值