编程知识\_C与汇编深入分析

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继续执行

相关推荐
我在人间贩卖青春13 天前
汇编之伪指令
汇编·伪指令
我在人间贩卖青春13 天前
汇编之伪操作
汇编·伪操作
济61713 天前
FreeRTOS基础--堆栈概念与汇编指令实战解析
汇编·嵌入式·freertos
myloveasuka13 天前
汇编TEST指令
汇编
我在人间贩卖青春13 天前
汇编编程驱动LED
汇编·点亮led
我在人间贩卖青春13 天前
汇编和C编程相互调用
汇编·混合编程
myloveasuka14 天前
寻址方式笔记
汇编·笔记·计算机组成原理
请输入蚊子14 天前
《操作系统真象还原》 第六章 完善内核
linux·汇编·操作系统·bochs·操作系统真像还原
myloveasuka14 天前
指令格式举例
汇编·笔记·计算机组成原理
我在人间贩卖青春15 天前
汇编之分支跳转指令
汇编·arm·分支跳转