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

相关推荐
浩浩测试一下17 小时前
堆栈中的 参数与局部变量 (逆向分析)
汇编·逆向·免杀·堆栈·windows编程·pe壳
iCxhust1 天前
微机原理实践教程(C语言篇)---A001闪烁灯
c语言·开发语言·汇编·单片机·嵌入式硬件·51单片机·微机原理
浩浩测试一下2 天前
抬栈 恢复上下文 (逆向分析)
汇编·逆向·堆栈·windows核心编程
zhouwy1132 天前
ARM汇编指令集详解
汇编·arm开发
iCxhust2 天前
微机原理实践教程(汇编篇)---A002流水灯
汇编·单片机·嵌入式硬件·51单片机·微机原理
浩浩测试一下2 天前
栈帧 抬栈与平栈 (逆向分析)
汇编·windows api·堆栈·windows编程·windows 开发
陈eaten2 天前
win11下nasm编写汇编及链接方案
汇编·链接·nasm·gcc·golink
iCxhust2 天前
【无标题】8086/8088裸机对于学习微机原理的重要意义
汇编·单片机·嵌入式硬件·嵌入式·微机原理
鸽芷咕5 天前
DOSBox 汇编环境搭建完整教程:安装配置 + MASM/LINK/DEBUG 工具链配置详解
汇编
Gofarlic_OMS5 天前
UG/NX许可证管理高频技术问题解答汇编
java·大数据·运维·服务器·汇编·人工智能