【问题标题】:Embed compiled inline assembly back into C++ [closed]将已编译的内联程序集嵌入回 C++ [关闭]
【发布时间】:2016-10-26 02:05:32
【问题描述】:

假设我制作了一个 C++ 程序并编译了它。现在你有了它的汇编代码。 那么,如果我使用asm()中的汇编代码,会得到完全相同的结果吗? 如果是,我们可以用它做什么?

【问题讨论】:

  • 不会一样的。变量、过程和许多其他东西将被偏移量取代,代码可能会被优化等等。但你可以用它来改变流程或逻辑(就像病毒一样)。
  • 那么,有的有,有的没有?
  • 问题是 asm 不是重现程序所需的唯一东西。您还需要相同的部分、代码偏移量、链接...可能不包含在反汇编列表中。
  • 发生了什么?
  • 重新加载代码时,会处于不同的环境中,实际位置可能会有所不同。这意味着链接加载器将通过目标代码并为程序集跳转放置最终值。如果你重建代码,那么跳转目标(即跳转到while语句的末尾)可能会改变,如果你拉出的代码没有考虑到这一点,代码执行可能会变得不对齐,导致未定义的行为。汇编器和编译器通常会为我们处理这些问题。

标签: c++ assembly reverse-engineering disassembly


【解决方案1】:

大多数编译器通常都有一个选项可以生成完整的汇编列表,但是仅仅将生成的汇编代码插入 asm(" ") 是没有用的。

汇编列表的使用通常是为了理解编译器是如何工作的,以便用 C/C++ 编写代码,以便生成的汇编代码是 1.及时高效。 2. 节省内存。

在使用高级编译器优化的情况下,在时间或内存上,生成的代码通常是 3. 与原始 C/C++ 代码的逻辑略有不同 4. 可能包含错误。 完整列表有助于理解原始 C/C++ 代码与生成的汇编代码之间的联系。

  1. 在代码和数据的内存量有限的处理器中,在生成的程序集列表中查看内存代码和数据分配的大小可能很重要。
  2. 如果实现的算法(例如 FFT)通常要求对数据的地址进行某些对齐,那么查看这些对齐是否也得到满足可能很重要。

作为一个总结,汇编列表有助于在 C/C++ 中工作并保持(尽可能)在时间和内存方面的效率,在嵌入式环境中可能会受到限制。

汇编列表可以稍后被汇编以产生目标代码,这通常由编译器直接完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 2015-08-10
    • 2018-10-18
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多