机器代码执行,发生了什么?

时间:2013-05-14 05:34:21

标签: computer-science

多年来,我一直在学习计算机编程,一层抽象使我理解的东西蒙上阴影。说我编译了一些源代码,我有可执行的机器代码。计算机运行此代码后会发生什么?

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

1 个答案:

答案 0 :(得分:3)

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

Java和C#等其他语言有点棘手,其中有一个中间的“字节代码”,在程序运行时被解释并转换为机器代码,允许它们实现某些平台独立性。

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

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

可能更多。

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

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

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

另见: