嵌入式课程汇编内容总结

基本指令

数据传输指令

  • MOV: 将立即数或寄存器值移动到寄存器中。

    • 示例: MOV R6, #0x80
      • 解释: 将立即数 0x80 加载到寄存器 R6 中。
  • MRS: 从特殊寄存器读取值到通用寄存器。

    • 示例: MRS R5, APSR
      • 解释: 读取特殊寄存器 APSR 的值,并存入寄存器 R5 中。
  • LDR: 从内存加载值到寄存器。

    • 示例: LDR R2, =0x12345678
      • 解释: 将立即数 0x12345678 加载到寄存器 R2 中,通常是通过伪指令实现。
  • STR: 将寄存器值存储到内存地址。

    • 示例: STR R0, [R1, R2, LSL #2]
      • 解释: 将寄存器 R0 的值存储到内存地址 [R1 + (R2 << 2)] 中。

浮点操作指令

  • VMOV.F32: 移动浮点数值到浮点寄存器。

    • 示例: VMOV.F32 S2, #0.5
      • 解释: 将浮点数值 0.5 移动到浮点寄存器 S2
  • VMRS: 将浮点状态寄存器的标志位更新到APSR。

    • 示例: VMRS APSR_nzcv, FPSCR
      • 解释: 将浮点状态寄存器 FPSCR 的标志位更新到 APSR_nzcv 中。

存储器访问指令

  • LDRSH: 加载内存中的有符号半字到寄存器。

    • 示例: LDRSH R2, [R2, #16]
      • 解释: 从内存地址 [R2 + 16] 读取一个有符号的半字数据,存入寄存器 R2
  • LDRB: 从内存加载1字节到寄存器。

    • 示例: LDRB R5, [R6]
      • 解释: 从内存地址 [R6] 读取1字节数据,并存入寄存器 R5
  • ADD: 将两个操作数相加,结果存入寄存器。

    • 示例: ADD R2, R2, #16
      • 解释: 将寄存器 R2 的值与立即数 16 相加,并将结果存入寄存器 R2

栈操作

进栈操作

  • STMFD: 多寄存器存储到栈中,递减栈指针。

    • 示例: STMFD SP!, {R2, R4, R5, R6, R8}
      • 解释: 将寄存器 R2, R4, R5, R6, 和 R8 的值存入栈中,并递减栈指针 SP
  • PUSH: 将指定寄存器的值进栈。

    • 示例: PUSH {R2, R4, R5, R6, R8}
      • 解释: 将寄存器 R2, R4, R5, R6, 和 R8 的值存入栈中。

条件指令

条件跳转

  • 根据比较结果进行跳转。

IT块

  • 用于条件执行多条指令。

特殊操作

PC相关地址访问

  • 从程序计数器(PC)相关的地址加载值。
    • 示例: LDR R1, [PC, #6]
      • 解释: 从当前程序计数器地址加上偏移量 6 的内存位置读取一个字数据,并存入寄存器 R1

非乘法实现乘法

  • 使用移位和加法实现乘法运算。
  • 示例: 将 R6 * 9 实现:
    MOV R7, R6      ; R7 = R6
    ADD R7, R7, R6  ; R7 = R6 * 2
    ADD R7, R7, R6  ; R7 = R6 * 3
    ADD R7, R7, R6  ; R7 = R6 * 9
    
  • 解释
    第一步: 将 R6 的值复制到 R7。
    第二步: 将 R7 的值加上 R6,得到 R6 * 2。
    第三步: 再次加上 R6,得到 R6 * 3。
    第四步: 最后再加上 R6,得到 R6 * 9。