C 程序的机器级表示

C 程序的机器级表示

C 反汇编分析

最小的 C 代码

用 Keil 写一个有 C 代码的、最小的,能下载到 MCU 里的程序。首先启动文件是必要的,但是可以精简一下

;代码1
                PRESERVE8
                THUMB

; Vector Table Mapped to Address 0 at Reset
                AREA    RESET, DATA, READONLY
				EXPORT  __Vectors
					
__Vectors       DCD     0                  
                DCD     Reset_Handler              ; Reset Handler




				AREA    |.text|, CODE, READONLY

; Reset handler
Reset_Handler   PROC
				EXPORT  Reset_Handler             [WEAK]
                IMPORT  minimal

				LDR SP, =(0x20000000+0x10000)
				BL minimal

                ENDP 
                
                END

然后有一个 c 源文件

一些和 arm 内核相关的点:

  • 启动后执行的第一个指令的位置 Reset_Handler

  • C 语言跑起来的环境:初始化好栈

局部变量的存放位置

一个例子,计算两数相加,使用函数调用来实现 a = a + b,

查看反汇编代码,关注这几个问题

  • main 中变量定义的位置

  • 函数参数传递使用的寄存器

  • 函数调用时自动出入栈的寄存器

C 代码最重要被编译成机器码去运行,分析 C 的机器级表示,会对程序的运行有更深的理解。

C 语句并不是最小单位。

上下文和切换

程序在执行时,想要切换出去,换回来以后要还能执行,需要保存一些东西。

状态机思想,C 的模型,堆栈;汇编,寄存器。需要保存的是所有的寄存器,

线程及保存

运行中的函数就是线程,保存正在运行的线程的方式就是把暂停瞬间所有寄存器的值都保存到栈里。

创建一个新的线程的方式就是创建一个暂停的线程,启动起来就是运行的线程了。

一个运行的线程需要有的东西:

  • 函数入口

  • 线程控制块

最后更新于