[基于Android的ARM汇编语言系列]之五:ARM指令集与Thumb指令集

作者:郭嘉

邮箱:[email protected]

博客:http://blog.csdn.net/allenwells

github:https://github.com/AllenWell

写在前面:本篇文章旨在大致介绍下ARM指令集的相关内容,这里也同时提供一个有详细解释和用例的待书签的PDF版本,方便大家查阅。

ARM指令集详解

指令集是处理器的核心,ARM指令的基本格式如下所示:

opcode {cond}{S}{.W\.N}Rd, Rn{.operand2}
  • S:指定是否影响CPSR寄存器的值,如ADDS,SUBS等。
  • .W.N:指令宽度说明符。
  • Rd:目的寄存器。
  • Rn:第一个操作数寄存器。
  • operand2:第二个操作数,第二个操作数可以是立即数、寄存器或寄存器位操作,
  • cond:执行条件,它的取值如下图所示:

一 跳转指令

1.1 B

跳转指令。

1.2 BL

带链接的跳转指令。

1.3 BX

带状态切换的跳转指令。

二 存储器访问指令

2.1 LDR

从存储器中加载数据到寄存器。

2.2 STR

存储数据到指定的存储单元。

2.3 LDM

从指定的存储单元加载多个数据到一个寄存器列表。

2.4 STM

将一个寄存器列表的数据的数据存储到指定的存储单元。

2.5 PUSH

将寄存器推入满递减堆栈。

2.6 POP

从递减堆栈中弹出数据到寄存器。

2.7 SWP

用于寄存器和存储器之间的数据交换。

三 数据处理指令

3.1 MOV

将8位立即数或寄存器里的内容送到目标寄存器中。

3.2 MVN

将8位立即数或寄存器里的内容按位取反后送到目标寄存器中。

3.3 ADD

加法指令。

3.4 ADC

带进位的加法指令。

3.5 SUB

减法指令。

3.6 RSB

逆向减法指令。

3.7 SBC

带进位的减法指令。

3.8 RSC

带进位的逆向减法指令。

3.9 MUL

乘法指令。

3.10 MLS

3.11 MLA

3.12 UMULL

3.13 UMLAL

3.14 SMULL

3.15 SMLAL

3.16 SMLAD

3.17 SMLSD

3.18 SDIV

有符号数除法指令。

3.19 UDIV

无符号数除法指令。

3.20 ASR

算术右移指令。

3.21 AND

逻辑与指令。

3.22 ORR

逻辑或指令。

3.23 EOR

异或指令。

3.24 BIC

位清除指令。

3.25 LSL

逻辑左移指令。

3.26 LSR

逻辑右移指令。

3.27 ROR

循环右移指令。

3.28 RRX

带扩展的循环右移指令。

3.29 CMP

3.30 CMN

3.31 TST

位测试指令。

3.32 TEQ

四 其他指令

4.1 SWI

软中断指令。

4.2 NOP

空操作指令。

4.3 MRS

读状态寄存器指令。

4.4 MSR

写状态寄存器指令。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-03 23:02:16

[基于Android的ARM汇编语言系列]之五:ARM指令集与Thumb指令集的相关文章

[基于Android的ARM汇编语言系列]之一:ARM汇编语言开篇

作者:郭嘉 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell 这是[基于Android的ARM汇编语言系列]博文的开篇文章,这里会先介绍一下ARM处理器的大致分类和作用. 一 ARM处理器与ARM指令集 整个ARM处理器被分为三个部分: Classic Embedded Application Classic被称为经典系列. ARM1~ARM11一直都以数字来命名

[基于Android的ARM汇编语言系列]之二:原生程序的生成过程

作者:郭嘉 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell 所谓的原生程序指的是用C/C++编写的程序,下面来详细演示一下原生程序是怎么一步步生成汇编代码的. 这里编译的是一个简单的hello.c程序,如下所示: #include <stdio.h> int main(int argc, char* argv[]){ printf("Hello AR

[基于Android的ARM汇编语言系列]之三:ARM汇编语言程序结构

作者:郭嘉 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell Android平台的ARM汇编是GNU ARM汇编格式,使用的汇编器是GAS(GNU Assembler),GAS有自己的一套语法结构.详细的内容可以查阅GAS语法结构官方手册. 我们先来看一个完整的ARM汇编程序: C代码: #include <stdio.h> int main(int argc,

[基于Android的ARM汇编语言系列]之六:NEON指令集与VFP指令集

作者:郭嘉 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell NEON指令集与VFP指令集是ARM指令集的扩展,多用于多媒体编程和浮点运算. 一 Android平台使用NEON指令集与VFP指令集 Android NDK从r3版本开始也添加了对NEON指令集与VFP指令集的支持.使用方法如下所示: 1 运行时检测处理器是否支持NEON指令集与VFP指令集 Andr

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

MCU使用什么指令集主要由内核决定的,比如Cortex-M3使用的是Thumb-2指令集 ARM指令集: 编代码全部是 32bits 的,每条指令能承载更多的信息,因此使用最少的指令完成功能, 所以在相同频率下运行速度也是最快的, 但也因为每条指令是32bits 的而占用了最多的程序空间. Thumb指令集: 编代码全部是 16bits 的,每条指令所能承载的信息少,因此它需要使用更多的指令才能完成功能, 因此运行速度慢, 但它也占用了最少的程序空间 Thumb-2指令集:在前面两者之间取了一个

[基于Android的ARM汇编语言系列]之四:ARM处理器的寻址方式

作者:郭嘉 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell 处理器的寻址方式是通过指令给出的地址码字段来寻找真实操作数地址的方式,ARM处理器支持9中寻址方式. 一 立即寻址 立即寻址指令后面的地址码部分为立即数(常量或常数),立即寻址多用于给寄存器赋值. 举例 MOV RO, #1234 指令执行后,R0=1234. 二 寄存器寻址 寄存器寻址中,操作数在寄存

ARM汇编语言实现while循环

.section .data .output: .ascii "%d\n\000" .section .text .global main main: mov ip, sp stmfd sp!, {fp,ip,lr,pc} sub fp, ip, #4 sub sp, sp, #80 @memory and register mov r3, # 1 mov r0,r3 loop: cmp r0,# 15 bge stop mov r1,# 1 add r2, r0, r1 mov r0

ARM v7-A 系列CPU的MMU隐射分析

ARM v7-A 系列CPU的MMU隐射分析 摘要:ARM v7-A系列的CPU加入了很多扩展,如多核处理器扩展.大物理地址扩展.TrustZone扩展.虚拟化扩展.若支持大的物理地址,则必须支持多核处理器:若支持虚拟化,则必须支持大的物理地址.多核处理器.TrustZone.加入这些扩展后,相应的MMU(虚拟地址到物理地址的隐射功能)结构也改变了许多.本文首先分析加入扩展后MMU的整体结构,然后详细介绍地址转换中用到短描述符格式(32位)和长描述符格式(64位),以及如何实现虚拟地址到物理地址

ARM 汇编语言源代码行的语法规则

ARM 汇编语言源代码行的语法规则 3.1 Syntax of source lines in assembly language 汇编器首先解析汇编语言源代码,然后把源代码汇编成目标文件.汇编语言源代码的每一行都要符合如下所示的语法格式:      {symbol} {instruction|directive|pseudo-instruction} {;comment} 语法格式中的以大括号分割的三个部分都是可选的. symbol通常表示一个标号.在指令和伪指令中,symbol总是一个标号.