【问题标题】:how a source code is converted into 1's and 0's?如何将源代码转换为 1 和 0?
【发布时间】:2010-09-01 11:02:31
【问题描述】:

计算机除了1和0什么都不懂。但我想知道源代码或指令集如何转换为1和0的细节。exe文件是否只包含1和0?

【问题讨论】:

标签: compiler-construction compilation binary


【解决方案1】:

微处理器instruction set 中的每种操作类型都由一个操作码指定,该操作码表示为1 和0 的模式。 compilerinterpreter 将源语言中的代码翻译成由这些指令组成的 machine code

以这段代码为例,变量x被赋值为50:

x = 50;

编译器可能会将其转换为以下汇编语言,其中使用 MOV 指令将 AX 寄存器(用于x 变量)设置为值 50(十六进制):

mov ax, 0x32

如果MOV 的操作码是0xA0,而AX 寄存器的代码是0xB,那么二进制的机器码应该是这样的: p>

10100000 00001011 00110010

【讨论】:

  • 一条指令没有实现为操作码。一条指令由一个操作码和一些操作数标识符组成。我认为您将术语 instruction 与操作码混淆了,反之亦然。
  • 我改写了它,但最初的“指令”只是指操作码表示的操作,而不是操作的特定实例。
【解决方案2】:

你需要研究Compilers

【讨论】:

  • 所以请提供一些我可以研究的来源?
  • 点击链接......“编译器”一词链接到关于它们的维基百科文章,是一个很好的起点。一个简单的谷歌搜索“编译器”也将产生丰富的信息。
【解决方案3】:

是的。 .exe 本质上是一种包含 0 和 1 的二进制文件格式(它还包含其他重要的操作系统信息,供您的程序运行)

CPU 带有某些基本操作的规范,如 SUM、MOV 等。这些是 CPU 知道的唯一操作。编译器的工作是解释 2 + 3 之类的东西,并将其转换为 CPU 可以解释的东西(SUM 和标志检查溢出等)。

所以本质上,编写像2 + 3 这样的高级代码只是编写大量汇编代码(它只是人类可读的二进制版本)的一种更短的方式。

【讨论】:

  • 所以你的意思是说汇编器依赖于处理器,而编译器依赖于语言?
  • 你忘了说汇编语言映射到二进制操作码。
  • @Radheshyam 是的,每个 CPU 都有一个指令集,例如 i386 或 x64。这些定义了您使用指令的内容和方式(称为汇编语言,但实际上没有这样的东西)。指令直接映射到操作码,这些操作码实际上只是发送到正确位置的 0 和 1(CPU 中的指令解码器)。编译器直接将高级语言(如c++)编译成操作码。其他一些语言使用中间代码(如 Java 的字节码)。
【解决方案4】:

当您编译您的代码时,编译器会在 Assembly 中创建等价的代码,然后再交给处理器运行。汇编程序负责将程序集转换为二进制文件。

每个高级指令(使用您的编程语言)作为与其关联的汇编指令。这些汇编指令可以高度优化(因此有 GCC 和其他编译器、优化标志)。

您可能想阅读http://computer.howstuffworks.com/bytes.htm

【讨论】:

  • 处理器实际上并不将汇编转换为二进制,这是汇编器的工作,其功能与编译器类似。实际上,如果您想获得技术知识,因为它们都是程序,处理器会完成从编写代码到存储代码到将其转换为...的所有工作。
  • 是的。你被纠正了。我编辑了。汇编器转换为二进制而不是处理器。
  • 那么编译器对于不同的语言可能是不同的,但汇编器是依赖于处理器的,这是真的吗?
  • 编译器对于不同的语言是不同的,对于相同的语言不同的平台(OS,ISA)。不同 ISA 的组装方式不同。
  • 必须为特定架构生成汇编代码才能在处理器中运行。在 GCC 中,您可以为 PPC、IA32 和其他架构创建二进制文件。
猜你喜欢
  • 2021-10-22
  • 2014-01-17
  • 2013-02-24
  • 1970-01-01
  • 2021-05-03
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多