【问题标题】:Assembly code on different O.S.s but same processor is same or different?不同操作系统但相同处理器上的汇编代码相同还是不同?
【发布时间】:2013-02-24 10:08:19
【问题描述】:

编译 C/C++ 代码时,它会生成汇编代码。 如果我有 Windows 和 Linux 双启动(即完全相同的处理器)并且我在 Windows 和 Linux 上都用 C++ 编写了一个程序,那么

编译后(链接前)的汇编代码是否相同?

我的意思是可执行文件之间的区别是链接器,写吗? 但我不是在谈论可执行文件......我在谈论链接之前的汇编代码。

如果两个汇编代码不同,那么它们为什么以及如何不同?

库是预编译的,所以我认为这可能是不同的(如果不是,请纠正我)。 但是如果我不使用库怎么办?

【问题讨论】:

  • 系统调用也会有所不同。如果它是一个不做任何 IO 的普通应用程序,您可能可以在两种架构上运行相同的二进制文件,但一旦超出普通情况,它就会失败。

标签: assembly compiler-construction linker cpu-architecture


【解决方案1】:

不同的操作系统使用不同的可执行文件格式。

它们还通过不同的 API 提供功能(fopen() 最终将在 32 位 Windows 上使用 int 0x2Esysenter 调用 CreateFileA(),在 32 位 Linux 上使用 int 0x80 调用 open())它以不同的方式在内部发挥作用。所以在你的程序的fopen() 中会有不同的代码用于 Windows 和 Linux。

不同的编译器可能使用不同的默认调用约定,或者同一个编译器可以对不同的目标操作系统使用不同的调用约定。即使在同一个编译器上,不同的优化和调试选项也会影响代码生成。

最后,即使您不使用任何库,即使其他一切都相同,不同的编译器也可以生成截然不同的代码(这通常是没有意义的事情)。这仅仅是因为它们没有使用完全相同的算法,也不是由同一个人编写的,也没有人要求所有编译器的行为都相同。

你的问题有什么意义呢?

【讨论】:

  • 我问了这个问题,因为我在搜索工具链时总是只找到基本的东西,而不是“一切”,最终我遇到了很多困惑!如果您知道有关 c++ 工具链的“一切”的任何资源,请发表评论!谢谢!!
  • 一切?我敢打赌,即使是编译器开发人员也不了解他们的编译器的一切。以错误为例。 :) 研究编译器/工具文档以获取详细信息。
  • 我所说的一切都是一个好的程序员应该知道的一切! :)
  • 从编程语言开始。了解语言标准。了解算法。与其他人一起从事真正的商业项目,以了解广泛的重要事物,包括技术含量较低的事物(例如沟通其他软技能)。知道如何测试和调试。从那里拿走。
【解决方案2】:

汇编代码将是相同的,只要您不必使用系统调用 - 这意味着您不能读取输入,也不能执行输出,甚至不能结束程序 - 什么都没有。

所以,除了一个完全无用的程序,它不能进行输入和输出,而且你必须手动终止,你不能创建一个二进制文件,它在多个操作系统上通过相同的代码,在任何地方都做同样的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2021-04-11
    相关资源
    最近更新 更多