当前位置: 首页 > news >正文

《计算机原理》——HelloWorld.cpp如何运行的

学校《计算机原理》开课啦!特此开辟专栏,将一些知识作为笔记,记录下来。


前言

本篇博客知识点来源于educoder的相关题目


1. 相关知识

1.1 计算机语言

计算机语言是人与计算机之间通讯的语言,计算机语言包括编写计算机程序的字符和语法规则,这些字符和语法规则组成计算机执行的各种指令(或各种语句)。

Python、C/C++ 等编程语言,这些语言和人类语言具有一定的相似性,这些编程语言不要求编程者具备很多计算机专业知识,只需要利用简单的赋值、条件控制、循环等语句就可以完成复杂算法、程序的设计实现,因而这些语言也被称为高级语言

由于电子元件的二值特性,在计算机内部,计算机使用的是由 0 和 1 组成的二进制数,二进制是计算机的语言的基础,计算机执行的是一串串 0 和 1 组成的指令序列,这种计算机能够认识的语言,就是机器语言

1.2 程序的处理流程

程序如何从我们看到的高级语言转为计算机可处理的机器语言?

上图展示了从高级语言源程序到计算机中的二进制机器码的处理过程,该过程包括下列步骤:

  • 预处理: 编译器处理预处理命令,包括头文件包含、宏定义的扩展、条件编译的选择等;
  • 编译:将预处理后的源代码文件 翻译转换 得到机器语言的目标程序,得到机器语言汇编文件;
  • 汇编:将汇编代码翻译成机器码,此时的机器码尚不能直接运行;
  • 链接:处理可重定位文件,把各种符号引用和符号定义转换成为可执行文件中的合适信息,通常是虚拟地址。

完成上述步骤后,计算机将高级语言编写的文本形式的程序转换成计算机可执行的二进制形式的机器码。

1.3 GCC

GCC(GNU Compiler Collection,GNU 编译器套件)是由 GNU 开发的编程语言编译器。GNU 编译器套件包括C、C++、 Objective-C、 Fortran、Java、Ada 和 Go 语言前端,也包括了这些语言的库(如libstdc++,libgcj等。)

GCC 的基础用法为:

  1. gcc [options] [filenames]

使用 GCC 编译器需要提供一系列必要的调用参数(上述基础用法中的 options 表示 GCC 所需要的参数)和文件名称(上述基础用法中的 filenames 表示 GCC 处理的文件),GCC 编译器有超过 100 个调用参数,本关卡仅介绍和关卡相关的调用参数,其余详细参数可查看 GCC 手册 (在 Linux 系统中可以通过 man gcc 查看 GCC 的使用手册)。

-o output

-o (小写 o)参数由两部分组成,其中的 "-o" 表示该参数设置输出文件,紧跟在 "-o" 之后的参数给出输出文件的路径。

-E

-E 参数不带有其他设置选项,该参数表示对输入文件进行预处理,对源代码文件中的文件包含 (include)、 预编译语句 (如宏定义define等)进行展开,把头文件的代码、宏之类的内容转换成更纯粹的 C 代码。

-S

-S 参数不带有其他设置选项,该参数表示对输入文件进行编译,生成对应的汇编语言代码(助忆符形式的代码),把代码从 C 语言转换成汇编语言。在这个过程,GCC 会检查各个源文件的语法。

-c

-c 参数不带有其他设置选项,该参数表示对输入文件进行汇编,生成对应的目标文件,把汇编语言的代码转换成机器码。

通常情况下,GCC 工具整合了预处理、编译、汇编、链接等步骤,例如,不带额外参数,直接运行 GCC 对输入 C 语言源文件处理后即可得到该文件对应的可执行机器代码(即二进制程序),如下图所示:

为了便于同学们认识详细的处理过程,本关卡通过设置编译选项,逐步显示 GCC 的处理过程:

  • 步骤一:预处理

    通过命令 gcc -E hello.c -o hello.i 对 hello.c 文件预处理,输出文件设置为 hello.i 

  • 步骤二:编译

    通过命令 gcc -S hello.i -o hello.s 编译 hello.i 文件,输出文件设置为 hello.s ,如下图所示:

  • 步骤三:汇编

    通过命令 gcc -c hello.s -o hello.o 汇编 hello.s 文件,输出文件设置为 hello.o 

  • 步骤四:链接

    上一步汇编得到的 hello.o 目标文件仍然无法直接执行,需要完成链接操作,处理可重定位文件,把各种符号引用和符号定义转换成为可执行文件中正确的信息,才能生成最终的可执行文件。

    通过命令 gcc hello.o -o hello 链接 hello.o 文件,输出文件设置为 hello ,如下图所示:

相关文章:

《计算机原理》——HelloWorld.cpp如何运行的

学校《计算机原理》开课啦!特此开辟专栏,将一些知识作为笔记,记录下来。 前言 本篇博客知识点来源于educoder的相关题目 1. 相关知识 1.1 计算机语言 计算机语言是人与计算机之间通讯的语言,计算机语言包括编写计算机程序的字符…...

【面试题】在JS循环中使用await会怎么样?

前言这个问题是这样产生的?某天,在学习异步的知识遇到这样一道题:使用Promise的方式,每隔一秒输出数组中一个值const arr [1, 2, 3] ​ arr.reduce((pre, cur) > {return pre.then(() > {returnnewPromise((resolve, rejec…...

Qt QMessageBox详解

文章目录一.QMessageBox介绍枚举属性函数二.QMessageBox的用法1.导入QMessage库2.弹窗提示3.提供选项的弹窗提示4.作为提示,报警,报错提示窗口一.QMessageBox介绍 文本消息显示框(message box)向用户发出情况警报信息并进一步解释警报或向用户提问&…...

Flutter之beamer路由入门指南

beamer路由入门指南 前言使用方法1、路由配置方式1路由配置方式2路由跳转测试现象前言 Beamer是一个很好用的路由组件,本文以beamer1.5.0版本进行说明,前面博主也介绍了其他路由组件 Flutter实战之go_router路由组件入门指南 、 Flutter之Fluro路由组件入门指南 Flutter之Ge…...

「基础篇」机器学习概览

文章目录1. 什么是机器学习2. 引入机器学习3. 应用场景4. 机器学习分类4.1. 有无人类监督4.2. 是否增量学习4.3. 泛化方式5. 主要挑战6. 测试与验证1. 什么是机器学习 机器学习(Machine Learning,ML)是一个研究领域,让计算机无需…...

揭秘可视化图探索工具 NebulaGraph Explore 是如何实现图计算的

前言 在可视化图探索工具 NebulaGraph Explorer 3.1.0 版本中加入了图计算工作流功能,针对 NebulaGraph 提供了图计算的能力,同时可以利用工作流的 nGQL 运行能力支持简单的数据读取,过滤及写入等数据处理功能。 本文将简单分享下 NebulaGr…...

移动架构43_什么是Jetpack

Android移动架构汇总​​​​​​​ 文章目录一 Android 开发框架演变1 MVC2 MVP3 MVVM二 什么是JetPack三 如何构建支持Jetpack项目一 Android 开发框架演变 1 MVC Model-View-Controller,模型-视图-控制器,Model负责数据管理,View负责UI显…...

TiDB的分布式事务原理探究

事务开启 获取全局授时作为startTS构建一个tikvTxn对象(包括snapshot)。 事务写 txn.Set方法本质上将kv值写入了一个内存缓存(即kv/memdb_buffer.go中的memDbBuffer)中。该内存kv数据库利用的是golevel提供的功能。 事务回滚 直接将tikvTxn的valid字段…...

【C语言】函数指针和指针函数

文章目录[TOC](文章目录)前言概述函数指针定义:使用:回调函数指针函数前言 今天学一下函数指针 提示:以下是本篇文章正文内容,下面案例可供参考 概述 函数指针:是一个指向函数的指针,在内存空间中存放的…...

Nodejs中npx简介和作用

一、npx简介npm从5.25.2版开始,增加了 npx 命令。方便了我在项目中使用全局包。二、安装Node安装后自带npm模块,可以直接使用npx命令。如果不能使用用,就要手动安装一下。npm install -g npx三、使用npx想要解决的主要问题,就是调…...

Matplotlib精品学习笔记001——绘制3D图形详解+实例讲解

3D图片更生动,或许在时间序列数据的展示上更胜一筹 想法: 学习3D绘图的想法来自科研绘图中。我从事的专业是古植物学,也就是和植物化石打交道。化石有三大信息:1.物种信息,也就是它的分类学价值;2.时间信息…...

学习ifconfig实战技巧,成为网络管理高手

文章目录前言一. ifconfig 命令介绍二. 语法格式及常用选项三. 参考案例3.1 显示网络设备信息3.2 启动和关闭指定的网卡3.3 对指定的网卡设备执行修改IP地址操作3.4 启动和关闭ARP协议3.5 使用ifconfig添加网卡总结前言 大家好,又见面了,我是沐风晓月&a…...

day38|70. 爬楼梯(进阶)、322. 零钱兑换、279.完全平方数

70. 爬楼梯(进阶) 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释:有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2…...

SpringBoot全局异常处理

一、目的 当客户端/前端向服务端发送一个请求后,这个请求并不是每次都能完全正确的处理,比如出现一些资源不存在、参数错误或者内部错误等信息的时候,就需要将异常反馈给客户端或者前端。那么这就需要程序有完整的异常处理机制。 在 Java 中所…...

SpringBoot异常处理

目录 一、 错误处理 1. 默认规则 2. 定制错误处理逻辑 二、自定义异常处理 1. 实现 ErrorController 2. RestControllerAdvice/ControllerAdvice ExceptionHandler 实现自定义异常 3. 新建 UserController.class 测试 3 种不同异常的处理 4. 最终效果如下 补充 1. 参…...

《C++ Primer Plus》(第6版)第8章编程练习

《C Primer Plus》(第6版)第8章编程练习《C Primer Plus》(第6版)第8章编程练习1. 打印字符串2. CandyBar3. 将string对象的内容转换为大写4. 设置并打印字符串5. max5()6. maxn()7. SumArray()《C Primer Plus》(第6版…...

RAD Studio 11.3 Alexandria Crack

RAD Studio 11.3 Alexandria Crack 瞄准最新平台版本-此版本增加了对Android 13和Apple macOS Ventura的官方支持。它还支持Ubuntu 22 LTS和Microsoft Windows Server 2022。 使用生物特征认证-New为FireMonkey移动应用程序提供了新的移动生物特征认证组件。 部署嵌入式InterBa…...

Stm32 iic 协议使用

/* 第1个参数为I2C操作句柄 第2个参数为从机设备地址 第3个参数为从机寄存器地址 第4个参数为从机寄存器地址长度 第5个参数为发送的数据的起始地址 第6个参数为传输数据的大小 第7个参数为操作超时时间 */ HAL_I2C_Mem_Write(&hi2c2,salve_add,0,0,PA_BUFF,sizeof(PA_BUFF…...

Malware Dev 02 - Windows SDDL 后门利用之 SCManager

写在最前 如果你是信息安全爱好者,如果你想考一些证书来提升自己的能力,那么欢迎大家来我的 Discord 频道 Northern Bay。邀请链接在这里: https://discord.gg/9XvvuFq9Wb我拥有 OSCP,OSEP,OSWE,OSED&…...

每日一题29——山峰数组的顶部

符合下列属性的数组 arr 称为 山峰数组&#xff08;山脉数组&#xff09; &#xff1a; arr.length > 3 存在 i&#xff08;0 < i < arr.length - 1&#xff09;使得&#xff1a; arr[0] < arr[1] < ... arr[i-1] < arr[i] arr[i] > arr[i1] > ... &g…...

从原理到实战:位运算巧解最小码距(附完整代码)

1. 什么是码距&#xff1f;从生活场景理解概念 第一次听到"码距"这个词时&#xff0c;我脑海里浮现的是超市货架上相似商品间的距离。后来才发现&#xff0c;在计算机世界里&#xff0c;它描述的是两个编码之间的差异程度。举个生活中的例子&#xff1a;假设我们用5…...

5步释放Win11潜能:用Win11Debloat让系统性能提升60%的实战指南

5步释放Win11潜能&#xff1a;用Win11Debloat让系统性能提升60%的实战指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutte…...

收藏!阿里后端转大模型应用层,2年Agent/RAG经验,斩获字节30%涨幅offer|小白程序员必看学习路径

作为一名从传统后端开发起步的程序员&#xff0c;我毕业后顺利入职阿里&#xff0c;做了一年后端开发工作后&#xff0c;敏锐捕捉到大模型应用层的爆发趋势&#xff0c;果断转型深耕。经过两年的Agent、RAG相关开发实践&#xff0c;最终成功拿到字节跳动Agent开发岗位offer&…...

C++数组和指针的声明与使用指南

数组声明语法 在 C 中声明数组的语法为&#xff1a; 数据类型 数组名[数组大小]; 示例&#xff1a; int myArray[10]; // 声明一个包含 10 个整数的数组 数组初始化 声明时可直接初始化&#xff1a; int myArray[5] {10, 20, 30, 40, 50}; 部分初始化时&#xff0c;未指定值的…...

动态透视报表 + 查询接口 + Excel导出

动态透视报表 查询接口 Excel导出 ✅ 动态行维度&#xff08;产品 / 型号 / 项目 任意组合&#xff09;✅ 动态列维度&#xff08;月份&#xff09;✅ a / f 子表头✅ SQL 透视&#xff08;适合 GaussDB&#xff09;✅ 查询接口 EasyExcel 导出接口✅ 可复用报表引擎 整体…...

pybind11进阶指南:如何高效封装C++类供Python调用(附常见问题解决方案)

pybind11进阶指南&#xff1a;如何高效封装C类供Python调用&#xff08;附常见问题解决方案&#xff09; 在当今高性能计算和科学计算领域&#xff0c;C与Python的结合已成为开发者工具箱中不可或缺的组合。C提供底层性能优势&#xff0c;而Python则以其简洁语法和丰富生态著称…...

NCCL中RoCE与RDMA的深度解析:如何优化分布式训练网络性能

1. 为什么RoCE和RDMA对分布式训练如此重要&#xff1f; 第一次接触分布式训练时&#xff0c;我盯着日志里不断跳动的通信耗时直发愁。8块GPU明明都在满负荷运转&#xff0c;但总训练时间就是比单卡8要长不少。后来用NVIDIA的Nsight工具一分析&#xff0c;发现超过30%的时间都花…...

如何通过开源数据集创造商业价值:Awesome Public Datasets全攻略

如何通过开源数据集创造商业价值&#xff1a;Awesome Public Datasets全攻略 【免费下载链接】awesome-public-datasets A topic-centric list of HQ open datasets. 项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-public-datasets 在数据驱动决策的时代&a…...

MedGemma 1.5新手必看:从安装到问诊,完整使用流程详解

MedGemma 1.5新手必看&#xff1a;从安装到问诊&#xff0c;完整使用流程详解 你是否曾面对一份复杂的化验单&#xff0c;需要快速理解其临床意义&#xff1f;是否在深夜值班时&#xff0c;想快速确认某个药物的相互作用&#xff1f;或者&#xff0c;作为一名医学生&#xff0…...

eNSP安装避坑指南:WinPcap/Wireshark/VirtualBox依赖关系解析

eNSP安装避坑指南&#xff1a;WinPcap/Wireshark/VirtualBox依赖关系解析 当你第一次打开eNSP安装包时&#xff0c;可能会疑惑为什么需要同时安装WinPcap、Wireshark和VirtualBox这三个看似不相关的软件。这就像组装一台精密仪器——少了任何一个螺丝&#xff0c;整台机器都无法…...