rip是什么道理(r.i.p 英语抚慰牺牲)

机怎样实行你写的代码?知乎上有人发问:电脑还好吗实行编制程序谈话的?

很多方才入坑的小白大概对此实足没有观念,大概朦朦胧胧领会个大约,咱们写下的一条龙行代码,计划机究竟是怎样在实行的呢?

咱们以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

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

接下来,计划机密做的工作即是辨别那些二进制流都是什么道理,变换成一条条的训令来实行。

在发端实行之前,先来领会一下训令方法。

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

4、训令方法x86框架结构CPU训令会合的训令方法如次:

重要有六个局部:

[非必定] 训令前缀:咱们常常用到的亚原子操纵训令前方有一个lock前缀,就属于训令前缀。

[必定] 操纵码:训令最中心的局部,标识这条训令是什么功效。

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

[非必定] 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。

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

训令译码实行之后,发端来正式实行它。

实行完一条此后,又到达训令存放器EIP指向的场合,随后再次训令译码、实行,连接反复这个进程,顺序实行每一条训令。

这本来即是CPU处事最基础的道理。

拓展上头刻画的进程是CPU在硬件通路层面实行的,但这种安排思维在软硬件范围也同样实用。

大师即使去接洽Java假造机JVM和Python的证明器源代码时,也会创造有一致之处:JVM妥协释器经过设置一套本人的“训令集”,而后它们的编写翻译器运用这套训令集将Java和Python代码编写翻译成对应的步调。

运转的功夫也一致,假造机大概证明器连接辨别每一条训令,译码、实行,和CPU实行训令的进程颇有几分一致。

C/C++谈话编写翻译的步调,结果是径直编写翻译成了CPU的训令,以是跨平台本领差,即使换到ARM框架结构平台,从来的步调将没辙实行,须要从新编写翻译成新的平台的步调。

而Java、Python这类谈话,是本人在软硬件层面包车型的士训令集,由于其自己仍旧开拓了对准各别CPU平台的假造机、证明器,以是那些谈话编写的步调移植性好,真实做到一次编写,四处运转。

归纳咱们运用高档谈话C、C++编写的步调代码,过程编写翻译器的编写翻译链接,最后形成CPU不妨领会的呆板训令,随后CPU在实行时经过连接的译码、实行,最后实行高档谈话所刻画的功效。

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

此刻你领会你用编制程序谈话写下的步调是怎样跑起来的了吗?

作家:轩辕之风

根源:编制程序本领世界(ID:xuanyuancoding)

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