第三章 ARM指令集3
第三章 ARM指令系统简介
(1).寄存器寻址
操作数的值在寄存器中,指令中的地址码字段指出
的是寄存器编号,指令执行时直接取出寄存器值来操
作。
寄存器寻址指令举例如下: R2 0xAA MOV R1,R2 ;将R2的值存入R1 R1 0xAA 0x55 SUB R0,R1,R2 ;将R1的值减去R2的值,结果保存到R0 MOV R1,R2
第三章 ARM指令系统简介
3.1 ARM处理器寻址方式
寻址方式是根据指令中给出的地址码字段来实现寻 找真实操作数地址的方式。ARM处理器具有9种基本寻址 方式。
(1).寄存器寻址;
(2).立即寻址;
(3).寄存器偏移寻址; (4).寄存器间接寻址; (5).基址寻址; (7).堆栈寻址; (9).相对寻址。 (6).多寄存器寻址; (8).块拷贝寻址;
STMFD sp!,{r4-r7,lr} 满递减
9753 8420 1234 1010 8034 FFFF A0BE 16 1234 102E 8765 FF ABCD 100
LDMFA sp!,{r4-r7,pc}
高地址
满递增
9753 8420 1234 1010 8034 A0BE AOBE 1234 FF 100 pc lr 9020 8034 9048
operand2:第2个操作数;
指令格式举例如下:
LDR BEQ ADDS
R0,[R1] D1
;读取R1地址上的存储器单元内容, ;执行条件AL ;分支指令,执行条件EQ,即相等则跳转到D1 ;加法指令,R1+1=>R1,影响CPSR ;寄存器(S) ;条件执行减法运算(NE), ;R1-0x10=>R1,影响CPSR寄存器(S)
常用arm指令集
常用arm指令集ARM指令集是一种广泛使用的指令集架构,被广泛应用于各种嵌入式系统、移动设备和服务器等领域。
它具有高效、灵活、可扩展等特点,是现代计算机体系结构的重要组成部分。
本文将介绍常用的ARM指令集。
一、ARM指令集概述ARM指令集是一种精简指令集(RISC)架构,它采用了精简的指令集来提高执行效率和降低功耗。
由于其精简化的设计,ARM处理器可以在更小的面积内实现更高的性能和更低的功耗。
目前,ARM处理器已经广泛应用于各种嵌入式系统、移动设备和服务器等领域。
二、常用ARM指令集1.数据处理指令数据处理指令是最基本和最常用的ARM指令之一。
它包括加法、减法、乘法、除法等运算操作。
这些操作不涉及内存访问,只对寄存器中的数据进行操作。
例如:ADD R1, R2, R3:将R2和R3中的值相加,并将结果存储到R1中。
SUB R1, R2, #10:将R2中的值减去10,并将结果存储到R1中。
MUL R1, R2, R3:将R2和R3中的值相乘,并将结果存储到R1中。
2.数据传输指令数据传输指令是用于在寄存器和内存之间传输数据的指令。
它包括从内存读取数据、向内存写入数据等操作。
例如:LDR R1, [R2]:从地址为R2的内存单元中读取一个字节的数据,并将其存储到寄存器R1中。
STR R1, [R2]:将寄存器R1中的值写入地址为R2的内存单元中。
3.分支指令分支指令用于实现程序跳转,包括无条件跳转、有条件跳转等操作。
它是实现程序控制流程的关键指令之一。
例如:B label:无条件跳转到标记为label的位置。
BEQ label:如果前一次比较结果为相等,则跳转到标记为label的位置。
4.逻辑运算指令逻辑运算指令用于实现与、或、非、异或等逻辑运算操作。
它通常用于实现位操作和掩码操作等功能。
例如:AND R1, R2, #0xFF:将寄存器R2和0xFF进行按位与操作,并将结果存储到寄存器R1中。
ORR R1, R2, #0xFF:将寄存器R2和0xFF进行按位或操作,并将结果存储到寄存器R1中。
3.ARM汇编指令集
(2)算术指令: ADD ADC SUB SBC RSB RSC
逻辑指令: AND ORR EOR BIC
比较指令: CMP CMN TST TEQ
数据搬移: MOV MVN
(3)加法指令 ADD R1,R2,R3 @ R1=R2+R3
64位乘法: MULL R0, R1, R2, R3 @{R1:R0}=R2*R3
【6】分支指令(偏移,跳转)
(1)指令格式
B{<cond>} label
BL{<cond>} subroutine_label
(2) b -- 无返回的跳转 -- c语言的goto
【1】测试一:
(1)mov r0,#16
mov r0,r1,ASR #4
MUL r1,r2,#3
mvn r0,r0 @r0=~r0
add r0,r0,#1
RSB R0,R0,#0 @R0 = 0-R0
比如:(1)0x1122
(2)0x8000007F
01 0001 0010 0010
0000 0000 0000 0000 0000 | 0111 1111 10| 00
用伪指令:
ldr r1,#0x1122
数据传输指令 MOV R1,R2 @ R1=R2
取反传送指令 MVN R1,R2 @ R1= ~R2
【2】乘法指令
32位乘法: MUL R1,R2,R3 @R1=R2*R3
mov r3,r1,LSL #2 @r3=r1*4=4
【8】立即数
(1)立即数:就是满足一定规则的数。
这个数可以用一个8位的数循环右移0--30之间的偶数位形成。
第三章 ARM指令系统
3.1 ARM指令系统概述
一、指令系统概念
指令:是规定计算机进行某种操作的命令。 指令系统:计算机能够执行的各种指令的集合。
二、ARM指令的特点
– – – – – – – 所有指令都是32位的。 大多数指令都在单周期内完成。 所有指令都可以条件执行。 ARM指令为load/store类型。 基本指令仅36条,分成五类。 有7种寻址方式。 指令集可以通过协处理器扩展。
指令条件码表
条件码
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100
助记符
EQ NE CS/HS CC/LO MI PI VS VC HI 志
Z=1 Z=0 C=1 C=0 N=1 N=0 V=1 V=0 C=1且Z=0 C=0或Z=1 N=V N!=V Z=0且N=V
0 0
下列命令中,汇编器把立即数转换为移位操作:
MOV R0,#4096 ; uses 0x40 ror 26 ADD R1,R2,#0xFF0000 ; uses 0xFF ror 16
带有立即数的MOV 指令的二进制编码为:
0xF200 =0xF2循环右移(2*C)
MOV R0,#0xF200
MOV R1,#0x110000 MOV R4,#0x12800
31 0 0
SUB R3,R2,R1,LSL #2 ;R3←R2-(R1左移2位) SUB R3,R2,R1,LSR R0 ;R3←R2-(R1右移R0位)
(3)ASL:算术左移,由于左移空出的有效 位用0填充,因此它与LSL同义。 (4)ASR:算术右移 (Arithmetic Shift Right) 。算术移位的对象是带符号数,移位过程 中必须保持操作数的符号不变。如果源操作数是 正数,空出的最高有效位用0 填充,如果是负 数用1填充。
第3章ARM的指令系统PPT课件
条件执行:所有指令都可条件执行 指令可以自己决定是否影响标志位
条件执行及标志位**
ARM指令可以通过添加适当的条件码后缀来达到条件 执行的目的。
这样可以提高代码密度,减少分支跳转指令数目,提高性能。
CMP r3,#0
CMP r3,#0
BEQ skip
ADDNE r0,r1,r2
ADD R2,R0,R1,LSR #5
MOV R1,R0,LSL #2
逻辑左移3位
R2 0x01
0x08
R0 0x5058
MOV R0,R2,LSL #311LSL移位操作:0
LSR移位操作:
0
ASR移位操作:
ROR移位操作:
RRX移位操作:
C
3.1 ARM处理器的寻址方式
3.1.2 内存访问指令寻址方式
;送0到R0
ADD R3,R3,#1 ;R3的值加1
CMP R7,#1000 ;R7的值和1000比较
9
3.1.1 数据处理指令寻址方式
2.寄存器寻址方式
寄存器的值可以被直接用于数据操作指令,这种寻址方 式是各类处理器经常采用的一种方式,也是一种执行效 率较高的寻址方式,如:
MOV R2,R0
后是否改变状态标志 状态标志位只有4位 有两种指令密度 无整数除法指令 大多数ARM指令都可以条件执
行 有适合DSP处理的乘加指令 Load/Store访存体系结构
x86指令集
非规整指令格式 即:非正交指令格式
二地址指令 指令隐含决定运算完毕后是否
改变状态标志 状态标志位有6位 单一指令密度 有整数除法指令 专用条件判断指令进行程序分
下表为所有可能的条件码:
注意:AL为默认状态,不需要单独指出
第3.1章ARM指令集
(3)MOV、MVN
MOV MVN R9,R2 R9,R2 //取反传送,R2每位取反->R9
27
(4)CMP、CMN
CMP CMN
R9,R2 R9,R2
28
(5)TST、TEQ
TST R2,#0xFF00 //位与操作,结果丢弃,更新CPSR TEQ R10,R9 //用于测是否相等 //按位异或操作,更新CPSR
扩展域(PSR[15:8])(未使用) 状态域(PSR[23:16])(未使用) 标志域(PSR[31:2 CPSR_f ,#0xf0000000 MRS R0, CPSR ORR R0, R0, #0x20000000 MSR CPSR_f, R0
;设置所有标志位 ;设置R0的29位
32
指令中第二操作数的寻址方式:
前变址模式: LDR R0,[R1,#4] ;R0←[R1+4] 自动变址模式: LDR R0,[R1,#4]!;R0←[R1+4]、R1←R1+4 后变址模式: LDR R0,[R1],#4 ;R0←[R1]、R1←R1+4
寄存器间接寻址 LDR R0,[R1]
33
B 转移指令 BL 带链接的转移指令 BX 带状态切换的转移指令
40
四、转移指令
转移和转移链接指令
B ,BL
汇编格式如下: B{L}{<cond>}
<target address>
B 转移指令 :完成简单的跳转,可跳转到指令中 指定的目的地址 BL 带链接的转移指令:在跳转的同时,把转移 指令后面紧接的指令地址保存到LR(R14)中
/*R0←[R1]*/ /*[R1]←R0*/
第一条指令将以R1的值为地址的存储器中的数据 传送到R0中。第二条指令将R0的值传送到以R1的值为 地址的存储器中。
《ARM指令集》课件
3
2000年代至今
随着移动设备的普及,ARM指令集在智能手机 、平板电脑等领域得到广泛应用。
ARM指令集的特点和优势
低功耗
ARM指令集以其低功耗特性而闻名,适合于移动设备和嵌入式系统。
高性能
ARM指令集采用精简的指令集设计,使得处理器能够快速执行指令,提高性能。
ARM指令集还支持流水线技术,即将一条指令的执行分为取指、译码、执行、存回等多个阶段,以提高 程序的执行效率。
03
ARM指令集的编程实践
ARM指令集在汇编语言中的应用
01
ARM指令集在汇编语言中主要用于编写低级程序,如操作系统内核、 驱动程序等。
02
ARM指令集提供了丰富的控制和数据处理指令,使得汇编语言能够高 效地控制硬件和执行复杂的数据处理任务。
01
指令级并行
在同一时钟周期内,处理多条指令 。
线程级并行
利用多线程并行执行,提高整体性 能。
03
02
数据级并行
对数据进行分组处理,提高处理速 度。
任务级并行
将复杂任务分解为多个子任务,并 行执行。
04
ARM指令集的功耗优化技术
动态电压频率调节
根据实际需求调整电压和频率,降低功耗。
低功耗模式
在空闲或低负载时,进入低功耗模式,降低 功耗。
易于移植
ARM指令集具有良好的可移植性,使得软件在不同ARM处理器之间易于移植。
开放架构
ARM指令集采用开放架构,允许厂商根据需求进行定制和扩展。
ARM指令集的应用领域
智能手机
ARM指令集广泛应用于智能 手机领域,包括苹果、三星
、华为等知名品牌。
第三讲 ARM指令集
“8-bits rotated right by an even number of bit positions”
关于立即数的例子!
汇编器把立即数转换为移位的方式
MOV r0, #0x4096; 0x40循环右移26位 ADD r1,r2,#0xFF0000; 0xFF循环右 移16位
11 rot x2 8 7 immed_8 0
Quick Quiz:
Shifter ROR
0xe3a004ff MOV r0, #???
4 bit rotate value (0-15) is multiplied by two to give range 0-30 in steps of 2 Rule to remember is
指令格式<opcode>{<cond>}{S} <Rd>, <Rn>{,<operand2>}
Conditional Execution and Flags
ARM instructions can be made to execute conditionally by post-fixing them with the appropriate condition code This can increase code density and increase performance by reducing the number of forward branches r0 - r1, compare r0 with r1 and set flags CMP r0, r1 ADDGT ADDLE r2, r2, #1 r3, r3, #1 if > r2=r2+1 flags remain unchanged if <= r3=r3+1 flags remain unchanged
三、ARM指令集
IMPORT用于表示引 用于表示引 进外部其他文件的变 量程序标号等。 量程序标号等。 EXPORT表示后面 表示后面 的变量标号等是公共 的,外部其他文件的 程序也可以看见并使 用。
EXPORT Reset EXPORT __user_initial_stackheap
CODE32 AREA表示是一个区 表示是一个区 AREA vectors,CODE,READONLY 可以是代码, 域,可以是代码,也 ENTRY 可以是数据, 可以是数据,由跟在 ;中断向量表 中断向量表 后面的第二个参数决 Reset 这里的CODE 定 ,这里的 LDR PC, ResetAddr 表明这是一个代码区 LDR PC, UndefinedAddr 域。 LDR PC, SWI_Addr LDR PC, PrefetchAddr 第一个参数是表示这 LDR PC, DataAbortAddr 个区域的名字, 个区域的名字,可以 DCD 0xb9205f80 任意给定。 任意给定。 LDR PC, [PC, #-0xff0] LDR PC, FIQ_Addr ENTRY是表示是程 是表示是程 ResetAddr DCD ResetInit 序的入口, 序的入口,一个程 UndefinedAddr DCD Undefined 序可以有很多入口, SWI_Addr DCD SoftwareInterrupt 序可以有很多入口, PrefetchAddr DCD PrefetchAbort 需要编译器指定初
常用的指令
需要认真掌握的指令有: 需要认真掌握的指令有: MOV AND SUB ADD CMP ORR BIC LDR STR B BL MRS MSR
以上指令的具体使用请参考教科书第二章
ARM指令需要注意的知识点 指令需要注意的知识点
第三章 ARM指令集与编程
(2)ARM指令的条件码(续)
1000 1001 1010 1011 HI LS GE LT C置位且Z清0 C清0或Z置位 N等于V N不等于V 无符号高于 无符号低于或等于 有符号大于或等于 有符号小于
1100 1101 1110 1111
GT LE AL NV
Z清0且N等于V Z置位或N不等于V 任何状态 无
堆栈和块拷贝角度的多寄存器加载和存储指令映射堆栈用一般数据存取堆栈用一般数据存取l位存取位存取p位前变址位前变址后变址u位加位加减空向下生长型之前增量减空向下生长型之前增量ldmedldmib111满向下生长型之后增量ldmfdldmia101空向上生长型之前增量ldmealdmdb110满向上生长型之后增量ldmfaldmda100满向上生长型之前增量stmfastmib011空向上生长型之后增量stmeastmia001空向下生长型之前增量stmfdstmdb010满向下生长型之后增量stmedstmda000328相对寻址?相对寻址是变址寻址的一种变通由程序计数器pc提供基地址
(2) ARM指令的条件码
0000 EQ Z置位 相等/等于0
0001
0010
NE
CS/HS
Z清0
C置位
0011 0100 0101 0110 0111
CC/LO MI PL VS VC
C清0 N置位 N清0 V置位 V清0
不等 进位/无符号高于或 等于 无进位/无符号低于 负数 非负数 溢出 无溢出
逻辑移位
LSL:逻辑左移(Logical Shift Left)。寄存器中字的低 端空出的位补0。 · LSR:逻辑右移(Logical Shift Right)。寄存器中字的 高端空出的位补0。 · ASR:算术右移(Arithmetic Shift Right)。算术移位的 对象是带符号数,在移位过程中必须保持操作数的符号 不变。若源操作数为正数,则字的高端空出的位补0。若 源操作数为负数,则字的高端空出的位补1。 · ROR:循环右移(Rotate Right)。从字的最低端移出的 位填入字的高端空出的位。 · RRX:扩展为1的循环右移(Rotate Right Extended by 1 place)。操作数右移一位,空位(位[31])用原C标志 填充。
[高等教育]第二讲 ARM指令集_OK
12
具体寻址类型
2.第二操作数为寄存器 • 汇编语法格式:<Rm>
2021/8/18
13
具体寻址类型
3.第二操作数为寄存器移位方式,且移位的位数为一个5位的立即数 • 汇编语法格式: <Rm>,<shift> #<shift_amount>
2021/8/18
移位类型
14
具体寻址类型
4.第二操作数为寄存器移位方式,且移位数值放在寄存器中 • 汇编语法格式:<Rm>,<shift> <Rs>
2021/8/18
27
半字、有符号字节寻址
• 这类指令可用来加载有符号字节、加载有符号半字、加载/存储无符号半字。 • Load/Store指令对半字、有符号字节操作指令编码格式如下:
2021/8/18
28
Load/Store指令对半字、有符号字节操作指 令语法
• 加载有符号字节到寄存器: • LDR {<cond>}SB <Rd>,<addressing_mode> • 加载有符号半字到寄存器: • LDR {<cond>}SH <Rd>,<addressing_mode> • 加载无符号半字到寄存器: • LDR {<cond>}H <Rd>,<addressing_mode> • 存储无符号半字到内存: • STR {<cond>}H <Rd>,<addressing_mode>
2021/8/18
20
2021/8/18
21
1.Addressing_mode中的偏移量为立 即数
第3章2 ARM指令系统
嵌入式技术基础
ARM指令集_分支指令
分支指令用于实现程序流程的跳转、改变程序执行流 程或调用子程序。 ARM有两种方式实现跳转: 使用跳转指令直接跳转 直接向PC寄存器赋值实现跳转 跳转指令种类: 带状态切换的跳转指令BX 立即跳转指令B 带链接的跳转指令BL
第三章 ARM指令系统
嵌入式技术基础
3.2.1 分支并且转换状态指令(BX—branch and exchange)
分支并且转换状态指令BX,在指令中指定了一个Rn寄存器, 将Rn内容拷贝到PC,同时使PC[0]=0; 把Rn[0]的值送CPSR的T位。如果Rn[0]=1,则T=1,将处理器 状态转换成Thumb状态,把目标地址处的代码解释为Thumb代 码; 如果Rn[0]=0,则T=0,将处理器状态转换成ARM状态,把目 标地址处的代码解释为ARM代码。
LDM/STM指令用于堆栈操作或块数据传送,主要用途为保护现场、块 数)当前方式可见寄存器 组的一个子集或全部寄存器。
第三章 ARM指令系统
嵌入式技术基础
带链接的跳转指令BL 指令格式
BL{cond} label
指令功能
将下一条指令的地址复制到R14(即LR)链接寄存器中, 然后跳转到指定地址运行程序。
实例
BL DELAY ;跳转到DELAY标号处,同时将 ; PC的值保存到LR寄存器中
第三章 ARM指令系统
第三章 ARM指令系统
图3.2
数据处理各指令含义
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作
Rd←[addr],addr索引 Rd←[addr],addr索引 Rd←[addr],addr索引
条件码位置
LDR{cond} LDR{cond}B LDR{cond}T LDR{cond}BT LDR{cond}H LDR{cond}SB LDR{cond}SH
•LDR和STR——字和无符号字节加载/存储指令 LDR指令用于从内存中读取单一字或字节数据存入寄存 器中,STR指令用于将寄存器中的单一字或字节数据保存到 内存。指令格式如下:
LDR{cond}{T} Rd,<地址> STR{cond}{T} Rd,<地址> ;将指定地址上的字数据读入Rd ;将Rd中的字数据存入指定地址
LDR{cond}B{T} Rd,<地址> ;将指定地址上的字节数据读入Rd
STR{cond}B{T} Rd,<地址> ;将Rd中的字节数据存入指定地址
其中,T为可选后缀
若指令有T,那么即使处理器是在特权模式下,存储系统也将访问 看成是在用户模式下进行的。T在用户模式下无效,不能与前索引 偏移一起使用T
ARM存储器访问指令——单寄存器存取
例:变量的访问
AddCount & 0x40003000 …… LDR R0, AddCount LDR R1, [R0] ADD R1, R1, #1 STR R1, [R0] ……
ARM存储器访问指令——多寄存器存取
助记符 说明 操作
reglist←[Rn...], Rn回写等 [Rn...]←reglist, Rn回写等
ARM存储器访问指令——单寄存器存取
•LDR和STR指令应用示例:
2.加载/存储半字和有符号字节指令 LDRSB R1,[R0,R3]
;将R0+R3地址上的字节数据存入R1,
;高24位用符号扩展 LDRH R6,[R2],#2 ;将R2指向地址的半字数据存入R6,高16位用0扩展 ;读出后,R2=R2+2 STRH R1,[R0,#2]! ;将R1的半字数据保存到R0+2地址, ;只修改低2字节数据,然后R0=R0+2
; R1← [R0+R2*4],同时R0= R0+R2*4
ARM存储器访问指令——单寄存器存取
•LDR和STR——字和无符号字节加载/存储指令 从寻址方式的地址计算方法分,加载/存储指令有以下 4种格式: 零偏移 前索引偏移 程序相对偏移 后索引偏移 如:LDR Rd,[Rn] 如:LDR Rd,[Rn,#0x04]! 如:LDR Rd,labe1 如:LDR Rd,[Rn],#-0x04
4010H
400CH
R1
指令STMIA R1!,{R5-R7}
指令STMIB R1!,{R5-R7}
4014H R1 R7 R6 R5 R1’ 4010H R1 R7 R6 R1’ R5
4014H
4010H 400CH
400CH
4008H 4004H 4000H
4008H
4004H 4000H
ARM存储器访问指令——单寄存器存取
•LDR和STR——字和无符号字节加载/存储指令
LDR/STR指令寻址非常灵活,它由两部分组成,其中一部分为一个 基址寄存器,可以为任一个通用寄存器;另一部分为一个地址偏移量。地 址偏移量有以下3种格式: 立即数 立即数可以是一个无符号的数值。这个数据可以加到基址寄 存器,也可以从基址寄存器中减去这个数值。 LDR R1,[R0,#0x12]
STM{cond}<模式> cond——指令执行的条件 模式——控制地址的增长方式,一共有8种模式
Rn{!},reglist{^}
Rn{!},reglist{^}
!——表示在操作结束后,将最后的地址写回Rn中
reglist——表示寄存器列表,可以包含多个寄存器,它们使用“,”隔开, 如{R1,R2,R6-R9}
满递减
满递增
LDMDB
LDMIB
LDMEA
LDMED
空递增空递减Fra bibliotek;使用数据块传送指令进行堆栈操作 STMDA R0!,{R5-R6}
;使用堆栈指令进行堆栈操作 STMED R13!,{R5-R6}
...
LDMIB R0!,{R5-R6}
...
LDMED R13!,{R5-R6}
两段代码的执行结果是一样的,但是使用堆栈指令的压栈和出栈操 作编程很简单(只要前后一致即可),而使用数据块指令进行压栈和出 栈操作则需要考虑空与满、加与减对应的问题。
LDR/STR指令用于对内存变量的访问、内存缓冲区数据的访问、查 表、外围部件的控制操作等。若使用LDR指令加载数据到PC寄存器,则 实现程序跳转功能,这样也就实现了程序散转 所有单寄存器加载/存储指令可分为 字和无符号字节加载存储指令 半字和有符号字节加载存储指令
ARM存储器访问指令——单寄存器存取
ARM存储器访问指令——单寄存器存取
•LDR和STR——字和无符号字节加载/存储指令编码
B 为 1—— 字 节 访 问 为0——字访问 P——前/后变址 指令执行的条件码 L区别加载(L为1)或 存储(L为0)
I为0时,偏移量为12 位立即数;为1时, 偏移量为寄存器移 位 U——加/减
为指令的寻址方式 Rd为源/目标寄存器 Rn为基址寄存器 W表示回写
ARM存储器访问指令——多寄存器存取
堆栈操作(4种模式)
数据块传送 存储 STMDA STMIA 堆栈操作 压栈 STMED STMEA 说明 空递减 空递增 数据块传送 加载 LDMDA LDMIA 堆栈操作 出栈 LDMFA LDMFD 说明 满递增 满递减
STMDB
STMIB
STMFD
STMFA
条件码位置
LDM{cond}{mode}
LDM{mode} Rn{!},reglist
多寄存器 加载 多寄存器 存储
STM{mode} Rn{!},reglist
STM{cond}{mode}
多寄存器加载/存储指令可以实现在一组寄存器和一块 连续的内存单元之间传输数据。LDM为加载多个寄存器; STM为存储多个寄存器。允许一条指令传送16个寄存器的 任何子集或所有寄存器。它们主要用于现场保护、数据复制、 常数传递等。
ARM存储器访问指令——多寄存器存取
数据块传送指令操作 ( 其 中 R1 为 指 令 执 行 前的基址寄存器,R1’ 则为指令执行后的基 址寄存器) R1 = 4010H
4020H R1’ R7 R6 R1 R5 4020H R1’
401CH
4018H 4014H
R7
R6 R5
401CH 4018H 4014H 4010H 400CH
^——可选后缀。不在用户模式或系统模式下使用
1)若op是LDM且寄存器列表包含R15时,那么除了正常的多寄存器 传送外,还将SPSR也复制到CPSR中。这用于异常处理返回,仅在异 常模式下使用
2)数据传入或传出的是用户模式下的寄存器,而不是当前模式的寄 存器
go
ARM存储器访问指令——多寄存器存取
ARM指令集——3
ARM指令分类
跳转指令
数据处理指令
寄存器/存储器数据传送指令 状态寄存器访问指令 异常中断指令 协处理器指令
ARM存储器访问指令
ARM处理器是典型的RISC处理器,对存储器的访问 只能使用加载和存储指令实现。ARM处理器是冯•诺依曼 存储结构,RAM存储空间及I/O映射空间统一编址,除对 RAM操作以外,对外围I/O、程序数据的访问均要通过加 载/存储指令进行。
; R1← [R0+0x12]
寄存器 寄存器中的数值可以加\减到基址寄存器 LDR R1,[R0,R2] LDR R1,[R0,-R2]
; R1← [R0+R2] ; R1← [R0-R2]
寄存器及移位常数 寄存器移位后的值可以加到基址寄存器,也可以 从基址寄存器中减去这个数值。 LDR R1,[R0,R2,LSL #2]!
指令STMDA R1!,{R5-R7}
指令STMDB R1!,{R5-R7}
back
多寄存器存取——应用
ARM存储器访问指令——单寄存器存取
•LDR和STR——半字和有符号字节加载/存储指令编码
W表示回写 P表示前/后变址 S为1表示有符号访问, 为0表示无符号访问 H为1表示半字访问,为 0表示字节访问
指令执行的条件码
U表示加/减 I为0时,偏移量为8 位立即数,为1时, 偏移量为寄存器移 位
为指令的寻址方式 Rd为源/目标寄存器 Rn为基址寄存器 L用于区别加载(L为1) 或存储(L为0)
用户模式加载无符号字 Rd←[addr],addr索引 节数据 加载无符号半字数据 加载有符号字节数据 加载有符号半字数据 Rd←[addr],addr索引 Rd←[addr],addr索引 Rd←[addr],addrg索引
ARM存储器访问指令——单寄存器存取
助记符 STR Rd, addr 说明 存储字数据 存储字节数据 操作 [addr]←Rd,addr索引 [addr]←Rd,addr索引 条件码位置 STR{cond} STR{cond}B
单寄存器操作指令
多寄存器操作指令 寄存器和存储器交换指令
ARM存储器访问指令——单寄存器存取
助记符
LDR Rd,addr LDRB Rd,addr LDRT Rd,addr LDRBT Rd, addr LDRH Rd, addr LDRSB Rd, addr LDRSH Rd, addr
说明
8种模式——(右边四种为堆栈操作、左边四种为数据传送操作)