简介

  • ARM基于精简指令集RISC
  • 有32位ARM指令集和16位Thumb指令集,ARM指令集效率高代码密度低,Thumb密度较高,是ARM的子集
  • 所有ARM指令可有条件执行,而Thumb指令仅有一条指令(跳转指令)有条件执行功能
  • 两种指令集下的程序可相互调用

寻址方式分类

寄存器寻址

操作数保存在寄存器中,地址码字段是寄存器编号

  • MOV R1,R2 将R2的值存入R1
  • SUB R0,R1,R2 R0 = R1 - R2

    立即寻址

    操作码字段后面的地址码部分就是操作数本身,操作数是指令的一部分

  • MOV R0,#0xFF00

    寄存器移位寻址

    第二个操作数是寄存器移位方式

  • MOV R0,R2,LSL #3 R2的值左移3位,放入R0

  • ANDS R1,R1,R2,LSL R3 R2的值左移R3里的数的位,并于R1相与存在R1中

    寄存器间接寻址

    所需的操作数保存在寄存器指定地址的存储单元中,寄存器相当于指针

  • LDR R1,[R2] 将R2指向的存储单元的数据读出,保存在R1中

  • SWP R1,R1,[R2] 将R1的值和R2指定的寄存器中的值交换

    基址寻址

    将基址寄存器的内容与指令中给出的偏移量相加,即指针+偏移量

  • LDR R2,[R3,#0x0C] 读取R3+0x0C地址上的存储单元的内容存入R2,但不改变R3中的值

  • STR R1,[R0,#-4]! 将R1保存在R0-4指向的内存单元中,并更新R0中的值

    多寄存器寻址

    一次传送几个寄存器值,寄存器列表中的寄存器数不能多于16个,排列必须由大到小

  • LDMIA R1!,{R2-R7,R12} 将R1指向的单元中的数据读出到R2~R7,R12中,每读出一个R1自动加4

    堆栈寻址

  • 后进先出

  • 堆栈寻址是隐含的,使用一个专门的寄存器(堆栈指针),指针指向栈顶
  • 生长方式分两种
    • 向上生长:向高地址生长
    • 向下生长:向低地址生长
  • 堆栈两种形式
    • 满堆栈:指针指向的是最后压入堆栈的有效数据项
    • 空堆栈:指针指向的是下一个待压入数据的空位置
  • 组合有四种堆栈的工作方式

    • 满递增 LDMFA STMFA
    • 空递增 LDMEA STMEA
    • 满递减 LDMFD STMFD
    • 空递减 LDMED STMED

      块拷贝寻址(多地址寻址)

      用于将一块数据从存储器的某一位置拷贝到另一位置
  • STMIA R0!,{R1-R7} 将R1-R7的数据存储到R0指向的地址空间中,每次R0,递增

    相对寻址

    基址寻址的变通,由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量