计算机指令

从软件工程师的角度来看,CPU是执行计算机指令的逻辑机器。计算机指令可以看作是CPU能够理解的语言,也称为机器语言。

不同的CPU能理解的语言不同。例如,个人电脑使用Intel的CPU,苹果手机使用ARM的CPU。这两种CPU支持的语言不同。这些不同CPU支持的语言被称为不同的指令集。

不同的CPU有不同的指令集,对应不同的汇编语言和机器码。为了简化机器码的理解,我们选择了最简单的MIPS指令集来说明机器码的生成过程。MIPS是由MIPS技术公司在80年代中期设计的CPU指令集。不久前,MIPS公司将整个指令集和芯片架构完全开源。

MIPS指令是一个32位的整数,其中高6位是操作码,表示具体的指令类型,剩下的26位有三种格式:R、I和J。

  • R指令通常用于算术和逻辑操作,包括读取和写入寄存器的地址。对于逻辑位移操作,还需要位移操作的位移量。最后的功能码表示具体的指令。
  • I指令通常用于数据传输、条件分支和运算时使用的非变量或常数。它没有位移量和操作码,也没有第三个寄存器,而是将这三部分直接合并成一个地址值或常数。
  • J指令是跳转指令,高6位之外的26位是跳转后的地址。
// test.c
int main()
{
int a = 1;
int b = 2;
a = a + b;
}

为了在Linux操作系统上运行这段代码,我们需要将整个程序编译成汇编语言的代码。然后使用汇编器将汇编代码翻译成机器码。这些机器码由0和1组成的机器语言表示。每条机器码都是一条计算机指令。这些16进制数字就是CPU可以识别的计算机指令。

汇编代码实际上就是给程序员看的机器码。由于难以理解8b 45 f8这样的机器码,人类更容易记住用英文表示的指令,如add、mov等。

从高级语言到汇编代码,再到机器码,是将开发的程序转变为CPU可以执行的计算机指令的过程。

CPU如何执行指令

CPU 内部处理过程

下图展示了一般程序(以 C 语言为例,java语言类似)的运行流程。了解程序的运行流程是掌握程序运行机制的基础和前提。

在这个流程中,中央处理器 (CPU) 的主要任务是解释和执行最终转换成机器语言的指令。CPU 由两个主要部分构成,包括控制单元和算术逻辑单元 (ALU)。

控制单元负责从内存中提取指令,并对其进行解码和执行。

算术逻辑单元 (ALU) 则负责处理算术和逻辑运算。

CPU被称为计算机的心脏和大脑,它由许多晶体管组成的电子部件构成,与内存一起协同工作。CPU接收数据输入,执行指令并处理信息。它还与输入/输出(I/O)设备进行通信,这些设备向CPU发送数据并从CPU接收数据。

从功能的角度来看,CPU的内部由寄存器、控制器、运算器和时钟四个部分组成,并且这些部分之间通过电信号进行相互连接。

  • 寄存器是一种高速存储器,用于暂时存储指令、数据和中间结果。
  • 控制器负责从内存中提取指令,并将其解码为操作信号,以控制其他部件的工作。
  • 运算器则负责执行算术和逻辑运算,包括加法、减法、乘法、除法和比较等操作。
  • 时钟是CPU的主时钟,用于同步各个部件的操作,确保它们按照正确的顺序和时序运行。通过这些部分的协同工作,CPU能够高效地执行各种计算任务。

CPU可以被分为三个主要部分,即运算单元、数据单元和控制单元。

运算单元主要负责进行各种计算操作,如加法、位移等。然而,运算单元并不知道应该计算哪些数据,也不知道计算结果应该存放在哪里。

如果每次计算的数据都需要通过总线传输到内存中,这将导致非常低效。因此,数据单元的存在就变得必要了。数据单元包括CPU内部的缓存和寄存器组,虽然空间较小,但速度非常快,可以暂时存储数据和计算结果。

有了数据存放的地方和计算的地方,还需要一个指挥中心来决定具体要进行哪些计算操作,这就是控制单元。控制单元充当统一的指挥中心,它可以获取下一条指令,并执行该指令。这条指令将指导运算单元从数据单元中取出特定的数据,进行计算,并将结果放回数据单元的相应位置。通过这样的指令执行过程,CPU能够高效地进行各种计算任务。

CPU的控制单元包含一个指令指针寄存器,它存储着下一条指令在内存中的地址。控制单元的工作是不断地将代码段中的指令加载进来,并将其放入指令寄存器中。

每条指令可以分为两个部分:操作类型(如加法或位移)和操作数据。为了执行这条指令,控制单元将操作类型传递给运算单元,将操作数据传递给数据单元。

数据单元根据数据的地址从数据段中读取数据,并将其存储在数据寄存器中,以便参与运算。运算单元执行完运算后,将结果暂时存储在数据单元的数据寄存器中。最后,通过指令将数据写回内存中的数据段。

或许你会好奇,上述的操作都是针对进程 A 的指令进行的,那进程 B 呢?CPU 内部有两个专门保存当前处理进程的代码段起始地址和数据段起始地址的寄存器。当执行进程 A 的指令时,这些寄存器保存着进程 A 的信息。而当切换到进程 B 时,CPU 会更新这些寄存器的值,这样就能执行进程 B 的指令了。这个切换过程被称为进程切换(Process Switch)。

另外,你可能也会注意到,CPU 和内存之间的数据传输是通过总线进行的。总线主要有两类数据,一类是地址数据,即指示我想要访问内存中的哪个位置的数据。这类总线被称为地址总线(Address Bus)。另一类是真正的数据,即要传输的数据。这类总线被称为数据总线(Data Bus)。

地址总线的位数决定了能够访问的内存地址范围有多广。例如,如果地址总线只有两位,那么 CPU 就只能识别 00、01、10、11 这四个位置,超过这个范围就无法区分。地址总线位数越多,能够访问的位置就越多,CPU 能够管理的内存范围也就越广。例如,32位的地址总线可以寻址2的32次方(约为4GB)个内存位置。因此,32位的地址总线可以识别并访问的内存位置范围是从0到2的32次方减1。

需要注意的是,地址总线的位数与CPU的数据位数是不同的。CPU的数据位数决定了它一次能够处理的数据量,而地址总线的位数决定了它能够寻址的内存位置范围。

而数据总线的位数决定了每次能够传输多少个数据。例如,如果数据总线只有两位,那么 CPU 每次只能传输两位数据。如果要传输八位数据,就需要进行四次传输。数据总线位数越多,每次传输的数据量就越大,访问速度也就越快。

总结

计算机指令是CPU能够理解的语言,也称为机器语言。不同的CPU支持不同的指令集,对应不同的汇编语言和机器码。MIPS指令集是一种常用的指令集。

CPU执行指令的过程包括指令的解码和执行。CPU内部由控制单元、算术逻辑单元和数据单元组成,它们协同工作来执行指令。控制单元负责指令的解码和操作信号的生成,算术逻辑单元负责执行计算操作,数据单元用于存储数据和计算结果。

CPU和内存之间的数据传输通过地址总线和数据总线进行。地址总线决定了CPU能够寻址的内存位置范围,数据总线决定了每次能够传输的数据量。

揭秘计算机指令执行的神秘过程:CPU内部的绝密操作的更多相关文章

  1. [No0000167]CPU内部组成结构及指令执行过程

    计算机的基本硬件系统由运算器.控制器.存储器和输入.输出设备五大部件组成.运算器和控制器等部件被集成在一起统称为中央处理单元(Central Processing Unit,CPU). CPU的功能 ...

  2. CPU内部的奥秘:代码是如何被执行的?

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:景明 我们以一段 C 代码为例,来看一下代码被编译成二进制 ...

  3. CPU内部组成及原理

    CPU,Central Processing Unit,翻译过来叫中央处理器.是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心( Control Unit).电脑中所有操作都由C ...

  4. 小甲鱼零基础汇编语言学习笔记第二章之寄存器(CPU工作原理,CPU内部通讯)

    这一章主要介绍了CPU中的重要器件——寄存器,整个系列通篇是以8086CPU作为探讨对象,其它更高级的CPU都是在此基础之上进行的升级.   1.一个典型的CPU是由运算器.控制器.寄存器等器件组成, ...

  5. cidaemon.exe过程cpu入住率和关闭cidaemon.exe加工方法

    问题叙述性说明:   这个时间机器始终是一个奇怪的问题:cidaemon.exe这个过程需要CUP率98%以上,大大影响了正常使用电脑.多个资源管理器出现cidaemon.exe过程,cpu率最高的一 ...

  6. java finalize方法总结、GC执行finalize的过程

    注:本文的目的并不是鼓励使用finalize方法,而是大致理清其作用.问题以及GC执行finalize的过程. 1. finalize的作用 finalize()是Object的protected方法 ...

  7. 问题:只能在执行 Render() 的过程中调用 RegisterForEventValidation;结果:只能在执行 Render() 的过程中调用 RegisterForEventValidation

    只能在执行 Render() 的过程中调用 RegisterForEventValidation 当在导出Execl或Word的时候,会发生只能在执行 Render() 的过程中调用 Register ...

  8. 在浏览器中输入URL后,执行的全部过程。会用到哪些协议?(一次完整的HTTP请求过程)

    在浏览器中输入URL后,执行的全部过程.会用到哪些协议?(一次完整的HTTP请求过程) 整个流程如下: 域名解析 为了将消息从你的PC上传到服务器上,需要用到IP协议.ARP协议和OSPF协议. 发起 ...

  9. 在执行xp_cmdshell的过程中出错,调用'LogonUserW'失败,错误代码:'1909'

    在上篇文章Could not obtain information about Windows NT group/user 'xxxx\xxxx', error code 0x5里面,我介绍了SQL ...

  10. 当用GridView导出Execl的时候,会发生只能在执行 Render() 的过程中调用 RegisterForEventValidation的错误

    当用GridView导出Execl的时候,会发生只能在执行 Render() 的过程中调用 RegisterForEventValidation的错误提示. 有两种方法可以解决以上问题: 1.修改we ...

随机推荐

  1. 微信小程序生态15- 批量提交微信小程序审核的一种方式

    大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教. 以下是『微信小程序生态系列文章』正文! 需求背景 ...

  2. 图像分割_评价指标_PSNR峰值信噪比和SSIM结构相似度

    PSNR psnr是"Peak Signal to Noise Ratio"的缩写,即峰值信噪比,是一种评价图像的客观标准. 为了衡量经过处理后的影像品质,我们通常会参考PSNR值 ...

  3. IP 地址斜杠后的数字和子网掩码

    目录 先上结论 IP 地址类型 ABC 类地址的划分 网络地址与广播地址 网络地址 广播地址 0.0.0.0 与 127.0.0.1 子网掩码 ABC 类 IP 地址最大网络范围与最大可用主机数 以 ...

  4. bitfield

    bitfield 作用 位域修改 溢出控制 原理 通过对redis字符串二进制形式进行操作,通过改变其值的作用 更具体 将一个Redis字符串看作是一个由二进制位组成的数组. 并能对变长位宽和任意没有 ...

  5. .NET周刊【7月第5期 2023-07-30】

    国内文章 PaddleSharp:跨越一年的版本更新与亮点 https://www.cnblogs.com/sdflysha/p/20230724-paddlesharp-in-a-year.html ...

  6. [clickhouse]同步MySQL

    前言 clickhouse的查询速度非常快,而且兼容大部分MySQL的sql语法,因此一般将clickhouse作为MySQL的读库. 本文提供两种clickhouse同步MySQL的方式 click ...

  7. MySql之锁

    MySql之锁 一.全局锁 对整个数据库加锁 应用:数据库所有表备份 二.表级锁 1.表锁 分为两类: 表共享读锁read lock 表独占写锁write lock 2.元数据锁 避免DML语句和DD ...

  8. Web通用漏洞--文件包含

    Web通用漏洞--文件包含 文件包含原理 在项目开发过程中,开发人员通常会将重复使用的函数写入单个文件中,在使用该类函数时,直接调用文件即可,无需重新编写,这种调用文件的过程成为文件包含.在文件包含过 ...

  9. 《深入理解Java虚拟机》读书笔记:基于栈的字节码解释执行引擎

      虚拟机是如何调用方法的内容已经讲解完毕,从本节开始,我们来探讨虚拟机是如何执行方法中的字节码指令的.上文中提到过,许多Java虚拟机的执行引擎在执行Java代码的时候都有解释执行(通过解释器执行) ...

  10. 原来你是这样的JAVA[05]--String

    1.从概念上讲,java字符串就是Unicode字符串. 2.字符串拼接 用指定分隔符拼接字符串数组时,使用StringJoiner或者String.join()更方便: 用StringJoiner拼 ...