一行代码揭开CPU执行原理

参考:一行代码,揭开CPU执行原理!
作者:嵌入式ARM
网址:https://mp.weixin.qq.com/s/qFnKhWqBGRCFAnp_KC1dmw

目录

  • 1、高级语言
  • 2、编译链接
  • 3、机器指令
  • 4、指令格式
  • 5、执行指令
    • 拓展
    • 总结

很多刚刚入坑的小白可能对此完全没有概念,或者模模糊糊知道个大概,我们写下的一行行代码,计算机到底是如何在执行的呢?

我们以x86架构的CPU为研究对象,从一个例子出发,来尝试解答这个问题。

1、高级语言

为了方便编程,伟大的计算机先驱们发明了一个又一个的编程语言,使得我们可以用人类最容易理解的语法规则去告诉计算机完成我们想要的功能。

比如,一个C语言程序员写下了一行代码:

int sum = a + b;

一句简单的不能再简单的C语言语句。

但即便是如此简单,聪明绝顶的计算机却还是看不懂:这是弄啥捏?

这时候就需要一个翻译,负责把人类编写的高级语言“翻译”成计算机能看得懂的东西,这个翻译就是编译器

2、编译链接

上面的高级语言语句经过编译器编译链接后,生成了一个目标运行平台为x86架构的可执行程序exe/elf,使用反编译工具IDA进行分析,可以看到这行代码编译后的样子是这样的:
在这里插入图片描述

mov eax, a    : 将变量a的值存入eax寄存器中add eax, b    : 把变量b的值和eax寄存器的值相加,并将结果保存在eax寄存器中mov sum, eax  : 将计算结果从eax寄存器写入sum变量

看到了吗,就像把大象关进冰箱需要分三步,计算机完成程序员的一条加法语句,也分了三步:取出被加数、加上加数、写入结果。

3、机器指令

上面的汇编指令只是为了人类理解方便的助记符,计算机同样也不认识这玩意,那几条指令在内存中实际上是这样的一串数据:

十六进制:

8B 45 EC 03 45 E0 89 45 F8

十六进制是为了书写方便,计算机真正能看到的只有二进制的比特流:

10001011 01000101 11101100 00000011 01000101 11100000 10001001 01000101 11111000

接下来,计算机要做的事情就是识别这些二进制流都是什么意思,转换成一条条的指令来执行。

在开始执行之前,先来了解一下指令格式。

4、指令格式

x86架构CPU指令集中的指令格式如下:
在这里插入图片描述
主要有六个部分:

  • [非必需] 指令前缀:我们经常用到的原子操作指令前面有一个lock前缀,就属于指令前缀。
  • [必需] 操作码:指令最核心的部分,标识这条指令是什么功能。
  • [非必需] ModR/M:内存/寄存器操作数字节
  • [非必需] SIB:索引寻址描述字节
  • [非必需] Displacement:常数偏移字节/半字/字
  • [非必需] Immediate:立即数字节/半字/字

需要注意的是,并不是每一条指令都包含上面的所有部分,许多指令只包含其中一部分字段。

根据操作码的长度不同,指令分为单字节操作码指令、双字节操作码指令、三字节操作码指令

5、执行指令

计算机中真正负责指令执行的核心部件是中央处理器CPU,在CPU中有一个指令寄存器IP,全称是Instruction Pointer,在32位下,它叫EIP,在64位下它叫RIP

下面开始执行:

指令寄存器EIP指向了第一条指令,开始读取第一个字节:10001011,也就是0x8B。

开始指令译码,翻译出这是一条什么指令。

下面是x86架构的CPU指令操作码表:
在这里插入图片描述
CPU中的指令译码模块拿到手一看,呀,不是指令前缀,是个单字节操作码的mov指令,要往eax寄存器里面塞数据,数据从哪来呢?

再往后一看,0x45,再来译码:
在这里插入图片描述
好家伙,原来是根据ebp寄存器的值+一个8位的偏移来读取数据。

再往后读取一个字节,就是偏移值:EC。

现在第一条指令就译码出来了:将ebp+0xEC位置处的4个字节的数据取出来,放到eax寄存器中。这就是这一条指令要干的事情。

同时CPU还得出了另一个信息:这一条指令长度是3个字节,下一条指令的起始地址是在3个字节之后,随后,指令寄存器EIP向后拨动,指向下一条指令的地址:$+3。

指令译码完成之后,开始来正式执行它。

执行完一条以后,又来到指令寄存器EIP指向的地方,随后再次指令译码、执行,不断重复这个过程,依次执行每一条指令。

这其实就是CPU工作最基本的原理。

拓展

上面描述的过程是CPU在硬件电路层面完成的,但这种设计思想在软件领域也同样适用。

大家如果去研究Java虚拟机JVM和Python的解释器源代码时,也会发现有相似之处:JVM和解释器通过定义一套自己的“指令集”,然后它们的编译器使用这套指令集将Java和Python代码编译成对应的程序。

运行的时候也类似,虚拟机或者解释器不断识别每一条指令,译码、执行,和CPU执行指令的过程颇有几分相似。

在这里插入图片描述
C/C++语言编译的程序,最后是直接编译成了CPU的指令,所以跨平台能力差,如果换到ARM架构平台,原来的程序将无法执行,需要重新编译成新的平台的程序。

而Java、Python这类语言,是自己在软件层面的指令集,因为其自身已经开发了针对不同CPU平台的虚拟机、解释器,所以这些语言编写的程序移植性好,真正做到一次编写,到处运行。

总结

我们使用高级语言C、C++编写的程序代码,经过编译器的编译链接,最终变成CPU可以理解的机器指令,随后CPU在执行时通过不断的译码、执行,最终实现高级语言所描述的功能。

现在你知道你用编程语言写下的程序是如何跑起来的了吗?

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html链接txt文件,怎么在TXT文件中建立超链接

参考方法如下:1、在桌面鼠标依次右键——新建——文本文档;2、在记事本中输入命令:echo off echo 正在清除系统垃圾文件,请稍等...... del /f /s /q %systemdrive%\*.tmp del /f /s /q %systemdrive%\*._mp del /f /s /q %systemd…

spark 2.4安装

1、spark 官网选择对应Hadoop的版本,之前安装的Hadoop版本为hadoop-3.0.2,获取下载包:wget http://mirrors.hust.edu.cn/apache/spark/spark-2.4.0/spark-2.4.0-bin-hadoop2.7.tgz2、解压缩安装包,创建软连接:tar -zxv…

redhat 挂载 iso文件 提示 mount :not a directory

redhat 挂载 iso文件 提示 mount :not a directory posted on 2013-12-28 22:26 秦瑞It行程实录 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/ruiy/p/errors.html

C语言常见编译错误及分析

更多干货推荐可以去牛客网看看,他们现在的IT题库内容很丰富,属于国内做的很好的了,而且是课程刷题面经求职讨论区分享,一站式求职学习网站,最最最重要的里面的资源全部免费!!!点击进…

计算机组成原理实验 组装实验报告,计算机组成原理实验一实验报告..doc

计算机组成原理实验一实验报告.实验一 运算器实验算术逻辑运算器实验目的:掌握算术逻辑运算器单元ALU(74LS181)的工作原理掌握简单运算器的数据传送通道验算由74LS181等组合逻辑电路组成的运算功能发生器运算功能按给定数据,完成实验指定的算术/逻辑运算…

FIS.js前端开发的使用说明文档

文档结构什么是FIS部署FISFIS基本使用模块定义加载方式调用Tangram 2.0一.什么是FIS FIS提供了一套贯穿开发流程的开发体系和集成开发环境,为产品线提供前端开发底层架构,这能帮助工程师提高开发效率,沟通协作效率,快速实现需求并…

典型用户和用户场景描述

场 景 / 故 事 / Story 版权信息 :大浪淘沙 版本信息 :Beta Version(测试版) 维护人信息:热心市民隔壁老王 版本记录:目前版本为第一期测试版 1.背景: (一)典…

面经——嵌入式常见面试题总结100题(上)

更多干货推荐可以去牛客网看看,他们现在的IT题库内容很丰富,属于国内做的很好的了,而且是课程刷题面经求职讨论区分享,一站式求职学习网站,最最最重要的里面的资源全部免费!!!点击进…

计算机专业运动会口号,运动会口号押韵有气势 计算机系霸气口号

淡泊明志,宁静致远,团结友爱,顽强拼搏。下面是文艺范收集的运动会口号押韵有气势,计算机系霸气口号,欢迎阅读收藏。1、球进了球,分了就会,不怕**,战无不胜。2、阳光运动,…

1. 观察者模式总结(C++)

1. 介绍 观察者模式:定义了一种“一对多”的依赖关系,让多个观察者对象同时监听一个对象的改变,即当该对象的状态发现改变时,会通知所有它依赖的观察者对象。观察者模式属于行为模式。 意图:定义对象间的一种一对多的依…

面经——嵌入式常见面试题总结100题(下)

更多干货推荐可以去牛客网看看,他们现在的IT题库内容很丰富,属于国内做的很好的了,而且是课程刷题面经求职讨论区分享,一站式求职学习网站,最最最重要的里面的资源全部免费!!!点击进…

学计算机要不要护发,脱发平时应该注意什么 四个妙招教你如何防止脱发

头发一掉,失去的不仅仅是发丝,还有美丽与颜值,一把把辛酸泪只能往肚子里吞。秃头星人们,如果已经脱发了,日常一定要加倍注意哦,一些错误的护发方法不要踩坑,护理、食疗、良好的生活作息&#xf…

C++面向对象类的实例题目一

在一个程序中,实现如下要求: (1)构造函数重载 (2)成员函数设置默认参数 (3)有一个友元函数 (4)有一个静态函数 (5)使用不同的构造函数…

iframe父子页面间的关系

在hbBank项目中&#xff0c;客户信息查询使用了&#xff0c; iframe引入外界的页面&#xff0c;使用代码如下&#xff1a; <iframe id"tab-3" class"hidden" name"tab-3" marginwidth0 marginheight0 width100% src"../commomFile/othe…

面经——嵌入式软件工程师ARM体系与架构相关

参考&#xff1a;嵌入式软件工程师笔试面试指南-ARM体系与架构 作者&#xff1a;嵌入式与Linux那些事 发布时间&#xff1a; 2021-04-28 15:22:06 网址&#xff1a;https://blog.csdn.net/qq_16933601/article/details/116234673 目录 ARM体系与架构硬件基础NAND FLASH 和NOR F…

下列属于计算机人工智能应用领域的是多选题,每天五道选择题(10)

原标题&#xff1a;每天五道选择题(10)1.在Windows7操作系统中&#xff0c;磁盘维护包括硬盘检查、磁盘清理和碎片整理等功能&#xff0c;磁盘清理的目的是( )。A.提高磁盘存取速度B.获得更多磁盘可用空间C.优化磁盘文件存储D.改善磁盘的清洁度▼答案&#xff1a;B【解析】磁盘…

2013与2014之流水

2013与2014之流水 跨年之际&#xff0c;看到博客园无数园友的精彩总结&#xff0c;心里满是惭愧&#xff0c;该是反省的时候了。先记下一篇流水账&#xff0c;然后抽空补上。13年&#xff0c;留下了一些与个人心心相关的生活足迹&#xff0c;让我不得不反省&#xff1a; 1…

数独一

本质上 X-Cycle 只是 X-Chain 的特例&#xff0c;因此统称为单链。单链若由两条强链与一条弱链构成&#xff0c;就是习称的双强链&#xff0c;有摩天楼、双线风筝、鱼三种连结方式。单链若由两条强链与两条弱链构成环&#xff0c;就是习称的 X-Wing。转载于:https://www.cnblog…

2019年3月未来教育计算机二级题库,2019年3月计算机二Access考试操作模拟试题001...

2019年3月计算机二Access考试操作模拟试题001浏览次数&#xff1a; 时间&#xff1a;2019/03/28一、基本操作题在考生文件夹中有一个“Acc1.mdb”数据库。(1)在“订单”表的“订单ID”和“客户”字段之间添加“产品ID”和“数量”字段。其中&#xff0c;“产品ID”字段的类…

面经——C/C++常见面试知识点总结附面试真题

参考&#xff1a;C/C 面试题 作者&#xff1a;zhaouc 发布时间&#xff1a; 2015-02-15 15:51:00 网址&#xff1a;https://blog.csdn.net/zhaouc/article/details/43835667 参考&#xff1a;C/C常见面试知识点总结附面试真题----20210529更新 作者&#xff1a;kuweicai 发布时…