ARM汇编指令列表
ARM中常用的汇编指令

ARM 中常⽤的汇编指令1 处理器内部数据传输指令MSR & MRS⽤于在状态寄存器和通⽤寄存器之间传送数据MRS: 状态寄存器到通⽤寄存器的传送指令。
({R0-R12} <== CPSR,SPSR)MSR: 通⽤寄存器到状态寄存器的传送指令。
MRS:(CPSR,SPSR==>{R0-R12})MOVMOV 指令⽤于将数据从⼀个寄存器拷贝到另外⼀个寄存器,或者将⼀个⽴即数传递到寄存器⾥⾯,使⽤⽰例如下:2 存储器访问指令ARM 不能直接访问存储器,⽐如 RAM 中的数据,⼀般先将要配置的值写⼊到 Rx(x=0~12)寄存器中,然后借助存储器访问指令将 Rx 中的数据写⼊到寄存器中。
指令描述LDR Rd, [Rn , #offset]从存储器 Rn+offset 的位置读取数据存放到 Rd 中STR Rd, [Rn, #offset]将 Rd 中的数据写⼊到存储器中的 Rn+offset 位置LDR 指令LDR 主要⽤于从存储加载数据到寄存器 Rx 中, LDR 也可以将⼀个⽴即数加载到寄存器 Rx中, LDR 加载⽴即数的时候要使⽤“=”,⽽不是“#”。
在嵌⼊式开发中, LDR 最常⽤的就是读取 CPU 的寄存器值。
上述代码就是读取寄存器中的值,读取到的寄存器值保存在 R1 寄存器中,上⾯代码中 offset 是 0,也就是没有⽤到 offset。
STR 指令LDR 是从存储器读取数据, STR 就是将数据写⼊到存储器中LDR 和 STR 都是按照字进⾏读取和写⼊的,也就是操作的 32 位数据,如果要按照字节、半字进⾏操作的话可以在指令“LDR”后⾯加上B 或 H,⽐如按字节操作的指令就是 LDRB 和STRB,按半字操作的指令就是 LDRH 和 STRH。
MRS R0, CPSR @ 将特殊寄存器 CPSR ⾥⾯的数据传递给 R0,即R0=CPSR1MSR CPSR , R0 @ 将 R0 中的数据复制到 CPSR 中,即 CPSR =R01MOV R0, R1 @ 将寄存器 R1 中的数据传递给 R0,即 R0=R1MOV R0, #0X12 @ 将⽴即数 0X12 传递给 R0 寄存器,即 R0=0X1212LDR R0, =0X0209C004 @ 将寄存器地址 0X0209C004 加载到 R0 中,即 R0=0X0209C004LDR R1, [R0] @ 读取地址 0X0209C004 中的数据到 R1 寄存器中12LDR R0, =0X0209C004 @ 将寄存器地址 0X0209C004 加载到 R0 中,即 R0=0X0209C004LDR R1, =0X20000002 @ R1 保存要写⼊到寄存器的值,即R1=0X20000002STR R1, [R0] @ 将 R1 中的值写⼊到 R0 中所保存的地址中1233 压栈和出栈指令我们通常会在 A 函数中调⽤ B 函数,当 B 函数执⾏完以后再回到 A 函数继续执⾏。
常用ARM指令集及汇编

常⽤ARM指令集及汇编ARM7TDMI(-S)指令集及汇编ARM 处理器是基于精简指令集计算机(RISC)原理设计的,指令集和相关译码机制较为简单,ARM7TDMI(-S)具有 32 位 ARM 指令集和16 位 Thumb 指令集,ARM 指令集效率⾼,但是代码密度低,⽽ Thumb 指令集具有更好的代码密度,却仍然保持 ARM 的⼤多数性能上的优势,它是 ARM 指令集的⼦集。
所有 ARM 指令都是可以有条件执⾏的,⽽ Thumb 指令仅有⼀条指令具备条件执⾏功能。
ARM 程序和Thumb 程序可相互调⽤,相互之间的状态切换开销⼏乎为零。
ARM 处理器寻址⽅式寻址⽅式是根据指令中给出的地址码字段来实现寻找真实操作数地址的⽅式,ARM 处理器有 9 种基本寻址⽅式。
寄存器寻址操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执⾏时直接取出寄存器值操作。
寄存器寻址指令举例如下:MOV R1,R2;R2 -> R1SUB R0,R1,R2;R1 - R2 -> R0⽴即寻址⽴即寻址指令中的操作码字段后⾯的地址码部分就是操作数本⾝,也就是说,数据就包含在指令当中,取出指令也就取出了可以⽴即使⽤的操作数(⽴即数)。
⽴即寻址指令举例如下:SUBS R0,R0,#1 ;R0 – 1 -> R0MOV R0,#0xff00 ;0xff00 -> R0 ⽴即数要以“#”为前缀,表⽰ 16 进制数值时以“0x”表⽰。
寄存器偏移寻址寄存器偏移寻址是ARM指令集特有的寻址⽅式,当第2操作数是寄存器偏移⽅式时,第 2 个寄存器操作数在与第 1 个操作数结合之前,选择进⾏移位操作。
寄存器偏移寻址⽅式指令举例如下:MOV R0,R2,LSL #3 ;R2 的值左移 3 位,结果放⼊ R0,即 R0 = R2 * 8ANDS R1,R1,R2,LSL R3 ;R2 的值左移 R3 位,然后和 R1 相与操作,结果放⼊ R1 可采⽤的移位操作如下:LSL:逻辑左移(Logical Shift Left),寄存器中字的低端空出的位补 0LSR:逻辑右移(Logical Shift Right),寄存器中字的⾼端空出的位补 0ASR:算术右移(Arithmetic Shift Right),移位过程中保持符号位不变,即如果源操作数为正数,则字的⾼端空出的位补 0,否则补 1 ROR:循环右移(Rotate Right),由字的低端移出的位填⼊字的⾼端空出的位 RRX:带扩展的循环右移(Rotate Right eXtended by1place),操作数右移⼀位,⾼端空出的位⽤原 C 标志值填充。
arm 汇编 指令

arm 汇编指令ARM汇编指令是一种用于编写ARM处理器程序的语言。
ARM处理器广泛应用于嵌入式系统和移动设备等领域。
ARM汇编指令与x86汇编指令有所不同,它基于RISC(精简指令集计算机)架构。
下面是一些基本的ARM汇编指令:1. 数据传输指令:用于在寄存器之间传输数据。
例如:- mov:将数据从一个寄存器传输到另一个寄存器。
- ldr:将数据从内存传输到寄存器。
2. 算术指令:用于执行加法、减法、乘法和除法等操作。
例如:- add:加法操作。
- sub:减法操作。
- mull:乘法操作。
- div:除法操作。
3. 逻辑指令:用于执行逻辑操作,如与、或、非等。
例如:- and:与操作。
- or:或操作。
- xor:异或操作。
4. 移位指令:用于对数据进行左移、右移或无符号右移。
例如:- lsr:无符号右移。
- asr:带符号右移。
- ror:循环右移。
5. 比较指令:用于比较两个寄存器的值。
例如:- cmp:比较两个寄存器的值,若相等则返回0,否则返回1。
6. 跳转指令:用于改变程序的执行流程。
例如:- b:条件跳转。
- bl:无条件跳转。
- bx:带状态跳转。
7. 循环指令:用于实现循环操作。
例如:- loop:内部循环。
- ldp:外部循环。
8. 调用指令:用于实现函数调用。
例如:- blx:带状态调用。
- bx:不带状态调用。
9. 系统调用指令:用于实现与操作系统交互的功能。
例如:- swi:执行系统调用。
10. 存储器访问指令:用于访问内存数据。
例如:- str:将数据存储到内存。
- ldr:从内存中加载数据。
以上仅为ARM汇编指令的一部分,实际上,ARM汇编指令还有很多其他功能。
为了更好地理解和使用ARM汇编指令,可以参考相关的教程和手册,并进行实际操作。
ARM汇编指令列表

ARM汇编伪指令ARM条件码CPSR位[31:24]为条件位域,用f表示;位[23:16]为状态位域,用s表示;位[15:8] 为扩展位域,用x表示;位[7:0] 为控制位域,用c表示;与指令MSR相关关于移位中断向量表APCS寄存器使用约定Load and Store指令LDR R0,[R1] ;将存储器地址为R1的字数据读入寄存器R0。
LDR R0,[R1,R2] ;将存储器地址为R1+R2的字数据读入寄存器R0。
LDR R0,[R1,#8] ;将存储器地址为R1+8的字数据读入寄存器R0。
LDR R0,[R1,R2] !;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1。
LDR R0,[R1,#8] !;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址 R1+8写入R1。
LDR R0,[R1],R2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址 R1+R2写入R1。
LDR R0,[R1,R2,LSL#2]!;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。
LDR R0,[R1],R2,LSL#2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。
LDRB R0,[R1] ;将存储器地址为R1的字节数据读入寄存器 R0,并将R0的高24 位清零。
LDRB R0,[R1,#8] ;将存储器地址为R1+8的字节数据读入寄存器R0,并将 R0的高24位清零。
LDRH R0,[R1] ;将存储器地址为R1的半字数据读入寄存器 R0,并将R0的高16位清零。
LDRH R0,[R1,#8] ;将存储器地址为R1+8的半字数据读入寄存器R0,并将R0 的高16位清零。
LDRH R0,[R1,R2] ;将存储器地址为R1+R2的半字数据读入寄存器R0,并将 R0的高16位清零。
常用的ARM汇编指令

常⽤的ARM汇编指令转⾃:https:///zb861359/article/details/81027021?utm_source=app1、 IMPORT和EXPORTIMPORT ,定义表⽰这是⼀个外部变量的标号,不是在本程序定义的EXPORT ,表⽰本程序⾥⾯⽤到的变量提供给其他模块调⽤的。
以上两个在汇编和C语⾔混合编程的时候⽤到。
2、AREA语法格式:AREA 段名属性1 ,属性2 ,……AREA伪指令⽤于定义⼀个代码段或数据段。
其中,段名若以数字开头,则该段名需⽤“|”括起来,如:|1_test|。
属性字段表⽰该代码段(或数据段)的相关属性,多个属性⽤逗号分隔。
常⽤的属性如下:— CODE 属性:⽤于定义代码段,默认为READONLY 。
— DATA 属性:⽤于定义数据段,默认为READWRITE 。
— READONLY 属性:指定本段为只读,代码段默认为READONLY 。
— READWRITE 属性:指定本段为可读可写,数据段的默认属性为READWRITE 。
— ALIGN 属性:使⽤⽅式为ALIGN表达式。
在默认时,ELF(可执⾏连接⽂件)的代码段和数据段是按字对齐的,表达式的取值范围为0~31,相应的对齐⽅式为2表达式次⽅。
— COMMON 属性:该属性定义⼀个通⽤的段,不包含任何的⽤户代码和数据。
各源⽂件中同名的COMMON段共享同⼀段存储单元。
⼀个汇编语⾔程序⾄少要包含⼀个段,当程序太长时,也可以将程序分为多个代码段和数据段。
使⽤⽰例:AREA Init ,CODE ,READONLY ; 该伪指令定义了⼀个代码段,段名为Init ,属性为只读。
3、LDR、LDRB、LDRHARM微处理器⽀持加载/存储指令⽤于在寄存器和存储器之间传送数据,加载指令⽤于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。
常⽤的加载存储指令如下:— LDR 字数据加载指令— LDRB 字节数据加载指令— LDRH 半字数据加载指令1) LDR指令有两种⽤法:a、ldr加载指令LDR指令的格式为:LDR{条件} ⽬的寄存器,<存储器地址>LDR指令⽤亍从存储器中将⼀个32位的字数据传送到⽬的寄存器中。
实用ARM指令全

在讲指令之前,先简单地介绍一下Cortex-M3 中支持的算术与逻辑标志。
本书在后面还会展开论述。
它们是:APSR 中的5 个标志位4.2.1 分类指令表表4.2 16位数据操作指令表4.3 16位转移指令IT If-Then表4.4 16位存储器数据传送指令16 数据传送指令没有任何新内容,因为它们是Thumb 指令,在v4T 时就已经定格了——译注表4.5 其它16位指令表4.6 32位数据操作指令UXTH 半字被无符号扩展到32 位(高16 位清0——译注)表4.7 32位存储器数据传送指令表4.8 32位转移指令表4.9 其它32位指令4.2.2 未支持的指令有若干条Thumb 指令没有得到Cortex-M3 的支持,下表列出了未被支持的指令,以及不支持的原因。
表4.10 因为不再是传统的架构,导致有些指令已失去意义未支持的指令以前的功能BLX #im 在使用立即数做操作数时,BLX 总是要切入ARM 状态。
因为Cortex-M3 只在Thumb 态下运行,故以此指令为代表的,凡是试图切入ARM 态的操作,都将引发一个用法fault。
SETEND由ARMv6 引入的,在运行时改变处理器端设置的指令(大端或小端)。
因为Cortex-M3 不支持动态端的功能,所以此指令也将引发faultCM3 也不支持有少量在ARMv7-M 中列出的指令。
比如,ARMv7M 支持Thumb2 的协处理器指令,但是CM3 却不能挂协处理器。
表4.11 列出了这些与协处理器相关的指令。
如果试图执行它们,则将引发用法fault(NVIC 中的NOCP (No CoProcessor)标志置位)。
表4.11 不支持的协处理器相关指令未支持的指令以前的功能MCR 把通用寄存器的值传送到协处理器的寄存器中MCR2把通用寄存器的值传送到协处理器的寄存器中MCRR 把通用寄存器的值传送到协处理器的寄存器中,一次操作两个MRC把协处理器寄存器的值传送到通用寄存器中MRC2 把协处理器寄存器的值传送到通用寄存器中MRRC把协处理器寄存器的值传送到通用寄存器中,一次操作两个LDC 把某个连续地址空间中的一串数值传送至协处理器中STC从协处理器中传送一串数值到地址连续的一段地址空间中还有一个是改变处理器状态指令(CPS),它的一些用法也不再支持。
ARM中的汇编指令

ARM中的汇编指令BIC:ARM 指令,对某些位,清零。
先取反再相与。
asm(“BIC r2, r2,#0x1f”); ##对R2 的低5 位清零。
ORR:ARM 指令,逻辑或asm(“ORR r2, r2, #0x10”); ##R2 逻辑与0x10。
MRS:asm(“MRS r2, CPSR”); ##将CPSR 的值加载到R2 中。
MSR:asm(“MSR CPSR, r2”); ##将R2 的值加载到CPSR 中。
asm(“ SWI 0x0”); ##跳转到软件中断函数,并转换为SVC 模式。
LDR:{条件}目的寄存器存储器寄存器。
将存储地址所指的4 个字节数据传送到寄存器,其中寻址方式会有很多种。
asm(“ldr r0,=0xddeeaabb”); ##在这里ldr 是一个伪指令,相当于move 指令。
asm(“ldr r0, [r1]”);##将存储器地址为r1 的一个字的数据加载到r0 中。
MRC 与MCR:在处理器寄存器与协处理器寄存器之间交换数据。
MRC {cond} coproc, opcode1, Rd, CRn, CRm {,opcode2}asm(“mrc p15,0,r0,c1,c1,0”); ##在CRn, CRm 均为c1, opcode 均为0 时,表示SCR(Secure Configuration Register),表示将c1 的值赋值给r0.asm(“mcr p15,0,r0,c1,c1,0”); ##将r0 的值赋值给c1.asm(“mcr p15,0,r0,c12,c0,0”);##将r0 的值赋值给c12,此时c12 表示VBAR,Vector Base Address Register,存放异常时的入口地址。
SMC:(Secure Monitor Call). asm(“SMC 0x0”);##将ARM core 切换到Trust Zone 模式。
arm 汇编 位操作

ARM 汇编语言提供了丰富的位操作指令,这些指令可以在位级别上操作数据,从而实现各种位运算和位操作功能。
以下是一些常用的ARM 汇编位操作指令:1. AND 指令:该指令将两个操作数的相应位进行逻辑与操作,并将结果存储在目标寄存器中。
例如:```AND r0, r1, r2 ; 将r1 和r2 的相应位进行逻辑与操作,并将结果存储在r0 中```2. EOR 指令:该指令将两个操作数的相应位进行逻辑异或操作,并将结果存储在目标寄存器中。
例如:```EOR r0, r1, r2 ; 将r1 和r2 的相应位进行逻辑异或操作,并将结果存储在r0 中```3. ORR 指令:该指令将两个操作数的相应位进行逻辑或操作,并将结果存储在目标寄存器中。
例如:```ORR r0, r1, r2 ; 将r1 和r2 的相应位进行逻辑或操作,并将结果存储在r0 中```4. BIC 指令:该指令将目标寄存器的相应位清零,其他位保持不变。
例如:```BIC r0, r1, r2 ; 将r1 的相应位清零,其他位保持不变,并将结果存储在r0 中```5. MVN 指令:该指令将目标寄存器的相应位取反,其他位保持不变。
例如:```MVN r0, r1 ; 将r1 的相应位取反,其他位保持不变,并将结果存储在r0 中```这些是ARM 汇编语言中常用的位操作指令,它们可以帮助您在汇编语言中进行高效的位运算和位操作。
请注意,这些指令的用法可能会因ARM 架构版本和具体的处理器型号而有所不同。
因此,在实际应用中,建议查阅相关ARM 架构文档以了解更详细的信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CPSR
位[31:24]为条件位域,用f表示;位[23:16]为状态位域,用s表示;位[15:8] 为扩展位域,用x表示;位[7:0] 为控制位域,用c表示;与指令MSR相关
关于移位
中断向量表
Load and Store指令
LDR R0,[R1] ;将存储器地址为R1的字数据读入寄存器R0。
LDR R0,[R1,R2] ;将存储器地址为R1+R2的字数据读入寄存器R0。
LDR R0,[R1,#8] ;将存储器地址为R1+8的字数据读入寄存器R0。
LDR R0,[R1,R2] !;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1。
LDR R0,[R1,#8] !;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址 R1+8写入R1。
LDR R0,[R1],R2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址 R1+R2写入R1。
LDR R0,[R1,R2,LSL#2]!;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。
LDR R0,[R1],R2,LSL#2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。
LDRB R0,[R1] ;将存储器地址为R1的字节数据读入寄存器 R0,并将R0的高24 位清零。
LDRB R0,[R1,#8] ;将存储器地址为R1+8的字节数据读入寄存器R0,并将 R0的高24位清零。
LDRH R0,[R1] ;将存储器地址为R1的半字数据读入寄存器 R0,并将R0的高16位清零。
LDRH R0,[R1,#8] ;将存储器地址为R1+8的半字数据读入寄存器R0,并将R0 的高16位清零。
LDRH R0,[R1,R2] ;将存储器地址为R1+R2的半字数据读入寄存器R0,并将 R0的高16位清零。
STR R0,[R1],#8 ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。
STR R0,[R1,#8] ;将R0中的字数据写入以R1+8为地址的存储器中。
STRB R0,[R1] ;将寄存器R0中的字节数据写入以R1为地址的存储器中。
STRB R0,[R1,#8] ;将寄存器R0中的字节数据写入以R1+8为地址的存储器中。
STRH R0,[R1] ;将寄存器R0中的半字数据写入以R1为地址的存储器中。
STRH R0,[R1,#8] ;将寄存器R0中的半字数据写入以R1+8 为地址的存储器中。
LDR r, =label 会把label表示的值加载到寄存器中,而LDR r, label会把label当做地址,把label指向的地址中的值加载到寄存器中。
v
LDM STM
LDM(或STM){条件}{类型} 基址寄存器{!},寄存器列表{∧}
{类型}:
IA 每次传送后地址加1(inc after);
IB 每次传送前地址加1(inc before);
DA 每次传送后地址减1(dec after);
DB 每次传送前地址减1(dec before);
FD 满递减堆栈(full dec);
ED 空递减堆栈(empty dec);
FA 满递增堆栈(full add);
EA 空递增堆栈(empty add);
{!}为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变。
基址寄存器不允许为R15,寄存器列表可以为R0~R15的任意组合。
{∧}为可选后缀,当指令为LDM且寄存器列表中包含R15,选用该后缀时表示:除了正常的数据传送之外,还将SPSR复制到CPSR。
同时,该后缀还表示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。
STMFD R13!,{R0,R4-R12,LR} ;将寄存器列表中的寄存器(R0,R4到R12,LR)存入堆栈。
LDMFD R13!, {R0,R4-R12,PC} ;将堆栈内容恢复到寄存器(R0,R4到R12,LR)。
Keil函数调用
入栈: STMDB R13!,{R4,R14} 出栈: LDMIA R13!,{R4,R14} 满自减栈。