嵌入式学习笔记-汇编基础

  1. 汇编的指令与伪指令
    指令是cpu机器指令的助记符,通过编译会得到机器码
    伪指令是编译器为辅助引导编译过程而加入的指令,没有实际作用
  2. 两种风格的ARM指令
    官方推荐的大写风格 同时也是windows平台用的风格
    gcc风格则是小写风格
    arm通过寄存器名寻找通用寄存器
  3. ARM汇编特点
    1. 读-改-写 LDR与STR架构
      RISC架构是无法直接读取内存内的数据的,这也是与CISC不同的一点,所以RISC的芯片想要读取数据就要通过芯片内部的寄存器通过“读改写”的方式间接访问内存,即cpu先让寄存器先将对应的内存地址中的数组读进来,然后cpu对寄存器内的数据进行更改,然后cpu再让寄存器将数据装载到内存中
      其中ldr,str就是操作寄存器进行读写内存的指令
      ldr load register 将内存内容加载到通用寄存器的指令
      str store register 将内容装填到内存中的指令

    2. 8种基础的汇编指令
      mov r1 r2 :寄存器寻址 将寄存器r2的值赋给r1 类比于将a赋值给b
      mov r1 #00FF : 立即寻址,通过#后的立即数寻址 类比于c语言给变量赋值的操作
      mov r1 r2 lsl #1 :lsl是左移指令将r2左移#后位数后赋值给r1,左移也可视为2的几倍
      mov r1 [r2] :寄存器间接寻址,加了[]后代表内存地址,将r2的地址赋给r1,类比于c的指针解引用
      mov r1 [r2,#1] :基址变址选址 将r2的地址偏移1位后的值赋给r1
      ldmia r1!,{r2,r3,r4…} :多寄存器加载 r1类比于c中的数组首地址,即弹栈操作
      stmfd sp! ,{r2,r3,r4…}:堆栈寻址与上条指令类似,不过装载的目的地址不同,该操作是读取sp栈指针处的内存,从栈内存上连续访问n个字节,放到后面的寄存器上,即压栈操作
      beq flag: 相对寻址,通过标号跳转到flag处执行,实际是记录一个偏移量,然后在运行过程中基于pc寄存器地址加减偏移量实现

    3. 指令后缀
      常用四种后缀B/H/S/S
      B字节 功能不变,操作长度变为8个字节
      H半字 功能不变,操作长度变为16个字节
      S有符号 功能不变,操作数变为有符号
      S 功能不变,操作长度变为8个字节
      例如:ldrb,ldrh,ldrs

    4. 条件执行后缀
      条件执行后缀是否执行取决于前一条语句
      条件执行后缀决定本条语句是否执行嵌入式学习笔记-汇编基础_第1张图片
      例如 moveq r0 r1 如果cpu的cpsr程序状态寄存器Z位为1,即eq条件达成
      嵌入式学习笔记-汇编基础_第2张图片
      记录cpu运行时执行指令的结果

    5. ARM多级流水线
      取值->解码->执行 并行运作

你可能感兴趣的:(嵌入式学习笔记,嵌入式,arm,编程语言)