有关编译器的问题

时间:2013-01-20 06:49:05

标签: compiler-construction

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

  1. 我是否可以直接在我的机器上运行此编译程序,而无需Windows操作系统?

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

  3. 如果Windows已经是巨型汇编程序,那么它如何运行汇编程序?

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

  5. x64 architeture是一个带有新指令的新建筑,但仍然有x86指令吗?是真还是假?

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

  7. 由于

2 个答案:

答案 0 :(得分:2)

虽然我同意templatetypedef的评论,认为这应该分成更小的问题,但我会尽力在这里提出一些问题。

  

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

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

  

.exe是一个带有内置汇编指令的编译文件   我的节目?

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

  

如果汇编语言程序是字节码,那么为什么我记录PIC   使用PIC刻录机,我写了六进制代码吗?

如上所述。 Bytecode是一个含义很多的词。十六进制只是表示二进制的另一种(更短的)方式。在一天结束时,一切都会减少到二进制。

  

x64 architeture是一个新的架构,带有新的指令但是   它还有x86指令吗?对还是错?

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

  

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

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

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

答案 1 :(得分:2)

  

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

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

  

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

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

  

如果装配程序已经是一个巨大的装配程序,它如何运行装配程序?

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

  

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

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

  

x64 architeture是一个带有新指令的新建筑,但仍然有x86指令吗?对还是错?

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

  

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

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