C语言一定是从main函数开始执行的吗?


前言

这个问题如果是学生问,回答是肯定的(因为你们考试的打答案是:C语言总是从main函数开始执行) 但是当我初学汇编发现好像C语言执行的第一个函数是任意的

一、程序是怎么执行的?

环境:stm32103、KEIL5

二、使用步骤

1.引入库

首先从上电开始,CPU是先执行一段汇编(机器语言),设置程序要执行的堆栈大小,初始化中断向量表;
C语言执行过程中要用到栈,所以设置好栈以后就可以跳转到C语言程序了
设置C语言的入口函数为my_main

__Vectors_End

__Vectors_Size  EQU  __Vectors_End - __Vectors

                AREA    |.text|, CODE, READONLY               
; 
Reset handler
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  my_main
                IMPORT  SystemInit
                LDR     R0, =SystemInit
                BLX     R0               
                LDR     R0, =my_main
                BX      R0
                ENDP
   

2.C语言函数my_main实现

 int my_main(void)
 {	
	delay_init();	    //ÑÓʱº¯Êý³õʼ»¯	  
	LED_Init();		  	//³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú
	while(1)
	{
		LED0=0;
		LED1=1;
		delay_ms(300);	 //ÑÓʱ300ms
		LED0=1;
		LED1=0;
		delay_ms(300);	//ÑÓʱ300ms
	}
 }

3.编译链接通过

 assembling startup_stm32f10x_hd.s...
compiling misc.c...
compiling stm32f10x_gpio.c...
compiling stm32f10x_dbgmcu.c...
compiling stm32f10x_rcc.c...
compiling stm32f10x_usart.c...
linking...
Program Size: Code=1304 RO-data=304 RW-data=32 ZI-data=1736  
FromELF: creating hex file...
"..\OBJ\LED.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed:  00:00:06

4.看一下执行情况

在这里插入得出图片描述
可以看到单步调试时候程序执行到155行后跳转到main()函数内
在这里插入图片描述

总结

所以C语言是不是一定从main开始,至少单片机不是,所以其他编译环境应该也可以修改入口函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值