• 1707

许多初学者都有比较大的疑惑,电脑是怎么识别我们写的代码并进行处理的呢?其实这个问题对我们初学者来说是很重要的,只有了解机器的运行原理,我们才能真正地学号留下。那么今天我就以此为题为大家略讲一二,有错误的地方希望大家多多指教。

一般来说我们编译一个程序都是直接通过gedit  project.c编辑代码,然后通过gcc project.c编译代码,最后通过./a.out执行,但是今天我们将其分解为四个步骤:

分析编译的过程  ---->  获得机器码

1、预处理: gcc -E project.c -o project.i     //生成预处理文件 project.i 宏展开 包含展开
2、编译:   gcc -S project.i -o project.S     //生成汇编文件 project.S  //高级语言转成低级语言
3、汇编:   gcc -c project.S -o project.o     //生成机器语言 project.o  生成未地址定位的机器码 
4、链接:   gcc project.o  -o project         //生成可运行程序project   加载库文件

1、预处理: gcc -E project.c -o project.i     //生成预处理文件 project.i 宏展开 包含展开 -o后面要跟着生成的文件。

此过程将头文件里的定义如stdio.h里的例如extern int sys_nerr;等定义全部展开添加到mian函数里面,printf是一个库函数,定义在stdio.h里面,大家可以通过输入cd /usr/include/stdio.h查看。

==============编程要点================

1、语法   ----> 便于编译器识别  ---->  GCC 
 
#include <stdio.h>
#define MAX 100        //预处理后 int a=100;

运行参数个数   运行参数内容
int main(int argc,       char **argv)   //入口main
{
        int a=MAX;
printf("project!\n");           //格式化输出

return 0;                       //结果反馈,成功结束 0 ,异常 负数(错误码)
}

提示: Linux 是多用户,多任务系统
  
  头文件位置:  /usr/include/xxxx.h

查阅上一个程序的结束反馈状态值 :  echo  $?
  如main函数最后是return0;,那执行echo  $?后显示0;

2、编译:   gcc -S project.i -o project.S     //生成汇编文件 project.S  //调用对应的编译器将高级语言(C语言)转成低级语言

3、汇编:   gcc -c project.S -o project.o     //生成机器语言 project.o ,即生成未地址定位的机器码 (启动系统时用到汇编的知识,硬件开发需要学(.o是适合CPU识别的东西)

4、链接:   gcc project.o  -o project         //生成可运行程序project   加载库文件(*.S)将库和文件链接到一起(使用nm xxxx.o查看,发现没有给printf分配地址,
链接后将自定义代码程序段与调用的插件(库)进行组合,确定了运行地址,再次查看发现u printf后面多了一个@GLIBC_2.0,当函数调用printf时从库函数@GLIBC_2.0
这个库找,此过程为:确定运行地址--->链接%,即.o--->elf,这是动态链接方法,可以节省内存)

附:动态链接与静态链接优缺点

动态链接:地址绑定发生在程序运行时,需要运行环境中有动态文件存在。printf是公用的,运行时再使用这个库可以节省内存。GLIBC
优点:编译时调用的数据库不占用内存空间,程序体积小,便于存储。
缺点:需要运行中有动态文件的存在,经过加载才运行,运行速度较慢。

静态链接:地址绑定发生在程序编译时

编译命令:
gcc xxx.c -o xxx -static
优点:编译时将全部依赖文件进行装载,运行过程不再装载其他文件,速度快
缺点:体积大,可能导致数据冗余

注意:机器不能识别我们人类的高级语言,所以需要将写好的程序通过编译和汇编转化成机器能识别的二进制文件(汇编代码,低级语言)让机器识别。 (CPU识别的是010101这样的高低电平)

写完的程序会保存在rom里,当执行时再提取到ram。

好的,今天就写到这里了。可能写得比较乱,但是毕竟是新人,我会在以后的慢慢学习慢慢进步的,希望我写的内容能帮到更多的人,哈哈

转载于:https://www.cnblogs.com/lan1x/p/8340272.html

linux系统中-E,-S,-c的区别和作用(怎么讲代码转化为机器识别的语言)相关推荐

  1. linux系统下的shell是什么,Linux系统中shell各命令的区别有什么?

    今天小编要跟大家分享的文章是关于Linux系统中shell各命令的区别有什么?喜欢Linux系统并对此感兴趣的小伙伴们快来一起看一看吧~希望对你有所帮助. 1.xargs作用: (1)将前一个命令的标 ...

  2. 深入理解Linux系统中的用户和组账号

    为什么80%的码农都做不了架构师?>>>    一.Linux中的用户和组账号概述     与Windows操作系统相比,Linux系统中的用户和组账号的作用本质上是一样的,同样都是 ...

  3. Linux延时(延迟)函数比较:介绍Linux系统中常用的延时函数sleep、usleep、nanosleep、select和std::sleep_for()的区别和使用场景

    首先,需要了解各个睡眠函数的作用和使用场景. sleep函数用于让进程休眠指定的秒数,适用于需要较长时间的休眠场景: usleep函数用于让进程休眠指定的微秒数,适用于需要较短时间的休眠场景,不精确: ...

  4. linux mtd 块设备,Linux系统中/dev/mtd与/dev/mtdblock的区别,即MTD字符设备和块设备的区别...

    转:http://www.crifan.com/linux_system_in__dev__mtd_and__dev__mtdblock_distinction_character_devices_a ...

  5. Linux系统中动态库和静态库的区别

    Linux系统中"动态库"和"静态库"那点事儿 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源 ...

  6. Linux系统中的文件系统格式区别及详解

    Linux系统中常见文件系统格式 Windows常用的分区格式有三种,分别是FAT16.FAT32.NTFS格式 在Linux操作系统里有Ext2.Ext3.Linux swap和VFAT 种格式. ...

  7. LINUX系统中进程如何管理控制(一)

    上篇文章详细介绍了LINUX命令程序通过获取SHELL环境中的数据(此处的数据通常称为环境变量)来输出本机相应的配置数据,从而掌握在LINUX中SHELL环境的搭建技巧.那么,今天,这篇文章主要围绕l ...

  8. linux系统中的日志管理

    Linux系统中的日志管理 1 实验环境 2 journald日志服务 2.1 journalctl命令的用法 2.2 用journald服务永久存放日志 3 rsyslog日志服务 3.1 自定义日 ...

  9. 实例讲解Linux系统中硬链接与软链接的创建

    导读 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接.硬链接与软链接的区别从根本上要从Inode节点说 ...

最新文章

  1. 德国科学院院士:传统企业寻求变革,向智能制造靠近
  2. Shell 脚本编程 基本语法:
  3. Boost:在boost:array上使用constexpr进行测试
  4. 有关一百以内数字的Python算法
  5. 手机网页播放器php,html5手机移动端视频播放代码插件
  6. 接私活被公司开除。。
  7. 与圆相关的计算(信息学奥赛一本通-T1014)
  8. 记,NSProxy需要实现哪些方法?
  9. Eclipse Maven构建Spring MVC项目
  10. python 移动文件 覆盖_Python操作文件(删除、复制、移动...)
  11. matlab常用函数解释,MATLAB常用函数总结
  12. 按关键字自动分类文件
  13. 如何将docker部署的wekan迁移另一台服务器
  14. 怎么在图片上加水印?
  15. 一文详解宏基因组组装工具Megahit安装及应用
  16. php禁用函数设置及查看方法详解
  17. 关于swiper在移动端,快速上下滑动出现白边的解决办法
  18. 天津大学电子海图控件TjuES57Map
  19. python为什么叫大蟒蛇_Python(大蟒蛇)与云计算
  20. 云仓系统或者一件代发系统

热门文章

  1. 人才认证+奖金,智能分拣挑战赛baseline助力最后冲刺
  2. 视频超分,Transformer再下一城之VSR-Transformer
  3. 如何找出光纤微米级别的脏污?女朋友的一个举动给了我灵感
  4. 改变多目标跟踪领域!CMU等推出大规模多类别MOT数据集TAO
  5. 高效大规模图像搜索开源实现
  6. mysql查一个表3到5行的数据类型_MySQL入门(三) 数据库表的查询操作【重要】
  7. Java 进阶之路:异常处理的内在原理及优雅的处理方式
  8. mysql 插入毫秒数据_【转载】怎样在mybatis里向mysql中插入毫秒数的时间?
  9. 图机器学习有多大神力?一文带你回顾2020,展望2021
  10. 算法岗百里挑一热爆了,全球AI大厂薪酬大起底