include命令是预处理命令的一种,预处理命令可以在指定位置插入其他源代码的内容; 可以确定仅在特定条件下编译的程序代码;可以定义类似标识符功能的宏在编译时由预处理器替换为其他文本。 如果要用printf函数,在使用之前必须#include <stdioh>
main函数又叫主函数,main函数是c语言程序的入口,程序是从main函数开始执行的 ,一个c语言程序中只能有一个main函数,c语言可执行程序也必须有一个main的函数
int inport(int prot) 从指定的输入端口读入一个字,并返回这个字(双字节)
int inportb(int port) 从指定的输入端口读入一个字节,并返回这个字节
void outport(int port,int word) 将字word(双字节)写入指定的输出端口port
void outportb(int port,char byte)将字节byte写入指定的输出端口port
编译技术什么是程序的入口语句?我们刚开始学习C语言的时候,总会以一个hello world程序开始了解,并会被告知main是程序的入口函数。
那么是否有怀疑过,既然main是函数的入口,那么全局函数是如何初始化的?
实际上main并不是一个程序的入口地址。
以linux为例,一个可执行程序是ELF格式(Executable and Linkable Format)。在ELF的文件头里记录了当程序入口地址,该入口地址是内核加载该文件后的第一条指令执行的地方。
可以写个hello world,生成可执行文件,然后通过readelf -h aout查看文件头:
ELF 头: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 类别: ELF64 数据: 2 补码,小端序 (little endian) 版本: 1 (current) OS/ABI: UNIX - System V ABI 版本: 0 类型: DYN (共享目标文件) 系统架构: Advanced Micro Devices X86-64 版本: 0x1 入口点地址: 0x1040 程序头起点: 64 (bytes into file) Start of section headers: 14688 (bytes into file) 标志: 0x0 本头的大小: 64 (字节) 程序头大小: 56 (字节) Number of program headers: 11 节头大小: 64 (字节) 节头数量: 29 字符串表索引节头: 28
这里入口地址是0x1040。
让我们反编译看看:
0000000000001040 <_start>: 1040: f3 0f 1e fa endbr64 1044: 31 ed xor %ebp,%ebp 1046: 49 89 d1 mov %rdx,%r9 1049: 5e pop %rsi 104a: 48 89 e2 mov %rsp,%rdx 104d: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp 1051: 50 push %rax 1052: 54 push %rsp 1053: 4c 8d 05 76 01 00 00 lea 0x176(%rip),%r8 # 11d0 <__libc_csu_fini> 105a: 48 8d 0d ff 00 00 00 lea 0xff(%rip),%rcx # 1160 <__libc_csu_init> 1061: 48 8d 3d d1 00 00 00 lea 0xd1(%rip),%rdi # 1139 <main> 1068: ff 15 72 2f 00 00 callq 0x2f72(%rip) # 3fe0 <__libc_start_main@GLIBC_225> 106e: f4 hlt 106f: 90 nop
0x1040对应的是_start函数,_start调用了glibc中的__libc_strat_main__libc_strat_main最终会调用main函数。(_start和__libc_start_main的分析见《程序员的自我修改——链接、装载与库》111)
既然知道main不是程序的真正入口,那么是否有办法在main之前或之后执行代码呢?
gcc提供了一组“进入”、“退出”函数可以首先这个功能:
main()
{
}
这就是入口点,表示程序由此开始它的旅程,大括弧内就是程序的本身了,从这里一条一条开始执行。
没定义就是没有main()函数
真正的入口地址对一个特定系统是固定的,即固定地址,而整个软件的入口需要对应到这个固定地址上。软件中哪个是入口得看makefile指定的link参数,一般而言汇编entry是入口,他先运行bootloader,它需要判断运行状态(下载、工厂模式、nand flash搬移、正常运行等等)。原理类似,特定系统可能存在特定的规定,得具体情况具体分析
一般来说,C语言都是从main函数开始运行的,这个main函数可以认为是C语言程序的执行起点。
更准确的说法,应该是C语言从入口函数开始执行。
因为,虽然大多数编译器都是以main为起始执行函数,也就是入口函数,但还是有例外的,比如:
1、对于支持UNICODE WIN32 应用程序,其程序入口为tmain;
2、对于windows 窗体程序,其程序入口为WinMain;
3、gcc中,传统有两个编译选项可以指定入口函数名,即:
gcc -e entryfunc
gcc --Entry=entryfunc
对于当前新版gcc, 仅支持-e。 比如编译时用命令:
gcc -e my_main ac -o aout
就会把my_main作为入口函数调用。
以上就是关于单片机#includemain.h什么意思全部的内容,包括:单片机#includemain.h什么意思、C语言入口方面、编译技术什么是程序的入口语句等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)