指令——计算机的语言(part 2)

目录

1.1 翻译并执行程序

1.1.1 编译器

1.1.2 汇编器

1.1.3 链接器

1.1.4 加载器

1.1.5 动态链接库


接上一篇文章: 指令——计算机的语言(part 1)

1.1 翻译并执行程序

程序翻译层次图如下: 

        首先高级语言比如说C,会被编译器编译成汇编语言,然后汇编器把汇编语言编译成目标文件,机器语言。然后链接器会将程序需要库文件和之前汇编器编译出来的把目标文件链接在一起生成可执行文件。然后加载器将可执行文件加载到内存合适的位置,然后处理器就可以执行该程序了。

1.1.1 编译器

        将高级语言翻译成机器能懂的汇编语言,高级语言编写的程序比汇编语言简洁的多,所以程序员效率更高。

1.1.2 汇编器

        因为汇编语言对于高级语言也是一种接口,所以汇编语言能处理一些机器语言指令的一些变种,就像这些变种是他自己的语言一样。硬件不需要实现这些指令,然而他们在汇编语言总的存在简化了程序转变和编程,这些指令被称为伪指令

        汇编语器的主要任务是将汇编语言转换成目标文件(object file),因此汇编器必须处理所有标号对应的地址。汇编器将分支和数据传输指令中用到的标号都放入一个符号表中。这个表由标号地址成对构成。

UNIX系统中目标文件通常包括以下6个不同的部分:

  • 目标文件头:描述目标文件其他部分的大小和位置
  • 正文段:包含机器语言代码
  • 静态数据段:包含在程序生命周期内分配的数据
  • 重要定位信息:包含了程序加载进内存时依赖的绝对地址的指令和数据
  • 符号表:包含未定义的符号标记,如外部引用
  • 调试信息:包含一份说明目标模块如何编译的简明描述,这样调试器能将机器指令关联到C源文件,并使数据结构也变的可读。

1.1.3 链接器

        到目前为止,任何一行程序的修改都需要重新编译和汇编整个程序。然而全部重新编译是对计算机资源的严重浪费,尤其是对于一个标准库文件,没有任何改变的情况下,每次修改代码都要重新编译。另一种方式是只编译和汇编每个函数,这样使得代码的改变只用编译和汇编有改动的函数,其他的不需要重新编译,这样就节省了一大部分计算机资源。这个方法需要一个新的系统工具:链接器。它可以把所有独立编译的机器语言程序拼接在一起。

链接器的工作分为三个步骤:

  1. 将代码和数据模块象征性的放入内存中
  2. 决定数据和指令标签的地址
  3. 修补内部和外部引用

        链接器使用每个目标模块中的重要定位信息和符号表来解析所有未定义标签。如果外部引用都解析完了,链接器会决定每个模块将要占用的内存的位置。因为所有模块都是独立编译的,所有编译器不清楚这些模块在内存中的位置,那么当程序被放到内存中的时候就需要链接器来决定各个模块的绝对地址,即于寄存器无关的所有地址都必须重新定位用来反映真实的地址。

1.1.4 加载器

可执行文件存在磁盘中之后,操作系统可以将其读到内存中并启动执行它。在UNIX系统中,加载器工作步骤如下:

  1. 读取可执行文件的文件头来确定正文段和数据段的大小
  2. 为正文和数据段创建一个足够大的内存空间
  3. 将可执行文件的指令和数据复制到内存中
  4. 把主程序的参数(如果有)复制到栈顶
  5. 初始化寄存器,将栈指针指向第一个空位置
  6. 跳转到启动例程,它会将参数复制到参数寄存器并调用程序的main函数,当main函数返回时,启动例程会调用exit终止程序。

        大概总结一下,就是确定可执行文件的内容,大小,然后分配内存空间,接着复制机器代码和参数进入内存,最后初始化寄存器并执行程序。

1.1.5 动态链接库

原本调用按上面的方法调用静态库是最快捷的调用方式,但是会有以下缺点:

  1. 库会成为可执行代码的一部分,这样在更新或发布一些新版本的时候,导致静态链接库依然是旧版本。
  2. 在程序运行时,虽然并不是所有库文件的内容都会被用到,但是整个库需要被加载到内存中,实际上程序只是使用了其中的一小部分,这样会造成资源的浪费。

        基于以上的缺点,就出现了动态链接库的概念,只有在程序运行的时候这些库才会被链接加载,这样就减少了程序的大小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/875198.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python面试宝典第48题:找丑数

题目 我们把只包含质因子2、3和5的数称作丑数(Ugly Number)。比如:6、8都是丑数,但14不是,因为它包含质因子7。习惯上,我们把1当做是第一个丑数。求按从小到大的顺序的第n个丑数。 示例 1: 输入…

另类动态规划

前言&#xff1a;一开始我根本想不到这个题目是一个动态规划的题目&#xff0c;而且我一开始的初始状态还写错了 我还忘记了写算法题的基本步骤&#xff0c;先看数据范围&#xff0c;再考虑能不能用动态规划写 题目地址 #include <bits/stdc.h> using namespace std; #de…

3C电子胶黏剂在手机制造方面有哪些关键的应用

3C电子胶黏剂在手机制造方面有哪些关键的应用 3C电子胶黏剂在手机制造中扮演着至关重要的角色&#xff0c;其应用广泛且细致&#xff0c;覆盖了手机内部组件的多个层面&#xff0c;确保了设备的可靠性和性能。以下是电子胶在手机制造中的关键应用&#xff1a; 手机主板用胶&…

浏览器百科:网页存储篇-IndexedDB介绍(十)

1.引言 在现代网页开发中&#xff0c;数据存储需求日益增多和复杂&#xff0c;传统的客户端存储技术如localStorage和sessionStorage已难以满足大型数据的存储和管理需求。为了解决这一问题&#xff0c;HTML5 引入了 IndexedDB&#xff0c;在本篇《浏览器百科&#xff1a;网页…

网络学习-eNSP配置路由器

#PC1网关&#xff1a;192.168.1.254 #PC3网关&#xff1a;192.168.3.254 #PC4网关&#xff1a;192.168.4.254# 注&#xff1a;路由器接口必须配置不同网段IP地址 <Huawei>system-view Enter system view, return user view with CtrlZ. #给路由器两个接口配置IP地址 [Hua…

IBM中国研发中心撤出:挑战与机遇并存

IBM中国研发中心撤出&#xff1a;挑战与机遇并存 引言 近日&#xff0c;IBM宣布撤出在中国的两大研发中心的消息&#xff0c;引起了广泛关注。这一举动不仅对IBM自身的全球布局产生了影响&#xff0c;也在一定程度上反映了跨国公司在中国市场策略的调整。本文将探讨这一事件背…

keras和tensorflow可用的一组版本

目录 keras版本&#xff1a;3.5.0tensorflow&#xff1a;2.17.0之前的错误导包现在的正确导包 keras版本&#xff1a;3.5.0 tensorflow&#xff1a;2.17.0 之前的错误导包 其实也不是说错误&#xff0c;就是因为文件位置不对&#xff0c;所以VSCode总是有黄色波浪线&#xff0…

只出现一次的数II

只出现一次的数&#xff1a;力扣&#xff08;LeetCode&#xff09;-----只出现一次的数 题目描述 给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 示例 1&#xff1a; 输入&am…

C# WinForm:禁用Panel容器滚动条自动移动位置的功能

1.在WinForm项目中新建一个类&#xff1a; 2.类里面的内容&#xff0c;重写Panel的这个方法 3.编译后这个控件就出现在工具箱了 4.然后用这个新Panel控件就好了 5.完事大吉。

Datasheet SHT20芯片的数据手册

Datasheet SHT20芯片的数据手册 I2C读取湿度传感器返回的16位数据。SCL SDA 14位有效&#xff0c;我以为是将后二位删除&#xff0c;实际上看完手册才知道是后二位值无用&#xff0c;不是删除&#xff0c;而是清0&#xff0c;实际上还是16为&#xff0c;知识后二位是0还是1&…

深度学习——基础知识

深度学习的重点在于优化&#xff0c;其中很重要的步骤在于如何调参&#xff0c;会涉及到一些微积分等数学知识。不同于以往接触到的数值运算&#xff0c;深度&#xff08;机器&#xff09;学习都是关于张量Tensor&#xff08;向量&#xff09;的计算&#xff0c;Python中最常用…

leetcode21. 合并两个有序链表

思路&#xff1a; 用一个新链表来表示合并后的有序链表&#xff0c; 每次比较两个链表&#xff0c;将较小的那个结点存储至新链表中 # Definition for singly-linked list. # class ListNode(object): # def __init__(self, val0, nextNone): # self.val val # …

机器学习(西瓜书)第 9 章 聚类

9.1 聚类任务和距离计算 在”无监督学习“中&#xff0c;训练样本的标记信息是未知的&#xff0c;目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律&#xff0c;为进一步的数据分析提供基础.此类学习任务中研究最多、应用最广的是“聚类”(clustering). 聚类试图…

动手学深度学习(pytorch)学习记录30-含并行连接的网络(GoogLeNet)[学习记录]

目录 GoogLeNetInception块GoogLeNet模型训练模型 GoogLeNet GoogLeNet&#xff0c;也称为Inception v1&#xff0c;是由Google团队在2014年提出的深度学习模型&#xff0c;它在当年的ImageNet竞赛中取得了显著的成绩。GoogLeNet的设计引入了多个创新点&#xff0c;包括Incept…

【C++】string类的基本使用

一、string类的由来 在C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列 的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且底层空间需要用户 自己管…

大数据之Flink(三)

9.3、转换算子 9.3.1、基本转换算子 9.3.1.1、映射map 一一映射 package transform;import bean.WaterSensor; import org.apache.flink.streaming.api.datastream.DataStreamSource; import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator; impor…

分类预测|基于改进的灰狼IGWO优化支持向量机SVM的数据分类预测matlab程序 改进策略:Cat混沌与高斯变异

分类预测|基于改进的灰狼IGWO优化支持向量机SVM的数据分类预测matlab程序 改进策略&#xff1a;Cat混沌与高斯变异 文章目录 一、基本原理原理流程1. **定义目标函数**2. **初始化GWO**3. **评估适应度**4. **更新狼的位置**5. **更新狼的等级**6. **重复迭代**7. **选择最佳解…

春招审核新策略:Spring Boot系统实现

3系统分析 3.1可行性分析 通过对本大学生入学审核系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本大学生入学审核系统采用Spring Boot框架&#xff0c;JA…

综合案例-数据可视化-柱状图

一、基础柱状图 我们绘制一个关于三种水果销售额的柱状图&#xff0c;X轴数据为三种水果的名称&#xff0c;用列表[苹果,香蕉,橘子]添加进去&#xff0c;Y轴数据为三种水果的销售额&#xff0c;用列表[50,70,60]添加进去。 步骤&#xff1a; 导包构建柱状图对象添加X轴数据生…

Android 12系统源码_窗口管理(八)WindowConfiguration的作用

前言 在Android系统中WindowConfiguration这个类用于管理与窗口相关的设置&#xff0c;该类存储了当前窗口的显示区域、屏幕的旋转方向、窗口模式等参数&#xff0c;应用程序通过该类提供的信息可以更好的适配不同的屏幕布局和窗口环境&#xff0c;以提高用户体验。 一、类定…