rip是什么意思(r.i.p英语安慰去世)

访客2022-12-13 02:16:1085

文章目录[隐藏]

如何执行你写的代码?1、高级语言。2.编译链接。3.机器说明。4.指令格式。5.执行指令。发展摘要

rip是什么意思(r.i.p深圳生活网英文安慰死亡)。

如何执行你写的代码?

知乎有人问:计算机是如何执行编程语言的?

刚才很多小白在入坑的时候可能对此一点都不了解,或者说是隐约知道这件事。计算机是如何执行我们编写的代码行的?

以x86 CPU为研究对象,我们尝试从一个例子来回答这个问题。

1、高级语言。

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

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

intsum=a+b;

简单的c语言句子再简单不过了。

但即使这么简单,辉煌的电脑还是无法理解:这是什么?

这时候就需要一个翻译员,把人类写的高级语言“翻译”成计算机可以理解的东西。这个翻译是一个编译器。

2.编译链接。

上述高级语言语句经过编译器编译链接后,生成以x86架构为目标运行平台的可执行程序exe/elf。使用反编译工具IDA分析后,可以看到编译后的代码是这样的:

Mov eax,a:在eax寄存器中存储变量a的值。

添加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 22222000

接下来,计算机需要做的是识别这些二进制流的含义,并将它们转换成指令来执行。

在开始执行之前,让我们看一下命令格式。

4.指令格式。

x86架构CPU指令集中的指令格式如下:

主要有六个部分:

【可选】指令前缀:我们经常使用的原子操作指令前面有一个锁前缀,这是一个指令前缀。

【必选】操作码:指令的核心部分,标识该指令的功能。

[可选]ModR/M:内存/寄存器操作数部分。

[可选]SIB:索引寻址描述字节。

【可选】位移:恒定偏移字节/半字/字。

【可选】立即:立即数字段/半字/字。

需要注意的是,并不是每条指令都包含上述所有部分,很多指令只包含部分字段。

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

5.执行指令。

真正负责指令执行的计算机核心部件是中央处理器(CPU)。在中央处理器中,有一个指令寄存器IP,它的全名是指令指针。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可以理解的机器指令。然后,当中央处理器执行时,高级语言中描述的功能最终通过连续解码和执行来实现。

现在你知道你用编程语言写的程序是如何运行的了吗?

作者:轩辕之风。

来源:编程技术宇宙(ID:轩辕编码)。

控制面板

您好,欢迎到访网站!
  查看权限

最新留言