ARM汇编指令列表

合集下载

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指令集及汇编

常⽤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处理器广泛应用于嵌入式系统和移动设备等领域。

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汇编伪指令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汇编指令

常⽤的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指令全

实用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中的汇编指令

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 汇编语言提供了丰富的位操作指令,这些指令可以在位级别上操作数据,从而实现各种位运算和位操作功能。

以下是一些常用的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 架构文档以了解更详细的信息。

ARM常用汇编指令

ARM常用汇编指令

ARM常⽤汇编指令ARM 汇编程序的框架结构.section .data<初始化的数据>.section.bss<未初始化的数据>.section .text.global _start_start:<汇编代码>注意:⼀般是将上⾯结构进⾏简化.text.global _start_start:<汇编代码>寄存器操作指令:算术和逻辑指令:MOV :⽤于将⼀个寄存器或被移位寄存器或⼀个⽴即数移动到⽬的寄存器MOV r1 ,#8 (注意:#+数,表⽰⼀个⼗进制数,#+0b数,表⽰⼀个⼆进制数,#+0x数,表⽰⼀个⼗六进制数)MVN :对源操作数取反再赋值给⽬的寄存器MOV R1,#8SUB : 将⼀个数减去另外⼀个数再存放如寄存器SUB R1,#8,#6(8-6)ADD:将⼀个数加上另外⼀个数后将其存放如寄存器中ADD R1,R2,R3AND :逻辑与AND R1,R2,#0BIC:位清除BIC R1,R2,#0B1101将R2中所与#b1101中1所对应的位清零后的结果保存在R1中⽐较指令:CMP:顾名思义,⽤于⽐较两个数的⼤⼩,⽐较的结果不过会放在哪个通⽤寄存器中⽽是改在程序状态寄存器中的⼀个标志状态位CMP R1,#0B111010TST:测试位,将两个数按位与TST R1,R2分枝指令:B:条件跳转指令B [条件] 标号(注意:中括号在编写程序时不需要写出)BL :带连接的返回(类似于C语⾔中的⼦函数调⽤,调⽤⼦函数后返回主函数)移位指令:LSL:算术左移位MOV R1,R1,LSL#2(将R1中的数据左移两位存⼊R1)ROR:循环右移MOV R1,R1,#ROR 2(将R1中的数据循环右移后存⼊R1中)程序状态字访问指令:上⾯所学指令都不能对计算机中的程序状态字中的指令进⾏访问和读写,所以需要专⽤计算机指令来将程序状态字中的数据读写到通⽤寄存器中,在进⾏修改后写⼊MRS :将程序状态字中的数据搬出来MRS R0,CPRSMSR:将数据搬回程序状态字中MSR CPRS, R0存储器操作指令:LDR :将内存中的值导出到通⽤寄存器中LDR R0 ,#0XFF ‘STR:将同⽤寄存器中的数据写回到内存中STR R0 ,#0XFF伪指令:定义类伪指令:(1:编译时起作⽤2:起作⽤但是转化为其他机器指令).global 表明⼀个全局的符号 (注意GNU伪指令的特点在前⾯加上⼀个“.”).data 定义⼀个数据段.ascii 定义字符串的数据.byte 定义⼀个字节的数据.word 定义⼀个字的数据.data.equ (类似于C语⾔中定义宏).align ⽤于字节对齐操作类伪指令:nop:空操作指令 \具体实现:mov r0 ,r0ldr:⽤于将⼀个⼤于⼋位的数据装⼊寄存器注意:ldr r0 ,=0x1ff这⾥后⾯是⽤的等号这⾥和其他地⽅有些不⼀样协处理指令:(最重要是就是CP15)作⽤:系统控制mcr:mrc:mrc p15,0, r0 ,c0,c0,0注意:蓝⾊部分是由芯⽚⼿册的cp15寄存器访问列表给出的以访问不同寄存器。

arm 32 常见汇编指令 对应的机器码

arm 32 常见汇编指令 对应的机器码

arm 32 常见汇编指令对应的机器码
ARM 32位汇编指令是一种用于ARM架构的低级编程语言,它将人类可读的汇编指令转换为机器码,从而实现对计算机硬件的直接控制。

以下是几个常见的ARM 32位汇编指令及其对应的机器码:
1. MOV指令:将一个数据从一个位置复制到另一个位置。

机器码:0xMOV Rd, Rn
2. ADD指令:将两个数据相加并将结果存储在目标寄存器中。

机器码:0xADD Rd, Rn, Rm
3. SUB指令:将两个数据相减并将结果存储在目标寄存器中。

机器码:0xSUB Rd, Rn, Rm
4. CMP指令:比较两个数据的大小,并根据比较结果设置条件代码。

机器码:0xCMP Rn, Rm
5. LDR指令:从内存中加载数据到寄存器中。

机器码:0xLDR Rd, [Rn, #offset]
6. STR指令:将寄存器中的数据存储到内存中。

机器码:0xSTR Rd, [Rn, #offset]
7. B指令:无条件跳转到指定的地址。

机器码:0xB label
8. BEQ指令:如果上一次比较结果为相等,则跳转到指定的地址。

机器码:0xBEQ label
以上是ARM 32位汇编指令的一些常见例子,每个指令都有对应的机器码。

通过编写汇编程序,程序员可以直接对计算机硬件进行控制,实现各种功能。

虽然汇编语言比高级语言更难以理解和编写,但它提供了更高的灵活性和效率,特别适合对性能要求较高的应用。

ARM汇编指令

ARM汇编指令
R15:PC,指示当前程序的执行位置,对应1个物理寄存器,任何模式均可用。当前PC值为当前指令加8个字节。ARM状态下,位[1:0]为00,位[31:2]用于保存PC;Thumb状态下,位[0]为0,位[31:1]用于保存PC
CPSR:当前程序状态寄存器,对应1个物理寄存器,任何模式均可用
SPSR:备份的程序状态寄存器,对应5个物理寄存器,除User模式外均可用
例:MOV R0,R2,LSL #3 ;R2的值左移3位,结果放入R0
ANDS R1,R1,R2,LSL R3 ;R2的值左移R3位,然后再和R1相与,结果放入R1
汇编程序框架
AREA EX,CODE,READONLY;声明一段名为EX的CODE
ENTRY ;指定函数的入口
cond:执行条件,占用[31:28],共16种,紧贴助记符,在S之前,如SUBNES
opcode:指令助记符,占用[27:21]
s:是否影响CPSR的值(有s时,即s为1时有影响),占用20位,紧贴助记符,如ADDS
Rn:第1个操作数的寄存器,占用[19:16]位,只能使用R0-R15
Rd:目标寄存器,占用[15:12]位,只能使用R0-R15
operand2:第2个操作数,占用[11:0]位,可以是寄存器R0-R15,也可以是立即数
条件码
EQ:Z为1,相等
NE:Z为0,不相等
CS:C为1,无符号数大于或等于
CC:C为0,无符号数小于
MI:N为1,负数
PL:N为0,正数或0
VS:V为1,溢出
VC:V为0,未溢出
HI:C为1,Z为0,无符号数大于
IMPORT:引入在其他源文件中定义的标号,并在当前源文件中使用

ARM汇编:数据处理指令集:MOV、ADD、ADDS、ADC、SUB、SUBS、SBC、R。。。

ARM汇编:数据处理指令集:MOV、ADD、ADDS、ADC、SUB、SUBS、SBC、R。。。

ARM汇编:数据处理指令集:MOV、ADD、ADDS、ADC、SUB、SUBS、SBC、R。

ARM指令集——数据处理指令数据处理指令有:MOV、ADD、ADDS、ADC、SUB、SUBS、SBC、RSB、MUL、AND、ORR、EOR、BIC、CMP、TST、TEQ、LSL、LSR、ASR、RORV数据处理指令语法1.<操作{<cond>}{S}> <Rd>, <Rn>, <Operand2>2.<操作码> <⽬标寄存器Rd> <第⼀操作寄存器Rn> <第⼆操作数Operand2>3.;第⼀个位置必须是寄存器,第⼆操作数可以是寄存器,也可以是⽴即数数据传送指令 MOV1.mov r1, #0x1 ;r1 = 0x1 0x1 是⽴即数2.mov r2, r1 ;r2 = r13.mvn r3, r2 ;r3 = ~r24.mov r1, 0xffffff00 ;0xffffff00 不是⽴即数,只是编译器在编译阶段对其进⾏了替换5.mvn r1, 0x000000ff ;替换的指令6.7.;⼀条数据传送指令 mov reg, #n mov reg占⽤ bit[31:12],bit[11:0]留给⽴即数使⽤,因此⽴即数⾃包含2^12个8.;⼀个⽴即数由 bits[8:0]循环右移 2 * bits[11:9]得到。

(⼀个⼋位的数循环右移偶数次得到)9.;⽴即数的本质是包含于指令中的数,占⽤指令本⾝的空间加法指令 ADD1.;加法指令执⾏时,若没有进位 CPSR 'C' 位置 02.mov r0, #13.mov r1, #14.add r2, r1, r0 ;r2 = r1 + r05.add r2, r1, #2 ;r2 = r1 + 2数据操作对CPSR的影响;默认情况下,数据处理指令不影响条件码标志位,但可以选择通过添加“S”来影响标志位。

ARM汇编指令集

ARM汇编指令集

ARM汇编指令集ARM处理器的指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产⽣指令6⼤指令。

⼀、跳转指令跳转指令⽤于实现程序流程的跳转,在ARM程序中有以下两种⽅法可以实现程序流程的跳转。

Ⅰ.使⽤专门的跳转指令;Ⅱ.直接向程序计数器PC写⼊跳转地址值,通过向程序计数器PC写⼊跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使⽤MOV LR,PC等类似指令,可以保存将来的返回地址值,从⽽实现在4GB连续的线性地址空间的⼦程序调⽤。

ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括以下4条指令:1、B指令B指令的格式为:B{条件} ⽬标地址B指令是最简单的跳转指令。

⼀旦遇到⼀个B指令,ARM处理器将⽴即跳转到给定的⽬标地址,从那⾥继续执⾏。

注意存储在跳转指令中的实际值是相对当前PC 值的⼀个偏移量,⽽不是⼀个绝对地址,它的值由汇编器来计算(参考寻址⽅式中的相对寻址)。

它是24位有符号数,左移两位后有符号扩展为32 位,表⽰的有效偏移为26 位(前后32MB的地址空间)。

以下指令:B Label ;程序⽆条件跳转到标号Label处执⾏CMP R1,#0 ;当CPSR寄存器中的Z条件码置位时,程序跳转到标号Label处执⾏BEQ Label2、BL指令BL指令的格式为:BL{条件} ⽬标地址BL是另⼀个跳转指令,但跳转之前,会在寄存器R14中保存PC的当前内容,因此,可以通过将R14的内容重新加载到PC中,来返回到跳转指令之后的那个指令处执⾏。

该指令是实现⼦程序调⽤的⼀个基本但常⽤的⼿段。

以下指令:BL Label ;当程序⽆条件跳转到标号Label处执⾏时,同时将当前的 PC值保存到;R14(LR)中3、BLX指令BLX指令的格式为:BLX ⽬标地址BLX指令从ARM指令集跳转到指令中所指定的⽬标地址,并将处理器的⼯作状态有ARM状态切换到Thumb状态,该指令同时将PC的当前内容保存到寄存器R14中。

ARM-汇编的基础指令

ARM-汇编的基础指令

d e s t=!o p_1M V N从另一个寄存器、被移位的寄存器、或一个立即值装载一个值到目的寄存器。

不同之处是在传送之前位被反转了,所以把一个被取反的值传送到一个寄存器中。

这是逻辑非操作而不是算术操作,这个取反的值加 1 才是它的取负的值:SUB : 减法(Sub traction)S U B{条件}{S}<d e s t>,<o p1>,<o p2>d e s t=o p_1-o p_2S U B用操作数one 减去操作数 two,把结果放置到目的寄存器中。

操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值:ADD : 加法(Add ition)A D D{条件}{S}<d e s t>,<o p1>,<o p2>d e s t=o p_1+o p_2A D D将把两个操作数加起来,把结果放置到目的寄存器中。

操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值:AND : 逻辑与(logical AND)A N D{条件}{S}<d e s t>,<o p1>,<o p2>d e s t=o p_1A N D o p_2A N D将在两个操作数上进行逻辑与,把结果放置到目的寄存器中;对屏蔽你要在上面工作的位很有用。

操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值:ORR : 逻辑或(logical O RR)A N D{条件}{S}<d e s t>,<o p1>,<o p2>d e s t=o p_1A N D o p_2A N D将在两个操作数上进行逻辑与,把结果放置到目的寄存器中;对屏蔽你要在上面工作的位很有用。

操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值:BIC : 位清除(Bi t C lear)B I C{条件}{S}<d e s t>,<o p1>,<o p2>d e s t=o p_1A N D(!o p_2)B I C是在一个字中清除位的一种方法,与 OR 位设置是相反的操作。

ARM总汇编指令集

ARM总汇编指令集

ARM汇编指令集1 跳转指令1.1 跳转指令B:B LABLE ;跳转到标号LABEL处B 0X1111 ;跳转到绝对地址0X1111处1.2 带连接的跳转指令 BL:START …BL NEXT ;跳转到标号NEXT处,同时保存当前PC到R14中… ;返回地址…NEXT… ;子程序入口MOV PC,R14 ;返回1.3 带状态切换的跳转指令BX:MOV R0, #0X0201BX R0 ;程序跳转到0x0200处,微处理器切换到Thumb状态(地址必须是4的倍数,否则产生不可预知的后果)2算术运算指令2.1不带进位加法指令ADDADD R0, R1, R2 ;R0← (R1)+(R2)ADD R0, R1, #112 ;R0← (R1)+ 112ADD R0, R1, R2, LSL #1 ;R0←(R1)+(R2<<1) ;将R2中的值左移1位,再与R1值相加,结果送R02.2带进位加法指令 ADCADDS R0, R3, R6 ;加最低位字节,不带进位ADCS R1, R4, R7 ;加第二个字,带进位ADCS R2, R5,R8 ;加第三个字,带进位;三句话实现了96bit加法运算,由于ARM寄存器宽度只有32bit所以分三次相加2.3 不带进位减法指令SUB ;S—进位标志SUB R0, R1, R2 ;R0←(R1)- (R2)SUB R0, R1, #112 ;R0←(R1)- 112SUB R0, R1 ,R2 LSL#1 ;R0←(R1)- (R2<<1)2.4 带进位减法指令SBCSUBS R0, R3, R6 ;减最低位字节,不带进位SBCS R1, R4, R7 ;减第二个字,带进位SBCS R2, R5, R8 ;减第三个字,带进位;三句话实现了96bit减法运算,由于ARM寄存器宽度只有32bit所以分三次相减2.5 不带进位逆向减法指令RSBRSB R0, R1, R2 ;R0←(R2)- (R1)RSB R0, R1, #112 ;R0← 112- (R1)RSB R0, R1, R2, LSL#1 ;R0←(R2<<1)-R12.6 带进位逆向减法指令RSCRSBS R0, R6, R3 ;减最低字节的字,不带进位RSCS R1, R7, R4 ;减第二个字,带进位RSCS R2, R8, R5 ;减第三个字,带进位;三句话实现了96bit减法运算,由于ARM寄存器宽度只有32bit所以分三次相减2.732位乘法指令MULMUL R0, R1, R2 ;R0←(R1) X(R2)MULS R0, R1, R2 ;R0←(R1) X(R2) ;更新CPSR标志位2.8乘-累加指令 MLAMLA R0, R1, R2, R3 ;R0←(R1) X(R2)+(R3)MLAS R0, R1, R2, R3 ;R0←(R1) X(R2)+(R3) ;更新CPSR标志位2.9 无符号数长乘指令 UMULLMOV R5, #0X01MOV R8, #0X02UMULL R0, R1, R5, R8 ;(R1) (R0)←(R5)X(R8);UMULL指令实现64bit无符号数乘法2.10无符号长乘-累加指令 UMLALMOV R0, #0X01MOV R1, #0X02MOV R5, #0X01MOV R8, #0X02UMLAL R0, R1, R5, R8 ;R0←(R0) +(R5)X(R8)低字节;R1←(R1) +(R5) X(R8)高字节;UMLAL 指令为64位无符号乘-累加指令2.11有符号长乘指令SMULLMOV R5, #0X01MOV R8, #0X02SMULL R0, R1, R5, R8 ;(R1) (R0)←(R5)X(R8);SMULL指令实现64bit有符号数乘法2.12 有符号长乘-累加指令 SMLALMOV R0, #0X01MOV R1, #0X02MOV R5, #0X01MOV R8, #0X02SMLAL R0, R1, R5, R8 ;R0←(R0) +(R5)X(R8)低字节;R1←(R1) +(R5) X(R8)高字节; SMLAL 指令为64位有符号乘-累加指令2.13 比较指令 CMPCMP R1, #0X10 ;比较BGT TAG ;R1> #0X10转到TAG标号处……2.14负数比较指令 CMNCMN R0, #1 ;判断R0中的值是否为1的补码,是则置标志位Z为13逻辑运算指令3.1“与”指令 ANDMOV R0, 0XFFAND R0, R0, #3 ;取出R0的最低2bit3.2“或”指令 ORRMOV R0, 0XFFORR R0, R0, #33.3“异或”指令 EORMOV R0, 0XFFEOR R0, R0, #3 ;R0←(R0)^(0X03)3.4位清除指令 BICMOV R0, 0XFFBIC R0, R0, #B11 ;寄存器R0的低2bit被清零3.5测试比较指令 TSTTST R1, #b11 ;测试寄存器R1中的第0位和第1位,更新CPSR中标志位,应用中会在TST指令后加一条跳转指令。

arm常用汇编指令

arm常用汇编指令

arm常用汇编指令ARM的汇编指令是ARM处理器在运行时所执行的基本操作。

汇编指令是一种低级编程语言,它主要是为了直接操作硬件而设计的。

在ARM 汇编指令中,每个指令都是由一个操作码和一些操作数组成的。

操作码就是指令的类型,而操作数则是指令要操作的数据。

下面是一些常用的ARM汇编指令:1. mov指令mov指令是ARM汇编指令中最常用的指令之一。

它用来将一个数据从一个位置复制到另一个位置。

例如,下面的代码将寄存器r1中的值复制到寄存器r2中:mov r2, r12. add指令add指令用来将两个数相加并将结果存放在一个寄存器中。

例如,下面的代码将r1和r2中的值相加并将结果存放在r3中:add r3, r1, r23. sub指令sub指令用来将一个数从另一个数中减去并将结果存放在一个寄存器中。

例如,下面的代码将r2中的值从r1中减去并将结果存放在r3中:sub r3, r1, r24. cmp指令cmp指令用来比较两个数的大小。

它会将两个数相减,并将结果存放在一个特殊的寄存器中。

如果相减结果为0,表示两个数相等;如果结果为正数,表示第一个数大于第二个数;如果结果为负数,表示第一个数小于第二个数。

例如,下面的代码比较r1和r2的大小:cmp r1, r25. beq指令beq指令用来进行条件分支。

如果cmp指令的结果为0,则跳转到指定的地址。

例如,下面的代码如果r1等于r2,就跳到标号my_label处执行:beq my_label6. bne指令bne指令用来进行条件分支。

如果cmp指令的结果不为0,则跳转到指定的地址。

例如,下面的代码如果r1不等于r2,就跳到标号my_label处执行:bne my_label7. ldr指令ldr指令用来从内存中读取一个值并存放到寄存器中。

例如,下面的代码从内存地址0x100处读取一个值并存放到寄存器r1中:ldr r1, [0x100]8. str指令str指令用来将一个值存储到内存中。

常用ARM汇编指令

常用ARM汇编指令

常⽤ARM汇编指令1、相对跳转指令:b, bl 区别在于bl指令除了跳转之外,还将返回地址(bl的下⼀条指令的地址)保存在lr寄存器中。

可跳转范围是当前指令的前后32MB。

2、数据发送指令mov,地址读取伪指令ldr mov指令: mov r1, r2 //r1=r2,把⼀个寄存器的值赋给另⼀个寄存器 mov r1,#358 //r1=4096, 把⼀个常数赋给寄存器 ldr伪指令:(第⼆个参数为“=”时表⽰伪指令,否则表⽰内存访问指令) ldr r1,=358 //把⼀个常数赋给寄存器3、内存访问指令:ldr、str、ldm、stm ldr指令从内存中读取数据到寄存器: ldr r1, [r2, #4] //将地址为r2+4的内存单元数据读取到r1中 ldr r1, [r2] //将地址r2内存中数据读取到r1中 ldr r1, [r2], #4 //将地址为r2的内存中的数据读取到r1中,然后r2=r2+4 str指令把寄存器的值存储到内存中: str r1, [r2, #4] //将r1的数据保存到地址为r2+4的内存单元中 str r1, [r2] //将r1的数据保存到地址r2的内存单元中 str r1, [r2], #4 //将r1的数据保存到r2的内存单元中,然后r2= r2+44、加减指令:add、sub add r1,r2,#1 //表⽰r1 = r2+1 sub r1,r2,#1 //表⽰r1 = r2-15、程序状态访问寄存器:msr、mrs ARM 有⼀个程序状态寄存器(cpsr),⽤来控制处理器的⼯作模式、设置中断的总开关 msr cpsr, r0 //复制r0到cpsr mrs r0,cpsr //复制cpsr到r06、其他汇编指令 .extern main .text .global _start _start: ".extern"定义⼀个外部符号(可以是变量也可以是函数) “.text”表⽰羡慕的语句都属于代码段 “.global”将本⽂件中的某个程序标号定义为全局的,如上表⽰将_start定义为全局函数。

ARM常用汇编指令介绍

ARM常用汇编指令介绍

ARM常用汇编指令介绍
b 跳转指令(跳转范围为32Mb)
bl 带返回地址的跳转,指令自动将下一条指令的地址复制到R14 寄存器,然后跳转到指定地址去执行,执行完后返回到下一条指令处执行
pc 寄存器R15,程序计数器指向当前执行的程序地址
lr 寄存器R14,链接寄存器保存程序跳转时的返回地址
ldr 从内存中读取数据加载到寄存器中
str 将寄存器中的数据保存到内存
mov 寄存器与寄存器之间的数据传送指令,也可以将立即数传给目标寄存器add 加法指令
sub 减法指令
bic 位清除指令
orr 逻辑或运算指令。

ARM总汇编指令列表

ARM总汇编指令列表

目的操作数1 + 操作数2 + !C 目的操作数1 + 操作数2目的操作数1 & 操作数2跳转至目的地, PC目标地址(PC R14,跳转)(PC R14,跳转并切换为thumb)目的操作数1 XOR 操作数2 LDC P3,C4,[R0] ;P3: C4 [R0]register MemeryRegister<存储器地址>目的操作数1 * 操作数2 + 操作数3 目的源操作数Register状态寄存器CPSR或SPSR<域> 操作数结果MODE(2^32),目的操作数1 * 操作数2 目的~(取反) 源操作数目的操作数1 OR 操作数2目的操作数2 - 操作数1目的操作数2 - 操作数1 - !C=64目的L(操作1 * 操作2)L+ 目的L 目的H(操作1 * 操作2)H +目的HSTC P3,C4,[R0] ;P3:C4[R0]Mem Register<存储器地址>Register 目的操作数1 –操作数2ARM汇编伪指令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。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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} 满自减栈。

相关文档
最新文档