
C语言低层
文章平均质量分 79
专注于C语言低层,计算机基础,计算机低层原理
Freestyle Coding
这个作者很懒,什么都没留下…
展开
-
主函数main和程序入口_start
主函数main和程序入口_start众所周知,C程序的入口并不是main函数,而是_start函数,只不过gcc链接器默认会依赖一些库,然后_start会调用main。那么_start做了什么呢?调用关系是怎样的?一、概括下图是Linux中一个可执行程序执行时,各个模块的调用情况:这张图几乎包含了,一个程序,从加载到执行的所有过程,注意,main函数的位置。只有main函数部分是可以自己写的,其余部分都是加载器干的。二、具体分析想具体分析,可以写一个C程序然后反汇编,查看汇编代码。但是,原创 2021-06-11 21:58:27 · 4186 阅读 · 1 评论 -
为什么写C程序在结束时不需要系统调用exit?
为什么写C程序在结束时不需要系统调用exit?一、系统调用exit众所周知,一个程序的执行和结束,都是需要发起系统调用。调用execve系统调用,让操作系统加载该程序,调用exit系统调用,表示程序要退出,让操作系统清理空间。写过汇编语言的都知道,一般都会使用下面的语句来(以Intel汇编为例)发起系统调用exit:mov eax,1int 0x80这是发起系统调用exit,用于程序退出。但是,在C语言中,却没有这样系统调用退出的代码。?你说这个东西太偏了,没用?接着看下面的代码。二原创 2021-06-11 21:56:58 · 469 阅读 · 1 评论 -
C语言调用函数时参数是使用栈还是寄存器
文章目录一、结论二、验证1. 32位程序2. 64位程序2.1 参数小于等于6个2.2 参数大于6个一、结论网上的文章有的说C语言调用函数参数使用栈传递,有的说使用寄存器传递。那么到底参数是使用栈还是寄存器呢?先说结论:32位程序使用栈传递64位程序根据参数的个数而不同参数1~6个,使用寄存器传递参数大于6个,多出来的参数使用栈传递二、验证1. 32位程序源代码:// main.cvoid fun(int a, int b){ a += 1; b +=原创 2021-05-29 17:12:38 · 3377 阅读 · 0 评论 -
C语言和汇编语言相互调用
C语言和汇编语言相互调用不同的语言就像一座孤岛,似乎毫不相干,但是所有的代码最终都要编译成机器指令,他们本质上也是一样的,最终都是变成指令给CPU下达命令。1. C语言的链接过程我们知道一个C语言源文件变成可执行文件,需要经过一下几个步骤:预处理。(hello.c -> hello.i)把头文件包含起来。编译。(hello.i -> hello.s)编译成汇编代码。汇编。(hello.s -> hello.o)生成目标文件。链接。(hello.o ->原创 2021-03-29 11:11:17 · 11570 阅读 · 7 评论