机器码要执行,这是怎么回事?

Kev*_*vin 3 computer-science

多年来我一直在学习计算机编程,抽象层使我的理解变得模糊。假设我编译了一些源代码并且我有可执行的机器代码。一旦计算机运行此代码,会发生什么?

例如,假设我运行一个简单的 if then else 语句并拥有机器代码。执行此指令的计算机电路中发生了什么?

Dav*_*eau 5

这取决于语言,但对于常规的可执行文件(如您从 C/C++ 获得的),机器代码是位模式,CPU 会将其解释为直接指令。如果您已经完成任何汇编,这些机器语言指令将与汇编指令一对一映射(如果您获得了 CS 学位,您最终应该参加一两门学习汇编的课程,甚至可能需要在汇编之间手动翻译和机器语言使用 CPU 参考)。

其他语言(如 Java 和 C#)稍微有点棘手,其中有一个中间“字节码”,在程序运行时将其解释并转换为机器代码,从而使它们能够实现一定的平台独立性。

至于指令本身做什么,它取决于CPU,但其中一些可以是如下所示:

  • 将值从寄存器*移动到 RAM 地址,反之亦然
  • 对两个值执行操作(如加法、异或、与、或等...)
  • 比较两个值(确定它们是否相等或一个大于另一个)
  • 根据上次比较的结果(在循环中使用)将当前指令寄存器(跳转)更改为不同的地址
  • 将值移入堆栈**,或从堆栈中移除值
  • 将我们的位置/状态保存在堆栈中,并跳转到一个新地址
  • 从堆栈中调用保存的位置/状态,并跳回到我们以前所在的位置(最后两个用于函数调用)

可能更多。

*寄存器是存在于 CPU 中的一些非常小但非常快的内存空间;某些寄存器用于某些指令。其中之一是当前指令寄存器,它保存要执行的下一条指令的地址。直接改变这个值会跳转到一个新的地址,类似于一个goto语句。

**堆栈是一个内部堆栈,可以以先进后出的方式从中存储和检索值。这就是函数调用的实现方式。像 Hansel 和 Gretel 一样,我们在身后留下面包屑的痕迹,以便我们可以找到回家的路。

此外,关于如何组织指令集有两种“思想流派”:RISC 和 CISC(精简指令集计算机和复杂指令集计算机)。在 RISC 计算机中,功能较弱的指令要少得多,程序员或编译器可以使用它们的组来完成更复杂的事情。在 CISC 计算机中,有越来越多的强大指令,但有一些冗余。基于 Intel 的 CPU 是 CISC。

也可以看看: