1. 汇编怎么调用C函数
1.1 直接调用
cpp
bl main
1.2 想传参数怎么办?
在arm中有个ATPCS规则(ARM-THUMB procedure call standard(ARM-Thumb过程调用标准)。 约定r0-r15寄存器的用途:
-
r0-r3
调用者和被调用者之间传参数
-
r4-r11
函数可能被使用,所以在函数的入口保存它们,在函数的出口恢复它们。
代码示例:
cpp
int delay(unsigned int d)
{
while (d--);
return 0;
}
在汇编里调用delay:
cpp
ldr r0, =1000000 /* 给delay函数传参数,保存在r0里 */
bl delay
cmp r0, #0 /* 返回值保存在r0中 */
2. C函数的反汇编码阅读
要解决这几个问题:
-
为什么调用C函数前要设置栈?栈的作用是?
-
C函数传参
-
C函数执行过程体验
3. Flash上的内容
3.1 反汇编示例
3.2 烧写在Flash上的内容
地址 | Flash内容 |
---|---|
0x08000000 | 00000000 |
0x08000004 | 08000009 |
0x08000008 | f8dfd004 |
0x0800000c | f000f80c |
0x08000010 | 20010000 |
0x08000014 | bf00b501 |
0x08000018 | 1e419800 |
...... | ...... |
3.3 启动流程
上电后:
-
设置栈:CPU会从0x08000000读取值,用来设置SP(我们的程序里再次设置了SP)
-
跳转:CPU从0x08000004得到地址值,根据它的BIT0切换为ARM状态或Thumb状态,然后跳转
-
对于cortex M3/M4,它只支持Thumb状态,所以0x08000004上的值bit0必定是1
-
0x08000004上的值 = Reset_Handler + 1
-
-
从Reset_Handler继续执行