ARM指令集
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
10
ARM指令集
ARM存储器访问指令
(4)LDM和STM [例 子] R8,{R0,R2,R9} R1!,{R3-R6,R11,R12} R13!,{R0,R4-R7,LR} R13!,{R0,R4-R7,PC}
LDMIA STMDB STMFD LDMFD
;寄存器进栈 ;寄存器出栈,从子程序返回
其中:type 必须是以下所列的其中之一: SH 对带符号半字(仅LDR); H 对无符号半字; SB 对带符号字节(仅LDR)。 label 程序相对偏移表达式。 label必须是在当前指令的±255字节范围内。 offset 加在Rn上的偏移量。
7
ARM指令集
ARM存储器访问指令
(2)LDR和STR——半字和带符号字节
助记符后缀 EQ NE CS/HS CC/LO MI PL VS VC HI LS GE LT GT LE AL
标
志
含
义
Z置位 Z清零 C置位 C清零 N置位 N清零 V置位 V清零 C置位且Z清零 C清零或Z置位 N和V相同 N和V不同 Z清零且N和V相同 Z置位或N和V不同 任何
相等 不等 大于或等于(无符号>=) 小于(无符号<) 负 正或零 溢出 未溢出 大于(无符号>) 小于或等于(无符号<=) 带符号>= 带符号< 带符号> 带符号<= 总是(通常省略)
每一条ARM指令包含4位的条件码,位于指 令的最高4位[31:28]。 例如跳转指令B可以加上后缀EQ变为BEQ表 示“相等则跳转”,即当CPSR中的Z标志置位 时发生跳转。
2
ARM指令集
操作码[31:28] 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110
8
ARM指令集
ARM存储器访问指令
(3)LDR和STR——双字 加载两个相邻的寄存器和存储两个相邻的寄存器,64位双字。这 些指令有4种可能的形式:零偏移、前索引偏移、程序相对偏移、 后索引偏移。以同样的顺序,4种形式的句法为 op {cond} D Rd, [Rn] op {cond} D Rd, [Rn, offset] {!} op {cond} D Rd, label op {cond} D Rd, [Rn], offset [例 子] LDRD LDRMID STRD STRD LDREQD
16
ARM指令集
ARM转移指令
(1)B和BL B(Branch)指令引起处理器转移到label。 句法: B {cond} label BL(Branch and Link)指令将下一条指令的地址拷贝 到R14(LR,链接寄存器),并引起转移到label。 句法: BL {cond} label
14
ARM指令集
ARM数据处理指令
算术/逻辑运算指令
15
ARM指令集
ARM数据处理指令
前导零计数
乘法指令
CLZ指令对Rm中值的前导零的个数进行计数,结果放到Rd中。若 源寄存器全为0,则结果为32。若位[31]为1,则结果为0 。 句法:CLZ {cond} Rd, Rm
•MUL指令将Rm和Rs中的值相乘,并将最低有效的32位结果放到Rd中。 句法:MUL {cond} {S} Rd,Rm,Rs •MLA指令将Rm和Rs中值相乘,再加上Rn的值,并将最低有效的32位结果放到Rd中。 句法:MLA {cond} {S} Rd,Rm,Rs,Rn •UMULL指令将Rm和Rs中的值解释为无符号整数。该指令将这两个整数相乘,并将结 果的最低有效32位放在RdLo中,最高有效32位放在RdHi中。 •UMLAL指令将Rm和Rs中的值解释为无符号整数。该指令将这两个整数相乘,并将64 位结果加到RdHi和RdLo中的64位无符号整数上。 •SMULL指令将Rm和Rs中的值解释为带符号的补码整数。该指令将这两个整数相乘, 并将结果的最低有效32位放在RdLo中,将最高有效32位放在RdHi中。 •SMLAL指令将Rm和Rs中的值解释为带符号的补码整数。该指令将这两个整数相乘, 并将64位结果加到RdHi和RdLo中的64位带符号补码整数上。 句法:op {cond} {S} RdLo,RdHi,RBiblioteka Baidu,Rs
6
ARM指令集
ARM存储器访问指令
(2)LDR和STR——半字和带符号字节 这些指令有4种可能的形式:零偏移、前索引偏移、程序相对 偏移和后索引偏移。以同样的顺序,4种形式的句法为 op {cond} type Rd, [Rn] op {cond} type Rd, [Rn, offset] {!} op {cond} type Rd, label op {cond} type Rd, [Rn], offset
R6,[R11] R4,[R7],R2 R4,[R9,#24] R0,[R9,-R2]! R8,abc4
9
ARM指令集
ARM存储器访问指令
(4)LDM和STM
加载多个寄存器(LDM)和存储多个寄存器(STM)。可以传送R0-R15的任 何组合。 句法: op {cond} mode Rn{!},reglist{^} 其中:mode 是IA/IB/DA/DB/FD/ED/FA/EA中的一个. Rn 基址寄存器,装有传送数据的初始地址。Rn不允许是R15。 ! 可选后缀。若有“!”,则最后的地址写回到Rn。 reglist 加载或存储的寄存器列表,包含在括号中。 ^ 可选后缀,不允许在用户模式或系统模式下使用。 若op是LDM且reglist中包含PC(R15),那么除了正常的多寄存 器传送外,将SPSR也拷贝到CPSR中。这用于从异常处理返回,仅 在异常模式下使用。 数据传入或传出的是用户模式的寄存器,而不是当前模式的寄 存器。
;常量值的范围为0~4 095 STRB R0,[R3, -R8,ASR #2] ;R0[R3-R8/4],存储R0的最低有效 ;字节,R3和R8不变 STR R5,[R7], #-8 ;R5[R7],R1R7-8 LDR R0,localdata ;加载一个字,该字位于标号lacaldata所在地址
3
ARM指令集
2 、指令分类说明
32位ARM指令集由13种基本指令类型组成,分成4大类: 3种类型的存储器访问指令:控制存储器和寄存器之间的 数据传送。一种类型用于优化的灵活寻址;另一种类型用 于快速上下文切换;第三种类型用于交换数据。 3种类型的数据处理指令:使用片内ALU、桶形移位器和 乘法器针对31个寄存器完成高速数据处理操作。 4种类型的分支指令:控制程序执行流程、指令优先级以 及ARM代码和Thumb代码的切换。 3种类型的协处理器指令:专用于控制外部协处理器。这 些指令以开放和统一的方式扩展了指令集的片外功能。
[例 子] LDREQSH R11,[R6] ;(有条件地)R11[R6],加载16位半字,
;带符号扩展到32位 LDRH R1,[R0,#22] ;R1[R0+22],加载16位半字,零扩展到32位 STRH R4,[R0,R1]! ;R4[R0+R1],存储最低的有效半字到R0+R1 ;地址开始的两个字节,地址写回到R0 LDRSB R6,constf ;加载位于标号constf地址中的字节,带符号扩展
ARM指令集
ARM存储器访问指令
(1)LDR和STR——字和无符号字节
[例 子]
LDR R8,[R10] ; R8[R0] LDRNE R2,[R5,#960]! ;(有条件地)R2[R5+960],R5R5+960 STR R2,[R9,#consta-struc] ;consta-struc是常量的表达式,该
ARM指令集
ARM指令集
ARM微处理器的指令集是加载/存储型的, 即指令集仅能处理寄存器中的数据,而且处理 结果都要放回寄存器中,而对系统存储器的访 问则需要通过专门的加载/存储指令来完成。
1
ARM指令集
1、条件执行
当处理器工作在ARM状态时,几乎所有的指 令均根据CPSR中条件码的状态和指令的条件域 有条件地执行,并使用后缀“S”来区分是否根 据执行结果修改条件码标志。
在这种情况下,寄存器的内容与存储器的内容进行交换。
Rn
ARM寄存器。Rn的内容指定要进行数据交换的存储器的
地址。Rn必须与Rd和Rm不同。
13
ARM指令集
ARM数据处理指令
数据处理类指令格式:
<opcode>{<cond>}{S} {Rd}, {Rn}, <shifter_operand> opcode:操作码,如ADD、SUB、ORR cond:条件码 S:本指令是否更新CPSR中的状态标志位 Rd:目标寄存器 Rn:第一个源寄存器 shifter_operand:复合的源操作数,其格式: 立即数 ADD R1,R2,#0x35 寄存器 SUBS R3,R2,R1 寄存器移位 ADDEQS R9,R5,R5, LSL #3 SUB R3,R2, R1,ROR R7
(2)BX :引起处理器转移到Rm中的地址。若Rm的位[0]为1, 则指令集变换到Thumb。 句法: BX {cond} Rm (3)BLX:带链接转移并可选地交换指令集。 句法: BLX {cond} Rm BLX label
17
ARM指令集
ARM协处理器指令
(1)CDP,协处理器数据操作指令 句法:CDP {cond} coproc,opcode1,CRd,CRn,CRm{,opcode2} 其中:coproc 指令操作的协处理器名。标准名为pn,其中n为0-15 范围内的整数。 opcode1 协处理器特定操作码。 Rd,Rn 源寄存器,不允许是R15。 CRd,CRn,CRm 协处理器寄存器。 opcode2 可选的协处理器特定操作码。 (2)MCR和MCRR,将数据从ARM寄存器传送到协处理器 句法: MCR {cond} coproc,opcode1,Rd,CRn,CRm{,opcode2} MCRR {cond} coproc,opcode1,Rd,Rn,CRm
12
ARM指令集
ARM存储器访问指令
(6)SWP
在寄存器和存储器之间进行数据交换。使用SWP来实现信号量。 句法: SWP {cond} {B} Rd, Rm, [Rn]
其中:B Rd
可选后缀。若有B,则交换字节;否则,交换32位字。 ARM寄存器。数据从存储器加载到Rd。
Rm
ARM寄存器。Rm的内容存储到存储器。Rm可以与Rd相同。
11
ARM指令集
ARM存储器访问指令
(5)PLD Cache预加载。使用PLD(PreLoaD)提示存储系统从后面几条新指令所 指定的存储器地址加载。存储系统可使用这种方法加速以后的存储器访问。 句法: PLD [Rn{Flexoffset}] [例 子] PLD [R2] PLD [R15,#280] PLD [R9,#-2481] PLD [R0,#av*4] ;av*4必须在汇编时求值,范围为-4095-4095 PLD [R0,R2] PLD [R5,R8,LSL #2]
4
ARM指令集
ARM存储器访问指令
(1)LDR和STR——字和无符号字节
字节加载是用“0”扩展到32位。LDR和STR都有如下4种可能的形式: 零偏移:Rn的值作为传送数据的地址。 句法: op {cond} {B} {T} Rd, [Rn] 前索引偏移:在数据传送之前,将偏移量加到Rn中。其结果作为传 送数据的存储器地址。若使用后缀“!”,则结果写回到Rn中,且 Rn不允许是R15。 句法: op {cond} {B} Rd, [Rn, Flexoffset] {!} 程序相对偏移:程序相对偏移是前索引形式的另一种版本。汇编器 由PC计算偏移量,并将PC作为Rn生成前索引指令。不能使用后缀“ !”。 句法:op {cond} {B} Rd, label 后索引偏移:Rn的值用做传送数据的存储器地址。在数据传送后, 将偏移量加到Rn中。结果写回到Rn。Rn不允许是R15。 句法:op {cond} {B} {T} Rd, [Rn], Flexoffset 5