3

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

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

4

1 回答 1

5

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

Java 和 C# 等其他语言稍微复杂一些,其中有一个中间“字节码”,在程序运行时会被解释并翻译成机器代码,从而使它们能够实现某种平台独立性。

至于指令本身的作用,取决于 CPU,但其中一些指令可能如下所示:

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

可能还有更多。

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

**堆栈是一个内部堆栈,可以以先进后出的方式存储和检索值。这就是函数调用的实现方式。像汉塞尔和格莱特一样,我们在身后留下面包屑的痕迹,这样我们才能找到回家的路。

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

也可以看看:

于 2013-05-14T05:39:24.477 回答