zoukankan      html  css  js  c++  java
  • 七、ARM 指令集

    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                    ;取的是链接地址
  • 相关阅读:
    Codeforces Round #344 (Div. 2) C. Report 其他
    Codeforces Round #344 (Div. 2) B. Print Check 水题
    Codeforces Round #344 (Div. 2) A. Interview 水题
    8VC Venture Cup 2016
    CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂 中二版
    CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂
    CDOJ 1279 班委选举 每周一题 div2 暴力
    每周算法讲堂 快速幂
    8VC Venture Cup 2016
    Educational Codeforces Round 9 F. Magic Matrix 最小生成树
  • 原文地址:https://www.cnblogs.com/kele-dad/p/10927576.html
Copyright © 2011-2022 走看看