计算机是如何执行代码的?
我们写下的一行行代码,计算机到底是如何在执行的呢?我们以x86架构的CPU为例,简单介绍以下CPU的执行过程。
1、高级语言
为了方便编程,目前人类已经发明了六百多种编程语言,使得我们可以用人类最容易理解的语法规则去告诉计算机完成我们想要的功能。例如我们常用的C、C++、python、perl、ruby、go、java等。这些语言被称为高级语言,以我们人类的思维方式来进行编程。
比如,一个C语言程序员写下了一行代码:
int sum = a + b;
这一句很简单的C语句,计算机却不懂。
这时候就需要一个翻译,负责把人类编写的高级语言“翻译”成计算机能看得懂的东西,这个翻译就是编译器。
2、编译链接
上面的高级语言语句经过编译器编译链接后,生成了一个目标运行平台为x86架构的可执行程序exe/elf,使用反编译工具IDA进行分析,可以看到这行代码编译后的样子是这样的:
8B 45 EC mov eax, [ebp+a]
03 45 E0 add eax, [ebp+b]
89 45 F8 mov [rbp+sum], eax
下面对上面的进行解释:
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在执行时通过不断的译码、执行,最终实现高级语言所描述的功能。
计算机是如何执行代码的?相关推荐
- 饥荒计算机丢失xinput1 3.dll,【已解决】“由于找不到xinput1_3.dll,无法继续执行代码”...
许多小伙伴在玩游戏或者使用电脑的过程中,电脑突然提示"由于找不到xinput1_3.dll,无法继续执行代码",导致游戏等程序无法正常启动运行,并且导致电脑系统弹窗报错.那xinp ...
- 猫=图灵机?4项测试证明,「猫猫计算机」可执行任意计算
点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 编辑:David 小咸鱼 [导读]近日,一位法国开发者Chloé Lourseyre在 ...
- 现代计算机系统中运算器设计一般采用的是,全国2014年4月高等教育自学考试计算机原理试题课程代码:02384...
全国2014年4月高等教育自学考试 计算机原理试题 课程代码:02384 请考生按规定用笔将所有试题的答案涂.写在答题纸上. 选择题部分 注意事项: 1.答题前,考生务必将自己的考试课程名称.姓名.准 ...
- CVE-2015-1635-HTTP.SYS远程执行代码漏洞(ms15-034)
CVE-2015-1635-HTTP.SYS远程执行代码漏洞(ms15-034) 安全公告 漏洞复现 在2015年4月安全补丁日,微软发布的众多安全更新中,修复了HTTP.sys中一处允许远程执行代码 ...
- 由于找不到mscoree.dll无法继续执行代码
Windows终端可以说是Windows系统中非常重要的功能之一,可以帮助用户通过命令行的模式来调整电脑,但是最近不少用户在运行的时候却提示由于找不到mscoree.dll无法继续执行代码,下面小编就 ...
- 计算机能直接执行的语言程序是,计算机能够直接执行的程序是什么语言
可执行程序. 1.可执行程序(executable program,EXE File)是指一种可在操作系统存储空间中浮动定位的特殊程序.在MS-DOS和MS-WINDOWS下,此类文件扩展名为.exe ...
- 由于找不到vcruntime140_1.dll无法继续执行代码,vcruntime140_1.dll丢失如何修复
在我们打开玩游戏的时候电脑突然提示由于找不到vcruntime140_1.dll无法继续执行代码是什么原因呢?因为vcruntime140_1.dll文件关键的库文件和组件,它们是许多Windows应 ...
- Microsoft Windows CredSSP 远程执行代码漏洞CVE-2018-0886
Microsoft Windows CredSSP 远程执行代码漏洞 Microsoft Windows Server 2008 SP2和R2 SP1,Windows 7 SP1,Windows 8. ...
- 安装Xshell遇到 由于找不到MSVCR110.dll,无法继续执行代码。重新安装程序可能会解决此问题
由于找不到MSVCR110.dll,无法继续执行代码.重新安装程序可能会解决此问题 当只缺少一个文件的时候可以用我在这个博客中的办法也可解决 但当缺少多个dl文件的时候还是不建议用这个方法,比较容易报 ...
- 由于找不到msvcp110.dll,无法继续执行代码。重新安装可以能会解决此问题
亲测可用 由于找不到MSVCR110.dll,无法继续执行代码.重新安装程序可能会解决此问题 当只缺少一个文件的时候可以用我在这个博客中的办法也可解决 但当缺少多个dl文件的时候还是不建议用这个方法, ...
最新文章
- 机器学习的第一个难点,是数据探索性分析
- 网络游戏性能测试的几点想法
- 闪回的用途与实战(闪回表,闪回删除,闪回重名删除,闪回版本查询)
- linux 64位 安装qt creator .run,Qt Creator安装
- 计算机网络资料篇(二)——快速理解网络协议
- ubuntu终端下快捷键,字体放大缩小等【逐渐完善篇】
- quill鼠标悬浮 出现提示_外设报道——DELUX多彩M618X垂直鼠标颠覆创新
- LeetCode 53. 最大子序和(动态规划)
- 自定义头文件 No such file or directory
- itext汇总 生成pdf
- java filesearcher_Java Object Searcher | java内存对象搜索辅助工具
- pyQT实现自动找茬游戏
- [c++11]我理解的右值引用、移动语义和完美转发
- window的bat批处理命令
- n卡驱动要下java吗_N卡驱动要下载哪一个?NVIDIA显卡驱动下载方法
- 王慧文清华产品课(四)
- 【STC15系列】SYK-0806-A2S1 工业自动化控制之【05-定时器控制的流水灯】
- html 圣杯布局 高度,web圣杯布局
- Android的屏幕多样性支持
- HTML Javascript CGI
热门文章
- C语言if else语句详解
- 消防物联网,为逆行英雄守住第一道生命线
- 计算机网络基础B试题及答案,计算机网络基础试题及答案2
- 网吧系统快速设置工具
- 关于ExtJS错误“例外被抛出且未被接住”问题
- 计算机毕业设计Python+django 网上外卖订餐系统(源码+系统+mysql数据库+Lw文档)
- 完成端口(CompletionPort)之客户端篇
- imx6ul linux4,iMX6UL 4秒快速启动-飞凌嵌入式iMX6UL启动加速
- STM32驱动W25Q64读写数据
- python实现蒙特卡洛模拟_蒙特卡洛模拟(Python)深入教程