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. 使用MingGW-w64 Build Script 3.6.7搭建ffmpeg编译环境

    在Linux下编译的Windows版本ffmpeg没有其他的依赖库 使用的是centos 1.脚本下载 wget http://zeranoe.com/scripts/mingw_w64_build/ ...

  2. Sensor在内核中的驱动框架【转】

    本文转载自:http://blog.csdn.net/armfpga123/article/details/52840370 内核中对sensor的抽象:drivers/sensors/sensors ...

  3. python - from … import …

    from . import XXX        默认的就是在当前程序所在文件夹里__init__.py程序中导入XXX   from .A import XXX     如果当前程序所在文件夹里没有 ...

  4. OpenStack Nova 高性能虚拟机之 CPU 绑定

    目录 文章目录 目录 前文列表 KVM KVM 的功能列表 KVM 工具集 KVM 虚拟机的本质是什么 vCPU 的调度与性能问题 Nova 支持的 vCPU 绑定 vcpu\_pin\_set 配置 ...

  5. Jmeter之HTTP常用配置元件(默认、头信息和cookies)

    在进行HTTP接口的测试时,会用到部分常用的配置元件,现在简单的说明: 一.HTTP请求默认值 在测试同一个项目的HTTP请求接口时,会存在部分相同的信息,可以将这些相同的信息提取出来,使用HTTP请 ...

  6. Linux的远程桌面折腾指南

    因为实验服务器需要远程提供给研一童鞋使用,这两天折腾了一下Linux的远程桌面,在此记录总结一下.服务器系统为Lubuntu 16.04 远程登录到Linux 方案一:简单使用--x11vnc 单用户 ...

  7. C++——堆、栈与内存管理

    简介 Stack,是存在于某作用域(scope) 的一块内存空间(memory space).例如当你调用函数,函数本身即会形成一个stack 用來放置它所接收的参数,以及返回地址.在函数本体(fun ...

  8. hdu5993/2016icpc青岛L

    zz:https://www.cnblogs.com/ytytzzz/p/9674661.html 题意:给一棵树,每次询问删掉两条边,问剩下的三棵树的最大直径点10W,询问10W,询问相互独立 So ...

  9. 应用安全 - CMS - PHPCMS漏洞汇总

    CVE-2011-0644 Date: 2011.1 类型: /flash_upload.php SQL注入 影响版本:phpCMS 2008 V2 PHPCMS PHPCMS通杀XSS 在我要报错功 ...

  10. js 如何定义函数

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...