【问题标题】:Questions about compilers关于编译器的问题
【发布时间】:2013-01-20 06:49:05
【问题描述】:

当编译器以文本形式编译我的代码时,它会将文本代码转换为低级代码,对于代码块中的 GCC,汇编。

  1. 我可以直接在我的机器上运行这个编译好的程序,而不需要windows操作系统吗?

  2. .exe 是一个已编译的文件,其中包含我的程序的内置汇编指令吗?

  3. 如果已经是巨型汇编程序,windows如何运行汇编程序?

  4. 如果汇编语言程序是字节码,为什么我用 PIC 刻录机刻录 PIC 时,要写 hexacode?​​p>

  5. x64 架构是具有新指令的新架构,但仍具有 x86 指令?是真是假?

  6. 如何读取编译器生成的低级代码?

谢谢

【问题讨论】:

  • 您需要将其拆分为几个较小的问题。您在这里提出了六个不同的问题。

标签: compiler-construction


【解决方案1】:

虽然我同意 templatetypedef 的评论,即这应该分成更小的问题,但我会尽力在此处为您的每个问题提供一些指导。

我可以直接在我的机器上运行这个编译的程序吗? 需要windows操作系统吗?

从技术上讲,是的,但这需要修改正常的启动过程。这与您的第三个问题有关。 Windows 本身是一种应用程序加载器,它是一种旨在启动其他应用程序(并做其他有用的事情)的应用程序。目前,当您的计算机启动时,它的第一条指令可能是一条JUMP 指令,告诉计算机“跳转到”您的操作系统的内存位置并开始其初始化。从此操作系统相对独立。

.exe 是带有内置汇编指令的编译文件吗? 我的程序?

.exe 文件只是一种可执行文件。其他包括ELFMach-O 以及其他一系列。 .exe 文件就像任何其他文件一样,除了它的“标题”告诉机器以下数据是机器可执行指令(1 和 0)的形式。不要将汇编语言与机器指令混淆。机器不会读取像 mov %eax, %ebx 这样的汇编指令。首先,它通过assmebler 传递并转换为 1 和 0。

如果汇编语言程序是字节码,为什么当我记录 PIC 用PIC刻录机,我给它写十六进制代码?

如上。 Bytecode 是一个有多种含义的词。十六进制只是表示二进制的另一种(较短)方式。一切都归结为二进制。

x64 架构是一种具有新指令的新架构,但 那还有x86指令吗?是真是假?

没错。英特尔尽最大努力保持完全的向后兼容性。这不一定适用于操作系统。

如何读取编译器生成的低级代码?

我假设您指的是汇编代码,而不是 1 和 0。最常见的方法是将-S 标志与gcc 之类的编译器一起使用。这将输出一个.s 程序集文件而不是.o 对象或.exe(etc) 可执行文件。

如果您想了解更多关于汇编的信息,这里是英特尔处理器的God ReferenceIA-32('x86')和x86-64)。请注意,这是非常沉重的。您最好在 Google 上查找 Windows 或 OS X 组装教程。 NASM 是一个免费的多平台汇编器,如果你想开始,它的语法与其他的略有不同。在你开始之前,我建议你学习计算机系统的基础知识——处理器是如何工作的,等等。也许首先学习一种更简单的汇编语言,比如 DLX 或 MIPS。

【讨论】:

    【解决方案2】:

    我可以直接在我的机器上运行这个编译好的程序,而不需要windows操作系统吗?

    一般来说,不会。程序几乎总是使用操作系统的 API 来执行常见的任务,因此它们不能在没有操作系统的情况下运行。此外,大多数操作系统要求可执行文件采用特定的文件格式(Windows 为“PE”,Linux 为“ELF”,OS X 为“Mach-O”等),以便它们(更准确地说loader) 可以做它想要/需要做的事情。为了运行原始机器代码,您需要一种所谓的平面二进制格式。

    .exe 是一个已编译的文件,其中包含我的程序的内置汇编指令吗?

    是的,正如我上面提到的,它还包含操作系统所需的一些元数据。

    windows已经是一个庞大的汇编程序,它如何运行汇编程序?

    它将它加载到内存中适当的地址并跳转到它的入口点。

    如果汇编语言程序是字节码,为什么当我用 PIC 刻录机录制 PIC 时,我会向它写入 hexacode?​​p>

    没有。 PIC(以及所有一般的微控制器)以二进制形式存储原始机器代码。 .hex 文件中的十六进制表示只是一种方便、人类可读的数据存储形式。

    x64 架构是具有新指令的新架构,但仍然具有 x86 指令?是真是假?

    我会说它向后兼容 x86 并提供一些支持。它确实有x86的指令集。

    如何读取编译器生成的低级代码?

    也许通过在文本编辑器中打开它?这是一个太模糊的问题。但是,如果您想问如何查看生成的人类可读的汇编代码,请查阅编译器的手册。对于gccclang,这通常使用-S 编译器标志来实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-26
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多