- 汇编怎么调用C函数?
- 直接调用: bl func
- 汇编中怎么传递参数?
- 在arm中有个ATPCS规则(ARM-THUMB procedure call standard(ARM-Thumb过程调用标准),约定了R0-R15寄存器的用途
- R0-R3用作调用者与被调用者之间传递参数,如: ldr r0,=100000 bl delay
- R4-R11:函数可能被使用,所以在函数的入口保存它们,在函数的出口恢复它们
- R4-R11可以用别名v1-v8作为别名来一一对应
- 汇编与C的比较分析
- sp指针减20空出的区域用来保存局部变量
- while循环对应的汇编
- 调用delay(1000000)时的汇编,可以看出是符合ATPCS规则的(用r0做参数传递)
- 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继续执行