编程知识\_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继续执行

相关推荐
myloveasuka3 小时前
寻址方式笔记
汇编·笔记·计算机组成原理
请输入蚊子5 小时前
《操作系统真象还原》 第六章 完善内核
linux·汇编·操作系统·bochs·操作系统真像还原
myloveasuka6 小时前
指令格式举例
汇编·笔记·计算机组成原理
我在人间贩卖青春1 天前
汇编之分支跳转指令
汇编·arm·分支跳转
我在人间贩卖青春1 天前
汇编之加载存储指令
汇编·arm·寄存器加载存储
我在人间贩卖青春1 天前
汇编之状态寄存器访问指令
汇编·arm·状态寄存器
我在人间贩卖青春1 天前
汇编之软中断指令和协处理指令
汇编·arm·软中断·协处理
我在人间贩卖青春1 天前
汇编之数据处理指令
汇编·arm·数据处理指令
白太岁2 天前
操作系统开发:(11) RTOS 与 GPOS 的分界线:MMU
c语言·开发语言·汇编·arm开发·系统架构
枷锁—sha3 天前
【pwn系列】Pwndbg 汇编调试实操教程
网络·汇编·笔记·安全·网络安全