华拓科技网
您的当前位置:首页ARMCortex-M4指令列表.docx

ARMCortex-M4指令列表.docx

来源:华拓科技网
ARM Cortex-M4指令列表

ARM Cortex-M4 支持的指令在下表 1~8中列出。

表1 16位数据操作指令

指令 ADC ADD AND ASR BIC CMN CMP CPY EOR LSL LSR MOV MUL MVN NEG ORR ROR SBC SUB TST REV REVH REVSH SXTB SXTH UXTB UXTH

功能 带进位加法 加法

按位与。这里的按位与和 C的” &功能相同 算术右移

按位清0 (把一个数跟另一个无符号数的反码按位与) 负向比较(把一个数跟另一个数据的二进制补码相比较) 比较(比较两个数并且更新标志) 把一个寄存器的值拷贝到另一个寄存器中 近位异或

逻辑左移(如无其它说明,所有移位操作都可以一次移动多格) 逻辑右移

寄存器加载数据,既能用于寄存器间的传输,也能用于加载立即数 乘法

加载一个数的NOT值(取到逻辑反的值) 取二进制补码 按位或 圆圈右移 带借位的减法 减法

测试(执行按位与操作,并且根据结果更新 在一个32位寄存器中反转字节序

把一个32位寄存器分成两个16位数,在每个16位数中反转字节序 把一个32位寄存器的低16位半字进行字节反转,然后带符号扩展到 带符号扩展一个字节到 32位 带符号扩展一个半字到 32位 无符号扩展一个字节到 32位 无符号扩展一个半字到 32位

32位

Z)

表2 16位转移指令

指令 B B BL BLX CBZ

功能 无条件转移 条件转移

转移并链接。用于呼叫一个子程序,返回地址被存储在 使用立即数的 BLX不要在ARM Cortex-M4中使用 比较,如果结果为 0就转移(只能跳到后面的指令)

LR中

CBNZ

指令

LDR

LDRH LDRB

LDRSH

LDRSB STR

STRH STRB

比较,如果结果非 0就转移(只能跳到后面的指令) If - Then

IT

表3 16位存储器数据传送指令

功能

从存储器中加载字到一个寄存器中 从存储器中加载半字到一个寄存器中 从存储器中加载字节到一个寄存器中 从存储器中加载半字,再经过带符号扩展后存储一个寄存器中 从存储器中加载字节,再经过带符号扩展后存储一个寄存器中 把一个寄存器按字存储到存储器中

把一个寄存器存器的低半字存储到存储器中 把一个寄存器的低字节存储到存储器中 加载多个字,并且在加载后自增基址寄存器 加载多个字,并且在加载后自增基址寄存器 压入多个

寄存器到栈中 LDMIA

从栈中弹出多个值到寄存器中 STMIA

PUSH

POP 16位数据传送指令没有任何新内容,因为它们是 Thumb指令,在v4T时就已经固定下

来了。

表4其它16位指令

功能 指令

系统服务调用 SVC

BKPT 断点指令。如果调试被使能,则进入调试状态(停机) 。或者如果调试监视器

异常被使能,则调用一个调试异常,否则调用一个 fault异常 NOP

CPSIE

CPSID

指令

ADC ADD

ADDW AND

ASR

无操作

使能 PRIMASK(CPSIE i)/FAULTMASK(CPSIE f) 除能 PRIMASK(CPSID i)/FAULTMASK(CPSID f)

清0相应的位 置位相应的位

表5 32位数据操作指令

功能 带进位加法 加法

宽加法(可以加12位立即数) 按位与 算术右移

位清零(把一个数按位取反后,与另一个数逻辑与) 位段清零 位段插入

负向比较(把一个数和另一个数的二进制补码比较,并更新标志位) 比较两个数并更新标志位 计算前导零的数目

BIC

BFC BFI CMN

CMP CLZ

EOR LSL LSR MLA MLS MOVW MOV MOVT MVN MUL ORR ORN RBIT REV REVH/

按位异或 逻辑左移 逻辑右移 乘加 乘减

把16位立即数放到寄存器的底 把16位立即数放到寄存器的咼 移动一个数的补码 乘法 按位或

把源操作数按位取反后,再执行按位或

位反转(把一个 32位整数先用2进制表达,再旋转180度) 对一个32位整数做按字节反转

对一个32位整数的高低半字都执行字节反转

对一个32位整数的低半字执行字节反转,再带符号扩展成 圆圈右移

带进位的逻辑右移一格(最高位用 带符号除法

带符号长乘加(两个带符号的 加到另一个带符号 位整数中)

带符号长乘法(两个带符号的 带符号的饱和运算 带借位的减法 减法

宽减法,可以减12位立即数 字节带符号扩展到 32位数

测试是否相等(对两个数执行异或,更新标志但不存储结果) 测试(对两个数执行按位与,更新 无符号位段提取 无符号除法

无符号长乘加(两个无符号的 加到另一个无符号 位整数中)

无符号长乘法(两个无符号的

32位整数相乘得到 位的无符号积,再把积 32位整数相乘得到 位的无符号积)

Z标志但不存储结果)

32位整数相乘得到 位的带符号积,再把积 32位整数相乘得到位的带符号积)

C填充,且不影响 C的值)

32位整数

从一个32位整数中提取任意的位段,并且带符号扩展成

32位数

16位,咼16位清0

MOVW )

16位,低16位不影响

加载16位立即数到寄存器(其实汇编器会产生

REV16 REVSH ROR RRX SFBX SDIV SMLAL

SMULL SSAT SBC SUB SUBW SXTB TEQ TST UBFX UDIV UMLAL

UMULL USAT UXTB UXTH

无符号饱和操作(但是源操作数是带符号的) 字节被无符号扩展到 32位(咼24位清0) 半字被无符号扩展到 32位(高16位清0)

表6 32位存储器数据传送指令

指令 LDR

LDRB

功能

加载字到寄存器 加载字节到寄存器 LDRH LDRSH

加载半字到寄存器

加载半字到寄存器,再带符号扩展到

32位

LDM

从一片连续的地址空间中加载多个字到若干寄存器 从连续的地址空间加载双字(位整数)到2个寄存器

LDRD STR

存储寄存器中的字 存储寄存器中的低字节

STRB STRH

存储寄存器中的低半字

存储若干寄存器中的字到一片连续的地址空间中

STM STRD

存储2个寄存器组成的双字到连续的地址空间中 把若干寄存器的值压入堆栈中

PUSH POP

从堆栈中弹出若干的寄存器的值

表7 32位转移指令

指令 B BL TBB TBH

功能 无条件转移

转移并连接(调用子程序)

以字节为单位的查表转移。从一个字节数组中选一个 以半字为单位的查表转移。从一个半字数组中选一个

表8其它32位指令

8位前向跳转地址并转移 16位前向跳转的地址并转移

指令

功能

加载字到寄存器,并且在内核中标明一段地址进入了互斥访问状态

LDREX

LDREXH 加载半字到寄存器,并且在内核中标明一段地址进入了互斥访问状态 LDREXB 加载字节到寄存器,并且在内核中标明一段地址进入了互斥访问状态

STREX

检查将要写入的地址是否已进入了互斥访问状态,如果是则存储寄存器的字

STREXH 检查将要写入的地址是否已进入了互斥访问状态,如果是则存储寄存器的半字 STREXB 检查将要写入的地址是否已进入了互斥访问状态,如果是则存储寄存器的字节

CLREX

在本地的处理上清除互斥访问状态的标记 标记)

(先前由LDREX/LDREXH/LDREXB 做的

MRS MSR

加载特殊功能寄存器的值到通用寄存器 存储通用寄存器的值到特殊功能寄存器

NOP SEV

无操作 发送事件

WFE WFI

休眠并且在发生事件时被唤醒 休眠并且在发生中断时被唤醒

ISB DSB

指令同步隔离(与流水线和

MPU等有关) MPU和cache等有关) MPU和cache等有关)

DMB

数据同步隔离(与流水线、 数据存储隔离(与流水线、

因篇幅问题不能全部显示,请点此查看更多更全内容