arm指令集
跳转指令 实现流程的跳转
专门的跳转指令
b 跳转指令
格式:
B{条件}目标地址
示例代码如下:当cpsr寄存器中的z条件码置位时,程序跳转到标号label处执行
CMP R1,#0
BEQLable
指令条件
指令条件 标志位 含义
EQ Z置位 相等
NE Z清零 不相等
CS C置位 无符号数大于或等于
CC C清零 无符号数小于
MI N置位 负数
PL N清零 正数或零
VS V置位 溢出
VC V清零 未溢出
HI C置位Z清零 无符号数大于
LS C清零z置位 无符号数小于或等于
GE N等于V 带符号数大于或等于
LT N不等于V 带符号数小于
GT Z清零且(N等于V) 带符号数大于
LE Z置位或(N不等于V)带符号数小于或等于
AL 忽略 无条件执行
bl 带返回的跳转指令
在跳转之前,会把pc当前值保存到r14中
格式:
BL{条件} 目标地址
blx 带返回和状态切换的跳转指令
将处理器的工作状态从arm状态切换到thumb状态,同时将pc当值存入r14中
bx 带状态切换的跳转指令
直接向程序计数器写入跳转地址
mov lr,pc
---------------------------------------------------------------------
数据处理指令
数据传送指令,算述逻辑运算指令和比较指令
mov
从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器
s选项决定指令的操作是否影响cpsr中条件标志们的值,没有s时不更新标志位
格式:
mov{条件}{S}目的寄存器 源操作数
示例代码如下:
mov r1,r0;将寄存器r0的值传送到寄存器r1
mov pc,r14;
mov r1,r0,lsl#3; 将寄存器r0的值左移3位后传送到r1
注:源操作数不能是间接寻址,mov指令不能在寄存器和内存间使用
mvn
从一个寄存器、被移位的寄存器、或将一个立即数加载到目的寄存器
与mov指令不同的是在传送前按位取反了
格式:
mvn{条件}{s} 目的寄存器 源操作数
示例代码如下:
mvn r0,#0xff; r0<---0xffffff00
cmp
把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新cpsr中条件标志位的值(进行一次减法运算)
格式:
cmp{条件}操作数1,操作数2
示例代码如下:
cmp r1,r0;
cmp r1,#100;
tst
把一个寄存器的内容和另一个寄存器的内容或立即数进行按位与运算,更新cpsr
格式:
tst{条件} 操作数1,操作数2
示例代码如下:
tst r1,#%1;测试在寄存器r1中是否设置了最低位
add
把两个数相加
格式:
add{条件}{S}目的寄存器,操作数1,操作数2
示例代码如下:
add r0,r1,r2; r0=r1+r2
add r0,r1,#256; r0=r1+256
add r0,r2,r3,lsl#1; r0=r2+(r3<<1)
sub
把操作数1减去操作数2
格式:
sub r0,r1,r2; r0=r1-r2
sub r0,r1,#256; r0=r1-256
sub r0,r2,r3,lsl#1; r0=r2-(r3<<1)
and
在两个操作数上进行逻辑与运算,结果放到目的寄存器中
常用于屏蔽操作数1的某些位
格式:
and{条件}{S}目的寄存器,操作数1,操作数2
示例代码如下:
and r0,r0,#3; 保持r0的0、1位,其余位清零
orr
在两个操作数上进行逻辑或运算,结果放到目的寄存器
常用于设置操作数1的某些位
格式:
orr{条件}{S}目的寄存器,操作数1,操作数2
示例代码如下:
orr r0,r0,#3;设置r0的0、1位,其余位不变
bic
用于清除rn中的某些位,结果存放在rd中,operand2为32位的掩码
如果掩码中设置某一位为1,则该位清零
格式:
bic{cond}{S}Rd,Rn,operand2
示例代码如下:
bic r0,r0,#%1011;将r0的0、1、3位清零
mul
将操作数1与操作数2相乘,结果存放到目的寄存器中
格式:
mul{条件}{S}目的寄存器,操作数1,操作数2
示例代码如下:
mul r0,r1,r2; r0=r1*r2
muls r0,r1,r2; r0=r1*r2 同时设置cpsr中的条件标志位
------------------------------------------------------------
程序状态寄存器访问指令
mrs
将程序状态寄存器的内容传送到通用寄存器中
格式:
mrs{条件}通用寄存器,程序状态寄存器
示例代码如下:
mrs r0,cpsr; 传送cpsr的内容到r0
mrs r0,spsr; 传送spsr的内容到r0
msr
将操作数的内容传送到程序状态寄存器的特定域中
操作数可以为通用寄存器或立即数
<域>用于设置程序状态寄存器中需要操作的位,32位的程序状态寄存器可分为4个域
位[31:24]条件标志位域,用f表示
位[23:16]为状态位域,用s表示
位[15:8]为扩展位域,用x表示
位[7:0]为控制位域,用c表示
格式:
msr{条件}程序状态寄存器_<域>,操作数
示例代码如下:
msr cpsr,r0; 传送r0的内容到cpsr
msr spsr,r0; 传送r0的内容到spsr
msr cpsr_c,r0; 传送r0的内容到spsr,但仅仅修改cpsr中的控制位域
加载/存储指令
用于寄存器和存储器之间传输数据
ldr
从存储器中将一个32位的字数据传送到目的寄存器
ldr{条件}目的寄存器,<存储地址>
示例代码如下:
ldr r0,[r1]; r0=r1
ldrb r0,[r1]; 将寄存器地址为r1的(8位)字数据写入r0,将r0的高24位清零
ldrh r0,[r1]; 将以寄存器地址为r1的(16位)半字数据定入r0,将r0的高16位清零
str
从寄存器中将一个32位的字数据传送到存储器中
str{条件}源寄存器,<存储器地址>
示例代码如下:
str r0,[r1],#8; 将r0中的字数据写入以r1为地址的存储器中,并将新地址 r1+8写入r1
str r0,[r1,#8]; 将r0中的字数据写入以r1+8为地址的存储器中
批量加载/存储指令
一次在一片连续的存储器和多个寄存器之间传送数据
ldm
用于从由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄存器之间传送数据
将多个寄存器的内容入栈或出栈
ldm{条件}{类型}基址寄存器{!},寄存器列表{^}
类型:
IA 每次传送后地址加1
IB 每次传送前地址加1
DA 每次传送后地址减1
DB 每次传送前地址减1
FD 满递减堆栈
ED 空递减堆栈
FA 满递增堆栈
EA 空递增堆栈
{!} 为可选后缀,如果选用,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不变.基址寄存器不允许为r15
{^} 为可选后缀,当指令为ldm且寄存器列表中包含r15,选用该后缀时表示:除了正常的数据传送之外,还将spsr复制到cpsr
示例代码如下:
ldmfd r13!,{r0,r4-r12,pc}; 将堆栈内容恢复到寄存器
stm
stm{条件}{类型}基址寄存器{!},寄存器列表{^}
示例代码:
stmfd r13!,{r0,r1}; 将寄存器列表中的寄存器存入堆栈
数据交换指令
在存储器和寄存器之间交换数据
swp 字数据交换指令
swp{条件}目的寄存器,源寄存器1,[源寄存器2]
将源寄存器2所指向的存储器中的字节数据传送到目的寄存器
将源寄存器1中的字节数据传送到源寄存器2所指向的存储器中
(当源寄存器1和目的寄存器为同一个寄存器时,该指令就实现寄存器和存储器的内容的交换)
swp r0,r1,[r2];
swp r0,r0,[r1];
swpb 字节数据交换指令
移位指令
不作为单独的指令使用,只能作为指令格式中的一个字段
lsl 逻辑左移 (相当于乘)
通用寄存器,lsl操作数
示例代码如下:
mov r0,r1,lsl#2; 将r1中的内容左移两位后传送到r0
asl 算术左移(等价于lsl)
lsr 逻辑右移
asr 算术右移
ror 循环右移(相当于除)
异常产生指令
swi 软件中断指令
产生软件中断,以便用户程序能调用操作系统的api
swi{条件}24位立即数
示例代码如下:
swi 0x02 调用操作系统编号位02的系统例程
bkpt 断点中断指令
- 浏览: 264463 次
- 性别:
- 来自: 济南
相关推荐
ARM学习笔记概述 在计算机硬件领域,ARM(Advanced RISC Machines)是一种广泛应用的微处理器架构,以其低功耗、高性能和灵活性而闻名。这组学习笔记涵盖了在达内培训机构进行嵌入式系统学习时,对ARM技术深入探索...
本学习笔记将详细讲解ARMv8架构与指令集,包括执行状态、异常模型、寄存器、指令集以及流水线等关键知识点。 首先,在ARMv8简介章节,基础认识部分明确了ARMv8架构继承了ARMv7的技术,支持16/32位的Thumb2指令集,...
相比32位的ARM指令集,arm64增加了更多的寄存器,这极大地提高了数据处理速度和并行性。 在ARM64指令集中,每个指令通常由4个主要部分组成:操作码(Opcode)、立即数(Immediate)、寄存器地址(Register)和操作...
ARM指令集分为数据处理指令、加载/存储指令、分支指令、浮点运算指令等。数据处理指令如ADD、SUB、MUL等,用于执行算术和逻辑运算;加载/存储指令如LDR、STR,用于从内存读取和写入数据;分支指令如B、BL,实现程序...
ARM指令集仿真实验第四课主要探讨了两个关键知识...通过本次实验,学生不仅强化了对ARM指令集和嵌入式系统开发流程的掌握,还提升了对汇编和C语言混合编程的实际操作技能,为后续的嵌入式系统安全学习打下了坚实基础。
【ARM学习基础】 在开始ARM的学习之前,需要具备一定的基础知识,包括: 1. 熟悉前辈们的经验分享,可以从论坛或社区获取相关信息。 2. 掌握C语言编程技能,因为ARM开发通常使用C/C++语言。 3. 了解微机原理,包括...
### ARM学习笔记知识点详解 #### 一、ARM学习概述 **ARM** (Advanced RISC Machines) 是一种基于精简指令集计算机 (RISC) 的架构,广泛应用于移动设备、嵌入式系统等领域。ARM架构因其低功耗特性、高性能及广泛的...
ARM(Advanced RISC Machines)...总之,这份“ARM学习笔记”全面覆盖了ARM架构的基础到高级主题,适合初学者和有一定经验的开发者,帮助他们深入理解ARM处理器的运作机制,掌握在嵌入式系统中有效使用ARM技术的技能。
ARM学习笔记,主要涵盖ARM架构的基本概念、工作原理以及在嵌入式系统中的应用,是初学者进入ARM领域的宝贵资源。这份压缩包包含了两份文件,分别是“ARM入门笔记.pdf”和“bbs.eetzone.com.txt”。 首先,让我们...
三、ARM指令集 ARM处理器的指令集可以分为两种:Thumb指令集和ARM指令集。Thumb指令集是一种压缩指令集,每个指令的宽度为两个字节。ARM指令集是一种固定宽度指令集,每个指令的宽度为四个字节。ARM指令集包括 ...
在“我的几篇ARM学习笔记”中,我们可以期待找到关于ARM汇编语言的学习资料,这对于理解处理器内部工作原理以及优化代码性能至关重要。 ARM汇编语言是直接针对ARM处理器的低级编程语言,每条指令都对应于硬件上的一...
这份“ARM2440学习笔记”无疑是为那些想要深入理解ARM体系结构和具体应用的初学者提供了一份宝贵的资源。下面,我们将根据标题和描述,结合可能涵盖的知识点进行详细的讲解。 1. **ARM9架构**:ARM9是ARM公司设计的...
ARM处理器的学习笔记主要涵盖了处理器的存储格式、程序存储器和数据存储器、处理器模式、寄存器使用以及状态寄存器和伪指令等方面的知识。 1. ARM存储格式选择:ARM处理器有两种存储器结构,但并非对应两种存储格式...
1. **ARM9处理器介绍**:理解ARM9架构的特点,包括指令集、寻址模式、寄存器组织等,这是学习ARM9技术的起点。 2. **系统编程基础**:掌握C语言和C++编程,了解API和ABI的作用,熟悉POSIX和SUS等标准,这些都是进行...
ARM指令集支持32位指令,适用于高带宽数字系统,而Thumb指令集则是针对16位存储系统的高效指令集。两者之间的转换使得ARM处理器能在不同的执行状态下工作,满足不同应用场景的需求。 8. **ATPCS(ARM Thumb ...
2. **ARM指令集**:ARM指令集是其设计的基础,包括数据处理、控制转移、加载/存储等指令。与复杂指令集(CISC)不同,RISC强调简单、高效的指令,通常每个指令执行一个操作。ARM指令集有多种模式,如用户模式、系统...
很全的ARM学习资料,个人整理的,与其闲置不容免费让大家学习! 《ARM嵌入式常用模块与综合系统设计实例精讲》练习题与答案.rar 《ARM嵌入式应用开发技术白金手册》源代码.rar ARM9平台下的CMOS图像传感器数据采集...
笔记首先可能介绍ARM处理器的基础知识,包括其工作模式、寄存器组织、指令集以及中断处理机制。ARM处理器有多种不同的系列,如Cortex-A、Cortex-R和Cortex-M,分别针对应用、实时和微控制器市场,学习者应理解它们...
**ARM体系结构与编程(第二版)学习笔记** 在计算机科学领域,ARM(Advanced RISC Machines)架构是一种广泛使用的精简指令集计算机(RISC)架构,尤其在嵌入式系统、移动设备如智能手机和平板电脑中占据主导地位。...