• 汇编怎么调用C函数?
      • 直接调用: bl func
    • 汇编中怎么传递参数?
      • 在arm中有个ATPCS规则(ARM-THUMB procedure call standard(ARM-Thumb过程调用标准),约定了R0-R15寄存器的用途
      • R0-R3用作调用者与被调用者之间传递参数,如: ldr r0,=100000 bl delay
    • R4-R11:函数可能被使用,所以在函数的入口保存它们,在函数的出口恢复它们
      • image.png
      • R4-R11可以用别名v1-v8作为别名来一一对应
    • 汇编与C的比较分析
      • image.png
        • sp指针减20空出的区域用来保存局部变量
      • image.png
      • image.pngwhile循环对应的汇编
      • image.png
      • image.png调用delay(1000000)时的汇编,可以看出是符合ATPCS规则的(用r0做参数传递)
      • image.png
    • CPU上电后,会从一个默认的起始地址开始执行(不同芯片可能不同,并且有些可以映射到0地址去使得CPU总是从0地址开始执行)
    • 烧写在flash上的是机器码,flash接在芯片上,芯片内部有ROM(ROM上固化有程序),一上电ROM上的程序先运行,程序会根据启动开关找到flash,然后根据头部信息将flash上的bin文件读到内存中的某个位置,最后跳转到内存中开始执行
    • F103上电后:
      • 设置栈:CPU会从0x08000000读取值,用来设置SP(我们的程序里再次设置了SP)
      • 跳转:CPU从0x08000004得到地址值,根据它的BIT0切换为ARM状态或Thumb状态,然后跳转
        • 对于cortex M3/M4,它只支持Thumb状态,所以0x08000004上的值bit0必定是1
        • 0x08000004上的值 = Reset_Handler + 1
      • 从Reset_Handler继续执行