ARM汇编语言指令集汇总

2021-11-22 14:12:21 浏览数 (1)

ARM汇编语言指令集汇总
  • 跳转指令
  • 存储器和寄存器交互数据指令(内存访问)
  • 数据传送指令
  • 数据算术运算指令
  • 数据逻辑运算指令
  • 比较指令
  • 组合和分离指令
  • 并行指令
  • 测试指令
  • ThumbEE指令
  • 协处理器指令
  • 伪指令
  • 无线 MMX 技术伪指令
  • 其他指令
  • 寄存器寻址方式

跳转指令

指令

简介

B

无条件跳转

BL

带链接的无条件跳转

BX

带状态跳转,更改指令集

BLX

带链接和状态切换的无条件跳转,更改指令集

BXJ

跳转,更改为 Jazelle

TBB , TBH

表跳转字节、半字

存储器和寄存器交互数据指令(内存访问)

➡️ 代表从左到右 ⬅️ 代表从右到左

指令

简介

LDR

从存储器中加载数据到寄存器 ⬅️

LDR R8,[R9,#04]

R8为待加载数据的寄存器,加载值为 R9 0x4指向的存储单元

STR

将寄存器的数据存储到存储器 ➡️ Store

STR R8,[R9,#04]

将R8寄存器的数据 存到 R9 0x4指向的存储单元 ➡️

LDM

将存储器的数据加载到一个存储器列表 ➡️

LDM R0,{R1-R3}

将R0指向的储存单元的数据依次加载到R1,R2,R3寄存器 ➡️

STM

将一个寄存器列表的数据 存储到指定的存储器 ⬅️

PUSH

将寄存器值推入堆栈

POP

将堆栈值推出到寄存器

SWP

将寄存器与存储器之间的数据进行交换

SWP R1,R1 [R0]

将R1寄存器与R0指向的存储单元的内容进行交换

PLD

预载数据

PLI

预载指令

RFE

从异常中返回

SRS

存储返回状态

LDREX 和 STREX

独占加载和存储寄存器。

CLREX

独占清零,清除执行处理器的局部记录:有地址请求进行独占访问

数据传送指令

指令

简介

MOV

将立即数或寄存器的数据传送到目标寄存器 ⬅️

MOV R1,R0

将寄存器R0的值传送到寄存器R1

MOV PC,R14

将寄存器R14的值传送到PC,常用于子程序返回

MOV R1,R0,LSL#3

将寄存器R0的值左移3位后传送到R1(即乘8)

MOVS PC, R14

将寄存器R14的值传送到PC中,返回到调用代码并恢复标志位

MVN R0,#0

将立即数0取反传送到寄存器R0中,完成后R0=-1(有符号位取反)

数据算术运算指令

指令

简介 ⬅️

ADD

加 ️

SUB

减️

MUL

DIV

ADC

带进位的加法指令

SBC

带借位减法指令

AND

逻辑“与”

ASR

算术右移

RSB

反向减法

SBC

带进位减法

RSC

带进位反向减法(仅 ARM)

SDIV

有符号除法

UDIV

无符号除法

QADD

有符号加法

QSUB

有符号减法

QDADD

加倍加法

QDSUB

加倍减法

SSAT

将有符号值饱和到有符号范围内

USAT

可将有符号值饱和到无符号范围内

数据逻辑运算指令

指令

简介

AND

ORR

或️

EOR

异或️

移位

因为是2进制,逻辑移位左移变大,右移变小,且按2的倍数进行

LSL

逻辑左移 ⬅️

LSR

逻辑右移 ⬅️

ROR

将 Rm 中的值向右循环移

RRX

可提供经右移一位后的寄存器中的值

比较指令

指令

简介

CMP

直接比较

CMP R0 #0

R0寄存器中的值和0比较

CMN

负数比较指令

CMN R1,R0

将寄存器R1的值与寄存器R0的值相加,并根据结果设置CPSR的标志位

CMN R1,#100

将寄存器R1的值与立即数100相加,并根据结果设置CPSR的标志位

CBZ

比较,为零则跳转

CBNZ

比较,为非零则跳转

组合和分离指令

指令

简介

BFC 和 BFI

位域清零和位域插入

SBFX 和 UBFX

有符号或无符号位域提取

SXT、SXTA、UXT 和 UXTA

符号扩展或零扩展指令,可选择进行加法运算

PKHBT 和 PKHTB

半字组合指令

并行指令

指令

简介

USAD8

差值的绝对值无符号求和

USADA8

差值的绝对值无符号求和再累加

SSAT16

可将有符号值饱和到有符号范围内

USAT16

可将有符号值饱和到无符号范围内

SXT、SXTA UXT 和 UXTA

号扩展,符号扩展加,零扩展和零扩展加

测试指令

指令

简介

TST

位测试指令

TST R1,#%1

用于测试在寄存器R1中是否设置了最低位(%表示二进制数)

TST R1,#0xffe

将寄存器R1的值与立即数0xffe按位与,并根据结果设置CPSR的标志位

TST R0, #0x8

测试bit_3是否为0

TEQ

位测试指令

TEQ R1,R2

将寄存器R1的值与寄存器R2的值按位异或,并根据结果设置CPSR的标志位

ThumbEE指令

指令

简介

ENTERX, LEAVEX

将状态更改为 ThumbEE 或更改状态 ThumbEE

CHKA

(检查数组)可比较两个寄存器中的无符号值

HB、HBL、HBLP 、HBP

处理程序跳转,跳转到指定处理程序

SEL

根据 APSR GE 标记的状态,从每个操作数中选择字节

REV、REV16、REVSH 和 RBIT

在字或半字内反转字节或位的顺序

协处理器指令

指令

简介

CDP

协处理器数据处理操作

CDP2

协处理器数据处理操作

MCR、MCR2、MCRR 和 MCRR2

从寄存器移动到协处理器

LDC、LDC2、STC、STC2

在内存和协处理器之间传送数据,加载协处理器

伪指令

指令

简介

ADRL

将相对于程序或相对于寄存器的地址载入寄存器中(中等范围,与位置无关)

MOV32

将 32 位常数或地址载入寄存器(无范围限制,但与位置相关)

LDR

将 32 位常数或地址载入寄存器(无范围限制,但与位置相关)

UND

生成无体系结构定义的指令。可用于所有 ARM 体系结构

无线 MMX 技术伪指令

指令

简介

例子

TMCR

将源寄存器 Rn 的内容移到控制寄存器 wCn 中

TMCR wc1, r10

TMCRR

将两个源寄存器 RnLo 和 RnHi 的内容移到目标寄存器 wRd

TMCRR wr4, r5, r6

TMRC

将控制寄存器 wCn 的内容移到目标寄存器 Rd。不要将 r15 用于 Rd。

TMRC r1, wc2

TMRRC

将源寄存器 wRn 的内容移到两个目标寄存器 RdLo 和 RdHi。

TMRRC r1, r0, wr2

WMOV

将源寄存器 wRn 的内容移到目标寄存器 wRd。

WMOV wr1, wr8

WZERO

清零目标寄存器 wRd。

WZERO wr1

其他指令

指令

简介

CPS

更改处理器状态

CPY

复制

DBG

调试

SWT

协处理器指令,切换用户模式

DCB

伪指令:分配一片连续的字节存储单元并用指定的数据初始化

BIC

位清零指令

BIC R0,R0,#%1011

该指令清除 R0 中的位 0、1、和 3,其余的位保持不变

BKPT

断点,当指令到达某个特定地址处时,使用此指令来检查系统状态

MRS

将 PSR 的内容移到通用寄存器中,MRS{cond} Rd, psr

MSR

将通用寄存器的立即数或内容加载程序状态寄存器 (PSR) 的指定位段中

CPS

更改处理器状态,只允许在特权模式下使用

SMC

安全监控调用 SMC{cond} #immed_16

SETEND

设置 CPSR 中的端序位,不影响 CPSR 中的其他位

NOP

进行填充来使当前位置与指定的边界对齐

SEV

设置事件

WFE|WFI|YIELD

等待事件,等待中断,通知

WFI

WFI 会暂时将执行中断挂起,直至发生IRQ后

YIELD

YIELD 可告知硬件有线程正在执行任务,例如可换出的自旋锁

DBG

调试提示可向调试系统及其相关系统发送提示

DMB

数据内存屏障可作为内存屏障使用。

DSB

数据同步屏障是一种特殊类型的内存屏障

ISB

指令同步屏障

MAR

MAR 指令可将 RdLo 中的值复制到 Acc 的位 [31:0] 中,还会将 RdHi 的最低有效字节复制到 Acc 的位 [39:32] 中。MAR{cond} Acc, RdLo, RdHi

MRA

MRA{cond} RdLo, RdHi, Acc 可进行以下操作:将 Acc 的 [31:0] 位复制到 RdLo

寄存器寻址方式

指令

简介

立即寻址

MOV R0,#1234 R0=0x1234

寄存器寻址

MOV R0,R1 R0=R1

寄存器移位寻址

MOV R0,R1,LSL #2 R0=R1*4

寄存器间接寻址

LDR R0,[R1] ;将R1寄存器中的值作为地址,取出值给R0

寄存器间接寻址偏移寻址

LDR R0,[R1,#-4]

更多可参考 《AR

0 人点赞