• 程序编译处理的基本过程:
      • image.png
    • 我们想深入理解ARM架构,想深入理解汇编与C,想深入理解栈的作用,想深入理解C语言的实质,就必须把最终的可执行程序,反汇编后,阅读得到的汇编代码。
    • 汇编就是将汇编文件转换为可执行文件(目标文件,里面是机器码),而反汇编就是将可执行文件(目标文件,里面是机器码),转换为汇编文件
    • 在gcc下通过objdump命令进行反汇编
    • 反汇编得到的文件中,分为几列,第一列是链接地址、第二列是机器码、第三列是汇编指令

      • image.png

        参考: DDI0403E_B_armv7m_arm.pdf P254 // cortex M3/M4 ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition.pdf P410 // cortex A7

    • 对于伪指令LDR SP, =0XC0100000实际上会转换成一条都内存的指令,一般去PC+offset偏移地址上读取(即实际值保存在PC+offset的内存地址上)

      • image.png
    • 汇编是将汇编指令转换成机器码,CPU只认机器码,不认识汇编指令
    • 不同的ARM架构芯片汇编指令可能类似,但机器码千差万别;通用的、类似的汇编码怎么转换成机器码?
      • 这是由编译器决定的;编译器会根据目标架构转换成对应架构的机器码
      • image.png
        • 对于同一条指令,其机器码完全不同
    • 对于LDR指令,会发现都是从PC+offset(4或8)的位置取数据,为什么可以这样取得数据?
      • image.png为什么PC+4 = 08000090?
      • image.png为什么PC+0 = 80100008?
      • 为什么PC值不等于当前指令的地址呢?
      • image.pngcortex-A7
      • image.pngcortex-M3
      • image.png
      • 当运行ARM指令集时,PC=当前地址+8; 运行Thumb指令时,PC=当前指令+4
      • 为了提高CPU运行效率,ARM指令采用流水线机制
        • 当前执行地址A的指令,
        • 同时已经在对下一条指令进行译码
        • 同时已经在读取下下一条指令:PC = A +4 (Thumb/Thumb2指令集)、PC = A + 8 (ARM指令集)
      • ARM指令集每条指令占4bytes,所以每次地址+4;thumb指令集每条指令占2bytes,所以每次地址+2
      • 为了方便处理,thumb2指令集干脆都让PC=当前地址+4