7.1 数据处理指令

7.1.1 数据传送类

  • MOV 类指令:核内寄存器间的数据传送
  • 加载和存储指令(L/S):核内寄存器与挂在存储器总线上器件的数据传送
  • 注意:
    • 核内寄存器就是 R0-R15
    • 外设寄存器入 GPIO 的寄存器

7.1.2 算术逻辑运算类

  • ADD:假发指令

    • MOV R0,#0x01
    • ADD R0,R0.#0x01
  • SUB:减法指令
  • MUL:乘法指令
  • AND:按位与指令
  • ORR:按位或指令
  • EOR:按位异或指令
  • BIC:清零指令
    • BIC R1,R1,#0x0f
    • 最低 4 位清零
  • 注意:ARM 指令集中没有除法指令,通过软件(移位-比较-相减)实现,不过在 ARMV7 指令集中增加了除法指令

7.1.3 比较指令

  • CMP:比较两个数,会影响标志位
  • TST:测试某一位是否为0,常与 EQ, NE 等条件码结合使用
  • TEQ:判断两个数的位值是否相等,与 EQ, NE 条件码结合使用
  • 注意:它们不需要加后缀 S,它们会直接影响程序状态寄存器,常用于选择/循环结构

7.2 跳转指令

  • B:直接跳到要执行的指令处
  • BL:待返回的跳转指令,相当于 C 语言的函数调用
  • BX:改变状态的跳转,把 RN 的值赋值给 R15(PC),然后改变 CPSR 的 T位, T 位由 RN 里面的最低为即 bit 0 决定
    • Rn[0] = 1, THUMB 状态(在原有的 Rn 上加 1 即可)
    • Rn[0] = 0,ARM 状态
    • BX R0             跳到 R0 地址处
    • 1110 0001 0010 1111 1111 1111 0001 0000
  • BLX:带返回的改变状态的跳转

7.3 协处理指令

  • 协处理器是协助主 CPU 完成一些特定功能(MMU、Cache 和 TLB 等等)的处理器
  • 功能上和操作系统的虚拟地址映射、Cache 管理等有关。
  • 主要的指令有三类
    • 数据操作指令:ARM 处理器通过 CDP 命令通知协处理器完成一些初始化操作,命令的解析由协处理器完成
    • 存储器数据传送指令:ARM 处理器通过 LDC/STC 指令将内存单元的数据读取或者写入到协处理器的寄存器中
    • 寄存器数据传送指令:ARM 处理器通过 MCR/MRC 指令将 ARM 处理器中的寄存器数据与协处理器中的寄存器数据进行数据传送
  • 协处理器有 16 个,一般 CP15 是设置 MMU, Cache, 大小端等关于存储器配置的。
  • CP15 包含 16 个 32 位寄存器, C0 - C15
  • MCR{cond}   coproc, opcode1, Rd, CRn, CRm, opcode2
  • MRC{cond}   coproc, opcode1, Rd, CRn, CRm, opcode2
    • coproc:指令操作的协处理器名,标准名为 pn, n 为 0 ~ 15
    • opcode1:协处理器的特定操作码,对于 CP15 寄存器来说, opcode 永远为0,不为 0 时,操作不可预知
    • Rd:CPU 的寄存器
    • CRn:存放第一个操作数的协处理器寄存器
    • CRm:存放第二个操作数的协处理器,用来区分同一个编号的不同物理寄存器,当不需要提供附加信息时,指定为 C0
    • opcode2:可选的协处理器操作码,用来区分同一个编号的不同物理寄存器,当不需要提供附加信息时,指定为 0

7.4 杂项指令

7.4.1 软中断

  • SWI:软中断,一般用于系统调用,有两种方式完成:

    • 方式一:

      • MOV R0, #0x01          设置子功能为 0x01
      • SWI 0x12                    调用 0x12 软中断
    • 方式二:
      • MOV R0, #0x12
      • MOV R1, #0x01
      • SWI 0x00                    产生中断,模式变成 SVC,跳到中断向量位置去

7.4.2 寄存器与 PSR 数据传送

  • 指令:MRS 和 MSR
  • PSR 的控制域(fsxc):
    • 位【31:24】位条件标志位域,用 f 表示;
    • 位【23:16】为状态位域,用 s 表示;
    • 位【15:8】为扩展位域,用 x 表示;
    • 位【7:0】位控制位域,用 c 表示
  • mrc r0, cpsr              将 cpsr 的值存入到 r0 中
  • msr cpsr_c, #0xd3   将立即数 0xd3 放入到 cpsr 的 C 控制域中

7.5 伪指令

  • 伪指令不是 ARM 指令,但可以把它当作指令来使用,主要作用是方便编写程序,最终还是会转换成 ARM 指令
  • LDR R0,=0x12345678                 ;绝对地址
  • ADR R0,xxx(地址标号)                ;相对地址
  • ADRL R0, xxx(地址标号)        ;相对地址
  • NOP                                               ;MOV R0, R0
  • 区分:
    • adr   r0, _start                     ;取运行地址
    • ldr    r1, _start                   ;取得运行地址中的值(指令)
    • ldr r2, = start                    ;取的是链接地址

七、ARM 指令集的更多相关文章

  1. ARM指令集学习总结-转载

    ARM指令集比较简单,本文介绍ARM指令集中需要注意和不易理解的地方.       一.ARM指令集是32位的,程序的启动都是从ARM指令集开始,包括所有异常中断都是自动转化为ARM状态,并且所有的指 ...

  2. ARM_Instruction_Set_Encoding_hacking(ARM指令集编码格式解读)

    ARM指令集编码格式解读 说明: 1.本文参考的书籍<ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition>中的Cha ...

  3. ARM指令集(上)

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

  4. ARM指令集相关知识

    1.ARMv8引入了执行状态机制,分为AArch32和AArch64 AArch32为T32(Thumb)和A32(ARM). AArch64为A64一种指令集 A64和A32的指令都是32位宽,可以 ...

  5. ARM指令集----杂项指令

    ARM指令集可以分为6类,即是跳转指令,数据处理指令,程序状态传输指令,Load.Store指令,协处理器指令和异常中断指令 跳转指令: 在ARM中有两种方式可以实现程序的跳转,一种是跳转指令,另一种 ...

  6. ARM指令集----寻址方式

    ARM指令集可以分为跳转指令,数据处理指令,程序状态寄存器传输指令,LOAD/Store指令,协处理器指令和异常中断产生指令6类 ARM指令集的寻址方式 数据处理指令的操作数的寻址方式 字以及无符号字 ...

  7. ARM指令集——条件执行、内存操作指令、跳转指令

    ARM 汇编指令条件执行 在ARM模式下,任何一条数据处理指令可以选择是否根据操作的结果来更新CPSR寄存器中的ALU状态标志位.在数据处理指令中使用S后缀来实现该功能. 不要在CMP,CMN,TST ...

  8. 对arm指令集的疑惑,静态库运行,编译报错等问题

    转载自http://www.jianshu.com/p/4a70aa03a4ea?utm_campaign=hugo&utm_medium=reader_share&utm_conte ...

  9. 从最简单的实例学习ARM 指令集(三)

    上一篇讲到赋值运算,这篇讲讲子函数调用.先看最简单范例:test4.c #include <stdio.h> void f1() { } void main() { int d = 4; ...

  10. ARM指令集—SWP指令

    ARM指令集-SWP指令 SWP和SWPB是ARM指令集中对存储单元的原子操作.即对存储单元的一次读和一次不可被切割. SWP和SWPB分别完毕存储器和寄存器之间 一个字(32bit)和一个字节(8b ...

随机推荐

  1. mysql高水位问题解决办法

    数据库中有些表使用delete删除了一些行后,发现空间并未释放产生原因:类比Oracle的高水位线产生原理 delete 不会释放文件高水位 truncate会释放 ,实际是把.ibd文件删掉了,再建 ...

  2. linux 系统环境变量配置

    使用Ubuntu 进行开发绕不开的就是环境变量的配置,由于Linux系统严格的权限管理,造成Ubuntu系统有多个环境变量配置文件,如果不了解其调用顺序,很有可能遇到配置了环境变量,而没有其作用的问题 ...

  3. Dataframe的索引问题

    1 两个Dataframe相加时,一定要注意索引是否对应再相加,利用这个特点有时可以先用set_index()将某些列置为索引列,再进行相加. import pandas as pd df1 = pd ...

  4. 用例a失败,跳过测试用例b和c并标记失败xfail

    前言 当用例a失败的时候,如果用例b和用例c都是依赖于第一个用例的结果,那可以直接跳过用例b和c的测试,直接给他标记失败xfail用到的场景,登录是第一个用例,登录之后的操作b是第二个用例,登录之后操 ...

  5. Selenium学习之==>18种定位方式的使用

    Selenium的定位方式一共有18种,单数8种,复数8种,最后两种是前面这16种的底层封装 单数形式8种 # 1.id定位 al = driver.find_element_by_id('i1') ...

  6. yum基本使用方法

    yum 是 Fedora RHEL Centos SUSE等linux 发行版的 软件包管理工具 通过 执行 man yum 查看yum的帮助信息 可以知道 yum makecache 是将服务器上的 ...

  7. 配置idea中类头注释中的 ${user} 自动获取电脑的名字,怎么去修改名字

    在idea安装路径下找到 idea\IntelliJ IDEA 2018.3.2\bin下面有一个文件叫:idea64.exe.vmoptions 编辑此文件就能修改主时钟自动获取的名称: 例如:添加 ...

  8. k8s/01开启云原生之门(Mooc)

    一.kubernetes(k8s)基础知识 1.简介 在2017年Kubernetes战胜了两个强大的竞争对手Swarm和Mesos,成为容器管理与调度编排领域的首选平台和事实标准. 2014年k8s ...

  9. 20191128 Spring Boot官方文档学习(9.11-9.17)

    9.11.消息传递 Spring Boot提供了许多包含消息传递的启动器.本部分回答了将消息与Spring Boot一起使用所引起的问题. 9.11.1.禁用事务JMS会话 如果您的JMS代理不支持事 ...

  10. vue 格式化时间的插件库

    格式化时间的插件库 点击进入 moment.js网址 ,在这里可以找到需要引入的script标签 点击进入 moment.js的文档 在文档中可以找到对应的格式和例子 此文来源于: https://w ...