指令格式

ARM基本格式

<opcode>{<cond>}{S}{.W|.N}<Rd>,<Rn>{,<operand2>}

opecode:指令助记符

cond:执行条件

助记符

标志

含义

EQ

Z=1

相等

NE

Z=0

不相等

CS/HS

C=1

无符号数大于或等于

CC/LO

C=0

无符号数小于

MI

N=1

负数

PL

N=0

正数或0

VS

V=1

溢出

VC

V=0

没有溢出

HI

C=1,Z=0

无符号数大于

LS

C=0,Z=1

无符号数小于或等于

GE

N=V

有符号数大于或等于

LT

N!=V

有符号数小于

GT

Z=0,N=V

有符号数大于

LE

Z=1,N!=V

有符号数小于或等于

AL

任何

无条件执行(指令默认条件)

S:指令是否影响CPSR寄存器

.W和.N:宽度说明符,默认16位,32位使用 .W说明符。ARM和Thumb都可以使用

1。跳转指令,4条

1。B跳转:B{cond} label

2。BL带链接跳转(类似单步步入)将当前指令下一条指令地址存入R14寄存器,常用来调用子程序:BL{cond} label

3。BX带状态切换跳转(在ARM与Thumb之间切换)处理器判断Rm的位[0]为1,是则将CPSR寄存器标志T置位,切换至Thumb,反之切换为ARM:RX{cond} Rm

4。BLX带链接和状态切换的跳转:BLX{cond} Rm

2。存储器访问指令:

LDR:寄存器←存储器

格式:LDR{type}{cond} Rd,label         LDRD{cond} Rd,Rd2,label

Type取值:

B:无符号字节(加载时0扩展为32位)

SB:有符号字节(加载时符号扩展为32位)

H:无符号半字节(加载时0扩展为32位)

SH:有符号半字节(加载时符号扩展为32位)

Rd:加载寄存器

Label:读取的内存地址

LDRD:一次加载双字的数据

STR:寄存器→内存

STR{type}{cond} Rd,label

STRD{cond} Rd,Rd2,label

Type中的SB和HS对STR无效

LDM可以指定多个存储单元:寄存器←内存

LDM{addr_mode}{cond} Rn{!} reglist

addr_mode:

IA:Increase After,基址寄存器在执行指令后增加,默认

IB:Increase Before,基址寄存器在执行指令前增加(仅ARM)

DA:Decrease After,基址寄存器在执行指令后减少(仅ARM)

DB:Decrease Before,基址寄存器在执行指令之前减少

FD:满递减堆栈,堆栈向低地址生长,堆栈指针指向最后一个入栈的有效数据项

FA:满递增堆栈,堆栈向高地址生长,堆栈指针指向下一个要放入的空地址

ED:空递减堆栈,堆栈向低地址生长

EA:孔递增堆栈,堆栈向高地址生长

Rn:基地址寄存器,存储初始地址

!:可选后缀,有则最终地址将写回到Rn寄存器

reglist:存储数据的寄存器列表,多个连续寄存器可用“-”链接,不连续用“,”分隔

  STM:寄存器列表数据→内存

  STM{addr_mode}{cond} Rn{!} reglist

PUSH:将寄存器推入满递减堆栈

PUSH{cond} reglist

POP:从满递减堆栈弹出寄存器信息

POP{cond} reglist

SWP:寄存器←→内存

SWP{B}{cond} Rd,Rm,[Rn]

B:可选字节,有B则交换字节否则交换32位的字

cond:执行条件

Rd:从内存中加载数据的寄存器

Rm:写入数据的到内存的寄存器

Rn:需要交换数据的存储器地址。Rn不能与Rd和Rm相同

Eg:SWP R1,R1,[R0]  交换R1和R0

SWPB R1,R2,[R0] 将R0一字节给R1高位清0,R2给内存

3。数据处理指令:数据传输,算术运算,逻辑运算,比较4类。

数据处理指令是寄存器之间的数据操作,均可使用S后缀决定是否影响状态标志。

比较指令,不需要S后缀直接影响状态标志

MOV:将8位的立即数或寄存器内容传送到目标寄存器

MOV{cond} {S} Rd,operand2

MVN:将8位的立即数或寄存器内容按位取反传送到目标寄存器

MVN{cond}{S} Rd,operand2

ADD

ADD{cond}{S} Rd,Rn,operand2

ADC:带进位加法,将Rn寄存器与operand2值相加,再加上CPSR寄存器的C条件标志位的值,保存到Rn寄存器

ADC{cond}{S} Rd,Rn,operand2

SUB:Rn-operand2  减法

SUB{cond}{S} Rd,Rn,operand2

RSB:operand2-Rn   逆向减法 

RSB{cond}{S} Rd,Rn,operand2

SBC:Rn-operand2-CPSR寄存器的C条件标志位的值

  SBC{cond}{S} Rd,Rn,operand2

  RSC:operand2-Rn-CPSR寄存器的C条件标志位的值

  RSC{cond}{S} Rd,Rn,operand2

  MUL:Rd=Rm*Rn

  MUL{cond}{S} Rd,Rm,Rn

  MLS:Rd=Ra-Rm*Rn

  MLS{cond}{S} Rd,Rm,Rn,Ra

  UMULL:将Rm*Rn的值分成RdHi=高32位,RdLo=低32位

UMULL{cond}{S} RdLo,RdHi,Rm,Rn

SMULL:将Rm*Rn的值作为无符号数分成RdHi=高32位,RdLo=低32位

  SMULL{cond}{S} RdLo,RdHi,Rm,Rn

UMLAL:将Rm*Rn的值作为无符号数分成RdHi=高32位,RdLo=低32位,然后64位结果在于RdHi和RdLo相加

  UMLAL{cond}{S} RdLo,RdHi,Rm,Rn

  SMLAL:将Rm*Rn的值作为有符号数分成RdHi=高32位,RdLo=低32位,然后64位结果在于RdHi和RdLo相加,

  SMLAL{cond}{S} RdLo,RdHi,Rm,Rn

  SMLAD:Rd=Rm*Rn(都是低半字节)+Rm*Rn(都是高半字节)+Ra

  SMLAD{cond}{S} Rd,Rm,Rn,Ra

  SMLSD:Rd= Rm*Rn(都是低半字节)-Rm*Rn(都是高半字节)+Ra

  SMLSD{cond}{S} Rd,Rm,Rn,Ra

SDIV:有符号除法

SDIV{cond} Rd,Rm,Rn

  UDIV:无符号除法

UDIV{cond} Rd,Rm,Rn

ASR:算术右移

ASR{cond}{S} Rd,Rm,operand2

AND

  AND{cond}{S} Rd,Rn,operand2

  ORR

  ORR{cond}{S} Rd,Rn,operand2

  EOR

  EOR{cond}{S} Rd,Rn,operand2

  BIC:位清除指令,将operand2取反,与Rn值 与操作 结果保存到Rd

  BIC {cond}{S} Rd,Rn,operand2

  LSL:逻辑左移

  LSL{cond}{S} Rd,Rm,operand2

  LSR:逻辑右移

  LSR{cond}{S} Rd,Rm,operand2

  ROR:循环右移,移出的位回到左边

  ROR{cond}{S} Rd,Rm,operand2

  RRX:带扩展循环右移,Rm循环右移1位,寄存器最高位用标志为的值填充,结果存入Rd

  RRX{cond}{S} Rd,Rm

  CMP:Rn-operand2,根据结果设置标志位

  CMP{cond} Rn,operand2

  CMN:Rn+operand2,根据结果设置标志位

  CMN{cond} Rn,operand2

  TST:位测试指令,Rn与operand2与操作,根据结果设置标志位

  TST{cond} Rn,operand2

  TEQ:位测试指令,Rn与operand2异或操作,根据结果设置标志位

  TEQ{cond} Rn,operand2

4。其他指令:

SWI:软件中断指令

SWI{cond},immed_24

Android系统中,系统调用为0号中断,R7寄存器存放系统调用号,R0~R3

传递系统调用前的4个参数,大于4个参数用堆栈调用

NOP:空指令

MRS:读状态寄存器指令

MRS Rd,psr        psr取值可以是CPSR或SPSR

MSR写状态寄存器指令

MSR Rd,psr_fields,operand2

field指定传送区域(field所代表的字母必须小写):

c:控制域屏蔽字节(psr[7…0])

x:扩展域屏蔽字节(psr[15…8])

s:状态域屏蔽字节(psr[23…16])

f:标志域屏蔽字节(psr[31…24])

13 ARM指令集与Thumb指令集的更多相关文章

  1. 【基于Android的ARM汇编语言系列】之五:ARM指令集与Thumb指令集

    作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell [ ...

  2. ARM指令集、Thumb指令集、Thumb-2指令集

    MCU使用什么指令集主要由内核决定的,比如Cortex-M3使用的是Thumb-2指令集 ARM指令集: 编代码全部是 32bits 的,每条指令能承载更多的信息,因此使用最少的指令完成功能, 所以在 ...

  3. Thumb指令集与ARM指令集的差别

    Thumb指令集          Thumb指令能够看做是ARM指令压缩形式的子集.是针对代码密度[1]的问题而提出的.它具有16为的代码密度.Thumb不是一个完整的体系结构,不能指望处理程序仅仅 ...

  4. ARM指令和Thumb指令区别

    Thumb指令集 ]的问题而提出的,它具有16为的代码密度.Thumb不是一个完整的体系结构,不能指望处理程序只执行Thumb指令而不支持ARM指令集.因此,Thumb指令只需要支持通用功能,必要时, ...

  5. 【原/转】ios指令集以及基于指令集的app包压缩策略

    iPhone指令集   本文所讲的内容都是围绕iPhone的CPU指令集(想了解ARM指令集的同学请点击这里),现在先说说不同型号的iPhone都使用的是什么指令集: ARMv8/ARM64 = iP ...

  6. ARM状态和THUMB状态

    ARM处理器的工作状态 在ARM的体系结构中,可以工作在三种不同的状态,一是ARM状态,二是Thumb状态及Thumb-2状态,三是调试状态. <嵌入式系统开发与应用教程(第2版)>上介绍 ...

  7. ARM的六大类指令集---LDR、LDRB、LDRH、LDM、STR、STRB、STRH、STM

    http://blog.csdn.net/u013477200/article/details/50723555

  8. ARM指令集(上)

    ADuC702x可以用两套指令集:ARM指令集和Thumb指令集.本小节介绍ARM指令集.在介绍ARM指令集之前,先介绍指令的格式. A.2.1  指令格式         (1)基本格式       ...

  9. ARM 中必须明白的几个概念

    文章具体介绍了关于ARM的22个常用概念. 1.ARM中一些常见英文缩写解释 MSB:最高有效位: LSB:最低有效位: AHB:先进的高性能总线: VPB:连接片内外设功能的VLSI外设总线: EM ...

随机推荐

  1. SDOI2010选做

    Round1 D1T1外星千足虫 \(BSOJ2793\)--高斯消元解异或方程组 简述 有\(n\)个数\(\{a_i\}\) 给出\(m\)个信息,每个信息给出\(\displaystyle{(\ ...

  2. PATA1062 Talent and Virtue

    技术要点就是,一个是cmp函数的书写,首先应该分清楚排序关系,然后按照顺序依次排下去. 还有这里有一个巧妙点就是,在结构体中加入了类别这个标签. 学会抽象分类解决,排序比较函数cmp本质工作就是比较结 ...

  3. PATB1048数字加密

    关于代码都是可以在PAT上跑通的 自己是在VS2017上写的,所以会有语句system("pause");,表示暂定方便查看结果. *在一个是VS2017中使用scanf会报错,所 ...

  4. docker 修改gwbridge ip address

    docker_gwbridge介绍 docker_gwbridge接口为使用多主机群覆盖网络的所有容器和任务提供默认网关功能.它是在每个Docker主机上创建的,当它们加入集群时.如果接口docker ...

  5. The import junit cannot be resolved解决问题

    第一次安装Junit,配置环境之后发现添加语句import junit.framework.TestCase; 编译错误 解决:项目右键Properties->Java Build Path-& ...

  6. Python3.7 - Argparse模块的用法

    argparse 是一个命令行参数解析模块. argparse 是python自带的命令行参数解析包,可以用来方便地读取命令行参数,当你的代码需要频繁地修改参数的时候,使用这个工具可以将参数和代码分离 ...

  7. QuantLib 金融计算——收益率曲线之构建曲线(5)

    目录 QuantLib 金融计算--收益率曲线之构建曲线(5) 概述 Nelson-Siegel 模型家族的成员 Nelson-Siegel 模型 Svensson 模型 修正 Svensson 模型 ...

  8. mongodb compass 启动报错()

    报错: 原因:由于直接关闭客户端,进程没关导致下次开启时,后台还是运行的所以无法重新开启 解决办法: 1.查看进程 tasklist | findstr “MongoDBCompass.exe” 2. ...

  9. Maven -------------- Eclipse 安装maven ,配置setting文件

    1.设置maven路径 Window->Preferences->Maven->Installations-> 选择maven的路径,如果原来有低版本的建议删除 选择好后点击f ...

  10. unity延迟加载图片

    把加载图片所需要的信息封装成一个任务(自己写的类,包括路径,回调等信息),再将该任务添加到自己写的任务池中(在update中执行任务委托),由于只是添加任务操作,加载完成后自动调用回调函数实例化,对主 ...