【问题标题】:What are all the kinds of instructions that are contained in a executable file? [closed]可执行文件中包含哪些类型的指令? [关闭]
【发布时间】:2014-06-25 09:32:16
【问题描述】:

我知道 exe 文件包含纯 CPU 指令和额外的数据。因此,如果我开始运行一个简单的 hello world 控制台应用程序或 32 位 GUI 应用程序(exe 文件),那么操作系统会将 exe 文件中给出的指令加载到内存中以由 CPU 处理。因此,如果我运行该应用程序,它应该只按照说明进行操作,即仅显示 hello world(在一个只有单词“hello world”的完整空白屏幕中)。但事实并非如此。它在某种程度上由操作系统控制以在命令提示符的窗口环境中显示。那么那里实际发生了什么。

编辑:确切地说,我的问题是我想知道一个 exe(Windows 操作系统中的一个简单的 16 位 dos 应用程序)文件包含的所有指令(考虑到我上面的混淆)?

【问题讨论】:

  • 您使用什么操作系统来编译程序以及您要在什么操作系统上执行它?
  • windows编译执行
  • 如果您在 Windows 上编译程序并尝试在 Windows 上运行它,它应该可以工作。如果你在 Ubuntu 上编译它并在 Ubuntu 上运行它,它应该也可以工作。但是剩下的两个选项中的任何一个(编译的不同操作系统和执行的不同操作系统)都不应该工作。
  • 我根据您在此处所说的内容扩展了我的答案,希望它能回答您的问题。
  • 作为您问题的反例(“为什么它比我告诉的要多”):您没有指示任何地方将您的文本“完全空白”屏幕”。然而,你似乎并不惊讶它会这样做。

标签: linux windows operating-system


【解决方案1】:

如果您在特定操作系统上编译程序,那么您应该在该操作系统上运行它。例如,如果你为 Windows 编译一个命令行程序,它可以在 Windows 上运行,但它不能在 Ubuntu 上运行。您自己说过可执行文件的内容因操作系统而异。

您可以做的是在另一个系统上为特定系统使用模拟器。例如,如果您在 Linux 上,则可以使用 Wine 来运行 Windows 程序。通过这种方式,您可以为您的程序模拟 Windows 环境,即使它是在 Linux 上。

当然,CPU 应该照原样遵循指令。例如,如果您想打印一条 hello world 行,那么您的程序将包含相应的代码。 但不仅如此。它包含其他依赖于操作系统的东西的代码,这就是问题所在。例如,您的 Windows 编译程序可能使用某些 Windows API 来执行打印,而在 Linux 上找不到此 API。直接执行输出的是调用的 API,而不是您的程序

正如 Jongware 在下面的评论中提到的那样,您可以做的是 cross-compile 您的代码。在这种情况下,您可以在 Windows 上编译您的代码,以便它可以在 Linux 上运行,但前提是您必须使用特定 Linux 所需的库对其进行编译。但是,在这种情况下,您将无法在 Windows 上运行代码。

【讨论】:

  • 危险的回答:“什么是交叉编译?”
  • @Jongware 对...谢谢你提到它:)
  • 对不起,我没有得到我认为我的问题具有误导性,我必须重新发布。考虑如果我在 windows xp 中运行该应用程序,cpu 应该只按照指令执行,也就是说,仅显示 hello world,将 hello world 写入视频内存,但实际上并没有发生,而是显示在窗口命令中提示背景场景等不在我给出的 exe 指令中
  • @user3615041 是的,就是这样。而且由于该 API 可能因操作系统而异,这就是导致问题的原因。
  • @enedil 如果是这样,那么我会说启动终端窗口的不是程序本身,而是已被赋予运行该程序的命令的操作系统。如果程序已经在终端窗口中启动,则不会再创建一个。
【解决方案2】:

默认情况下,软件是为您使用的同一类型的机器编译的。但是,您也可以安装交叉编译器,为其他类型的机器进行编译。

当您开发桌面或服务器应用程序时,开发平台(运行编译器的机器)和目标平台(运行应用程序的机器)几乎总是相同的。 “平台”是指 CPU 架构和操作系统的组合。在一台机器上构建可执行二进制文件,并在 CPU 架构或操作系统不同时在另一台机器上运行它们的过程称为“交叉编译”。进行交叉编译需要一个特殊的编译器,称为“交叉编译器”,有时也称为“工具链”。

看看herehere

【讨论】:

    【解决方案3】:

    因此,如果我运行该应用程序,它应该只按原样遵循指令,即仅显示 hello world(在一个只有单词“hello world”的完整空白屏幕中)。

    为什么是“完全黑屏”?这完全取决于您的应用程序是如何设计的:

    • 在控制台应用程序中,它会将字符串输出到标准输出,然后显示在您启动程序的控制台内。如果您直接通过快捷方式或双击 .exe 文件启动它,它将打开一个新的控制台窗口。
    • 在窗口应用程序中,它将在您定义要输出的任何位置输出字符串。

    唉,你的问题太模糊了,无法在这里变得更具体。

    但事实并非如此。它在某种程度上由操作系统控制以在命令提示符的窗口环境中显示。

    这是什么意思?

    如果这意味着我的想法,我。 e.你确实会得到一个带有字符串输出的黑色窗口,好吧,如果它是一个控制台应用程序,这正是它应该如何工作的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      相关资源
      最近更新 更多