ARM处理器指令集

指令格式

ARM微处理器的指令集可以分为分支指令、数据指令指令、程序状态寄存器(CPSR)处理指令、加载/存储指令、协处理指令和异常处理指令六大类。

ARM指令格式
一般指令格式: < opcode > { < code >} { S } < Rd >{ ,< op2 >}
<>:为不可缺省项;
{ }:可以省略;
opcodecodnS之间没有分隔符;
{S}Rd之间用空格隔开
指令格式说明

项目含义格式说明
< opcode>指令的操作码即助记符,如MOV、ADD、B等
{codn}条件域,满足条才件执行指令可不加条件即可省略条件,如EQ、NE等
S指令执行时是否更新CPSR可以省略
Rd目的寄存器Rd可以为任意通用寄存器
Rn第一个源操作数Rn可以为任意通用寄存器,Rn可以与Rd相同
op2第二个源操作数可为#imm8m、寄存器Rm及任意移位寄存器

指令的条件码

助记符后缀标志含义符号条件码
EQZ置位相等=0000
NEZ清零不相等0001
MIN置位负数-0100
PLN清零正数或零+0101
CSC置位无符号数大于或等于u ≥0010
CCC清零无符号数小于u <0011
LSC清零Z置位无符号数小于或等于u ≤1001
HIC置位Z清零无符号数大于u >1000
GEN等于V带符号数大于或等于1010
LTN不等于V带符号数小于<1011
LEZ置位或(N不等于V)带符号数小于或等于1101
GTZ清零且(N不等于V)带符号数大于>1100
VSV置位溢出0110
VCV清零未溢出0111
AL忽略无条件执行1110

位移操作

位移操作符opsh操作含义示例示例说明
LSL逻辑左移MOV R0, R1, LSL#2将R1中的内容左移2位送R0中,低位用0填充
ASL算数左移MOV R0, R1, ASL#3将R2中的内容左移3位送入R0中,LSL与ASL效果相同可以互换
LSR逻辑右移MOV R0, R1, RSL#2将R1中的内容右移2位送R0中,高位用0填充
ASR算数右移MOV R0, R1, ASR#3将R1中的内容右移3位送入R0中,左端用bit31位的值填充
ROR循环右移MOV R0, R1, ROR#2将R1中的内容循环右移2位送入R0中
RRX扩展的循环右移MOV R0, R1, RRX#2将R1中的内容扩展(C标志)的循环右移两位送到R0中

数据处理指令

指令格式操作功能说明
MOV {cond} {S} Rd, < op2>数据传送Rd ← \gets op2,
MVN{cond}{S} Rd, < op2>取反传送Rd$\gets$0xFFFFFFFF EOR op2,即将op2取反后传送到R1
CMP {cond} Rd, < op2>比较Rd - op2, 更新CPSR中的条件标志位
CMN {cond} Rd, < op2>反值比较Rd + op2, 更新CPSR中的条件标志位
TST {cond} Rd, < op2>位测试Rd AND op2,与操作, 更新CPSR中的条件标志位
TEQ {cond} Rd, < op2>相等测试Rd EOR op2,异或操作, 更新CPSR中的条件标志位
ADD{cond}{S} Rd, Rn < op2>加法Rd ← \gets Rn+op2
ADC{cond}{S} Rd, Rn, < op2>带进位加法RdRd ← \gets Rn+op2+C
SUB{cond}{S} Rd, Rn < op2>减法Rd ← \gets Rn-op2
SBC{cond}{S} Rd, Rn, < op2>带借位减法RdRd ← \gets Rn-op2-!C,!C表示对C取反
RSB{cond}{S} Rd, Rn, < op2>反向减法Rd ← \gets op2-Rn
RSC{cond}{S} Rd, Rn, < op2>带借位反向减法Rd ← \gets op2-Rn-!C
AND{cond}{S} Rd, Rn, < op2>逻辑与Rd ← \gets Rn AND op2,按位相与,有0出0,全1出1
ORR{cond}{S} Rd, Rn, < op2>逻辑或Rd ← \gets Rn ORR op2,按位相或,有1出1,全0出0
EOR{cond}{S} Rd, Rn, < op2>逻辑异或Rd ← \gets Rn EORop2,按位相异或,相同出0,不同出1
BIC{cond}{S} Rd, Rn, < op2>位清零Rd ← \gets Rn AND NOR(op2),指定位清0
MUL{cond}{S} Rd, Rm, Rs32乘法Rb ← \gets Rm×Rs [31:0],只取结果的低32位结果送入Rb
MLA{cond}{S} Rd, Rm, Rs32乘加Rb ← \gets Rm×Rs [31:0] + Rn
SUMULL{cond}{S} RdL, RdH, Rm, Rs64位有符号乘法指令RdL ← \gets Rm×Rs的低32位;RdH ← \gets Rm×Rs的高32位
SMLAL{cond}{S} RdL, RdH, Rm, Rs64位有符号乘加指令RdL ← \gets RdL+Rm×Rs的低32位;RdH ← \gets RdL+Rm×Rs的高32位
UMULL{cond}{S} RdL, RdH, Rm, Rs64位无符号乘加指令RdL ← \gets Rm×Rs的低32位;RdH ← \gets Rm×Rs的高32位
UMLAL{cond}{S} RdL, RdH, Rm, Rs64位无符号乘加指令RdL ← \gets RdL+Rm×Rs的低32位;RdH ← \gets RdL+Rm×Rs的高32位

加载/存储指令

指令格式操作功能说明
LDR {cond} Rd, [Rn {, #< offset>}] {!}字数据加载Rd ← \gets [Rn {offset}],若{!}则Rn = Rn+offset
LDR {cond}B Rd, [Rn {, #< offset>}] {!}字节数据加载Rd ← \gets [Rn {offset}],若{!}则Rn = Rn+offset,Rd的高24位清零
LDR {cond}H Rd, [Rn {, #< offset>}] {!}半字节数据加载Rd ← \gets [Rn {offset}],若{!}则Rn = Rn+offset,Rd的高16位清零
STR {cond} Rd, [Rn {, #< offset>}] {!}字数据存储[Rn {offset}] ← \gets Rd,若{!}则Rn = Rn+offset
STR {cond}B Rd, [Rn {, #< offset>}] {!}字节数据存储[Rn {offset}] ← \gets Rd,若{!}则Rn = Rn+offset
STR {cond}H Rd, [Rn {, #< offset>}] {!}半字节数据存储[Rn {offset}] ← \gets Rd,Rb(存储一个低16位),若{!}则Rn = Rn+offset
LDM {cond} {IA/IB/DA/DB} Rn{!}, < reglist> {^}数据块加载从[Rn]加载寄存器列表
STM {cond} {IA/IB/DA/DB} Rn{!}, < reglist> {^}存储数据块将寄存器类表存储到[Rn]中

汇编器支持的伪指令

类型格式功能描述及举例
符号定义伪指令GBLA 全局变量名定义一个全局数字变量,并初始化为0
GBLL 全局变量名定义一个全局逻辑变量,并初始化为F
GBLS 全局变量名定义一个全局字符变量,并初始化为空
LCLA 局部变量名定义一个局部数字变量,并初始化为0
LCLL 局部变量名定义一个局部逻辑变量,并初始化为F
LCLS 局部变量名定义一个局部字符变量,并初始化为空
变量名SETA表达式给一个数值变量赋值
变量名SETL表达式给一个逻辑变量赋值
变量名SETS表达式给一个字符变量赋值
数据定义伪指令标号 DCB 表达式分配一片连续的字节存储单元并对数据初始化
标号 DCW 表达式分配一片连续的半字存储单元并对数据初始化
标号 DCD 表达式分配一片连续的字存储单元并对数据初始化
标号 DCQ 表达式分配一片连续的双字存储单元并对数据初始化
汇编控制指令IF 逻辑表达式
  指令序列 1
ELSE
  指令序列 2
ENDIF
有条件的按照符合逻辑表达式条件汇编指定的指令序列 1,不满足条件,则执行指令序列2 
WHILE 逻辑表达式
  指令序列
WEND
如果满足逻辑表达式条件,由执行指令序列,否则不执行指令序列
其他指令AREA 段名1,属性2,…
CODE 属性
DATA 属性
READONLY 属性
READWRITE 属性
ALLGN 属性
COMMON
定义一个段如代码段或数据段
定义一个代码段,默认只读 READONLY
定义一个数据码,可读写 READWRITE
只读
只写
对齐方式,按照2(ALLGN)字节对齐
通用段属性
CODE16
CODE32
指示以下指令为16位Thunb指令代码
指示以下指令为32位ARM指令代码
ENTRY汇编语言程序入口
END汇编语言程序结束
名称EQU表达式[,类型]等于伪指令
EXPORT 标号全局标号声明伪指令
INPORT引入一个标号伪指令
EXTERN外部标号引用声明伪指令
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值