一段程序从编译到硬件再到执行的过程(代码片段)

ahamomo ahamomo     2023-05-02     357

关键词:

(以下内容还未整理好,谨慎观看哈哈哈)

前言知识:

主存储器:是整个存储系统的核心,它用来存放计算机运行期间所需要的程序和数据,CPU可直接随机地对它进行访问。

(主存地读写操作是在控制器地控制下进行的,只有接收到来自控制器地读写命令或写允许后,才能实现正确地读写操作)

CPU:是整个计算机地核心,是对指令流和数据流在时间上与空间上实施正确地控制。

(指令流:指的是CPU执行的指令序列;数据流:指的是根据指令操作要求依次存取数据地序列)

 

若用计算机来解决某个问题,首先要为这个问题编制解题程序,而程序又是指令的有序集合。

按照“存储程序”的概念,只要把程序装入主存储器后,即可由计算机自动的完成取指令和执行指令的任务。

(程序要执行,必须被CPU调用执行,而前提是程序装入到主存中)

那么,程序如何装入主存储器?

1.程序的装入与链接

   大致流程图如下:

   技术图片

  具体流程如下:

(1)编译(一般来说高级语言的编译要经过预处理、编译和汇编这几个过程)

  用户源程序(比如.c文件)经过编译生成目标模块(.obj 汇编语言或机器语言)

  预处理:

    预编译过程对源代码做了如下的操作:

    删除所有的注释信息

    删除所有的 #define 并展开所有宏定义

    插入所有 #include 文件注1的内容到源文件中的对应位置,include过程是递归执行的

    gcc可以使用如下命令对C语言进行预编译并且把预编译的结果输出到hello.i文件中

    gcc -E hello.c -o hello.i
  
编译

      编译就是对预处理之后的文件进行词法分析、语法分析、语义分析、中间代码生成并优化后生成相应的汇编文件。我们使用如下命令来编译预处理之后的文件

    gcc -S hello.i -o hello.s

      或者我们也可以把预处理和编译合为一步

    gcc -S hello.c -o hello.s

    具体讲解一下编译过程:(后续完成)
    词法分析:
    语法分析:
    语义分析:
    中间代码生成:
代码优化与目标代码生成:

  汇编:

    汇编的目的是把汇编代码转化为机器指令,因为几乎每一条汇编指令都对应着一条机器指令,所以汇编的过程相对而言非常的简单。我们可以使用如下命令实现汇编

     gcc -c hello.s -o hello.o

    或者我们也可以直接把源代码文件编译为目标文件

    gcc -c hello.c -o hello.o

    汇编操作所生成的文件叫做目标文件(Object File),目标文件的结构与可执行文件是一致的,它们之间只存在着一些细微的差异。目标文件是无法被执行的,它还需要经过链接这一步操作,目标文件被链接之后才可以产生可执行文件。

(2)链接

  将编译后形成的多个目标模块以及它们所需要的库函数链接在一起形成装入模块。(装入模块虽然具有统一的地址空间,但是它任是以“0”作为参考地址)

(3)装入

  将装入模块装入内存实际物理地址空间,并修改程序中与地址有关的代码。(这一过程叫做地址重定位)。

  程序装入内存,操作系统要为新装入内存的作业分配必要的资源,并为它创建进程(申请空白的PCB、初始化进程描述信息、为进程分配资源和存储空间、将进程插入到就绪队列中)

  装人内存这一块涉及到操作系统中的存储管理。(把程序装入内存的哪个区域?连续区域还是离散区域?)

  一般这里我们会涉及到页式存储管理、段式存储管理、段页式存储管理和虚拟存储管理。

程序装入之后,cpu怎么控制指令的执行呢?

2.CPU对主存的基本操作

  CPU对主存进行读写操作时候,首先CPU在地址总线上给出地址信号,然后发出相应的读或写命令,并在数据总线上交换信息。读写的基本操作如下:

  技术图片

       那么问题来了,CPU起初的地址信号哪里来的?

  (I/O软件将用户编制的程序通过总线(现在一般为单总线结构:CPU、主存和I/O设备都连结到同一组总线上,使得CPU在I/O设备与主存交换信息时仍可继续处理其他任务)输入信息到主机(由CPU和主存构成)中在程序开始执行前,将程序指令序列的起始地址,即程序的第一条指令所在的内存单元地址送入PC,CPU按照 PC的指示从内存读取第一条指令(取指))。

  程序在编译的目标代码生成过程中,通过代码生成算法将中间代码转换为特定机器的机器语言。如:

  技术图片

  所以,在内存中装载的都是程序的相应指令。

3.CPU调度进程执行程序

linux从头学10:三级跳过程详解-从bootloader到操作系统,再到应用程序(代码片段)

...der布局建立操作系统的三个段描述符操作系统跳转到应用程序应用程序调用操作系统中的函数不论是在x86平台上,还是在嵌入式平台上,系统的启动一般都经历了bootloader到操作 查看详情

源代码到可执行程序的过程详解:预编译编译汇编链接(代码片段)

1、gcc编译过程分解(1)首先是将.c源文件和.h头文件经过预编译(cpp是预编译器),得到.i文件,主要是进行的一些替换工作;(2)将.i文件经过编译器(gcc)处理,得到.s汇编文件,现在文件内容已经从C语言编程了汇编... 查看详情

c/c++-从代码到可执行程序的过程

(1)预编译主要处理源代码文件中的以“#”开头的预编译指令。处理规则见下:删除所有的#define,展开所有的宏定义。处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。处... 查看详情

简述java程序从编写到运行的基本步骤,并说明java的基本工作原理

1.简述Java程序从编写到运行的基本步骤,并说明Java的基本工作原理Java编译原理:Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系... 查看详情

c程序编译执行过程

...的代码。连接---->将目标代码与C函数库相连接,并将源程序所用的库代码与目标代码合并,并形成最终可执行的二进制机器代码(程序)。执行----->在特定的机器环境下运行C程序。 如果用一个图来表示: &nbs 查看详情

lua虚拟机概述(代码片段)

何为虚拟机用于模拟计算机运行的程序.是个中间层,它处于脚本语言和硬件之间的一个程序.每一门脚本语言都会有自己定义的opcode(”操作码”),可以理解为这门程序自己定义的”汇编语言”.一般的编译型语言,比如C等,经过编译... 查看详情

一个c++源文件从文本到可执行文件经历的过程(代码片段)

一个C++源文件从文本到可执行文件经历的过程以HelloWorld为例进行说明首先我们编写一个cpp源程序test.cpp#include<iostream>usingnamespacestd;intmain()cout<<"helloworld"<<endl;return0;使用g++编译命令时g++-otesttest.cppGcc编 查看详情

从忽视再到复现,我是如何一步步发现sqlitebug(代码片段)

【CSDN编者按】程序出现错误,你的第一反应是什么呢?“奇怪,明明代码没问题啊?”、“怎么会返回一个硬件错误呢?”本文作者跟大家的反应或许类似,但当从迷雾中拨清头绪,再到复现、解决&#x... 查看详情

从网瘾少年到网管,再到程序员,看他的逆袭路,哭了……(代码片段)

...看个人了。从网瘾少年到月薪3k的网管,再到月薪9k的程序员,他经历了什么?今天给大家分享一 查看详情

编程语言的分类及初识大蟒蛇

...语言已经多达600种。机器语言:直接使用二进制指令编写程序。汇编语言:使用英文标签代替二进制指令编写程序。高级语言:使用人能够理解的语言来编写程序。高级语言分为两中类型的语言。编译型:程序在执行之前需要一... 查看详情

计算机系统漫游(代码片段)

...也提取每一个小点来进行简要的记录。作者从一个hello.c程序讲述了:从存储,编译,执行的过程,讲解了文本存储形式,并讲解了此过程所需要的硬件支撑。从执行中数据的多次复制,讲到了读取的速度以及存储器层次架构。... 查看详情

汇编语言——汇编程序从写出到最终执行的过程

一个汇编语言程序从写出到最终执行的简要过程:编写--〉编译--〉连接--〉执行1、编写notepad++选择Assembly编写程序,保存成xx.asm,样式如下assumecs:abc;abc被我们当做代码段来使用,so要把它和cs联系起来abcsegment;定义一个段(abc)... 查看详情

从源代码到可执行程序:四个步骤与详解(代码片段)

"helloworld"可以说是所有程序员闭着眼睛都能写出来的代码:#include<stdio.h>intmain()printf("helloworld");return0;编译运行一气呵成。而每当有人问起:从源码到可执行程序有哪些步骤,大多数程序员面对这个问题也能脱口而出:预处... 查看详情

从源代码到可执行文件(代码片段)

请简述程序从源代码到可执行程序的过程,面试经常会被问到!这是一个屡见不鲜的问题,总而言之就如下四个过程:预处理比如有test.c源文件,内容如下:#include<stdio.h>/*主函数*/intmain(void) printf("h... 查看详情

jvm基础(代码片段)

...概念,然后在进一步深入学习。Java从编译到执行一个Java程序,首先经过javac编译成.class文件,然后JVM将其加载到方法区,执行引擎将会执行这些字节码。执行时,会翻译成操作系统相关的函数。JVM作为.class文件的翻译存在,输... 查看详情

从汇编到c(代码片段)

...gcc)在链接的时候会帮我们自动添加一个头,这个头就是一段引导我们的C程序能够执行的一段汇编实现的代码,这个代码中就帮我们的C程序设置了栈及其他的运行时需要。    1.1.3. CPU模式和各种模式下的栈     ... 查看详情

存储过程(代码片段)

...过程是数据库对象之一,存储过程可以理解成数据库的子程序,在客户端和服务器端可以直接调用它。触发器是与表直接关联的特殊的存储过程,是在对表记录进行操作时触发的。存储过程放在字典里,可以在不同用户和应用程... 查看详情

汇编语言设计程序篇-03(代码片段)

汇编语言设计程序篇-03用汇编语言写的源程序用汇编语言编写程序的工作过程程序中的三种伪指令源程序经编译连接后变为机器码汇编程序的结构如何写出一个程序来?程序中可能的错误由源程序到程序运行由写出源程序到... 查看详情