【问题标题】:Easy way to convert c code to x86 assembly?将c代码转换为x86程序集的简单方法?
【发布时间】:2011-02-12 03:39:36
【问题描述】:

是否有一种简单的方法(如免费程序)可以将 c/c++ 代码转换为 x86 程序集?

我知道任何 c 编译器都做了非常相似的事情,我可以只编译 c 代码,然后反汇编编译后的可执行文件,但这有点矫枉过正,我只想转换几行代码。

有没有人知道一些可以做到这一点的程序?

编辑:我知道 GCC 编译器会这样做,但它是 AT&T 语法,我正在寻找 Intel 语法(不确定它是否称为 intel 语法)。 AT&T 语法对我来说有点像胡言乱语,有些命令以相反的顺序使用操作数,而不是我习惯的方式,这会让人非常困惑。

【问题讨论】:

  • 编译器正是这样做的。您的编译器将附带一个选项来显示汇编器输出。也许您可以考虑阅读它的手册?我知道这是周末,但真的....
  • 周末已经结束了 :-)

标签: c compiler-construction programming-languages assembly x86


【解决方案1】:

您的编译器已经按照您所说的那样执行此操作,并且很可能会在汇编之前选择停止。

对于 GCC,添加 -S 标志。

gcc -S x.c
cat x.s

编辑:如果你的程序很短,你可以使用https://gcc.godbolt.org/的在线服务。

【讨论】:

    【解决方案2】:

    通知 每个架构都有自己独特的名称,甚至构建方式不同 现在,当您知道使用 asm volatile 所涉及的堆栈时 将是完美的解决方案

    【讨论】:

      【解决方案3】:

      在 VC++ 中,可以使用以下命令列出汇编代码。

      cl /FAs a.c

      【讨论】:

        【解决方案4】:

        GCC 可以使用以下命令行输出 Intel 语法汇编:

        gcc -S input.c -o output.asm -masm=intel
        

        【讨论】:

          【解决方案5】:

          正如许多人指出的那样,大多数编译器都会这样做。如果您不喜欢语法,使用 awk 或 sed 进行一些工作应该可以翻译。或者,如果没有一个程序可以为你做这件事,我会感到惊讶。

          【讨论】:

            【解决方案6】:

            lcc 编译器是一个多平台交叉编译器。您可以通过

            来生成英特尔语法汇编代码
            lcc -S -Wf-target=x86/win32 foo.c
            

            我发现来自lcc 的汇编代码比现在gcc 吐出的汇编代码更容易阅读。

            【讨论】:

              【解决方案7】:

              如果您使用 gcc 作为编译器,您可以使用 -S 选项进行编译以生成汇编代码。见http://www.delorie.com/djgpp/v2faq/faq8_20.html

              【讨论】:

                【解决方案8】:

                如果你在命令行中传递-S 选项,gcc 将生成程序集。

                Microsoft Visual C++ 将使用 /FAs 选项执行相同的操作。

                【讨论】:

                • ms visual c++也是用at&t语法还是Intel语法?
                • @Bob:VC++ 发出漂亮的 Intel 语法程序集。
                • @Bob:你也许还可以让 gcc 生成 Intel 语法程序集:stackoverflow.com/questions/199966/…
                【解决方案9】:

                Gcc 可以用 -S 开关做到这一点,但它的 at&t 语法会丑陋得令人作呕。

                【讨论】:

                • 但是你可以添加-masm=intel开关
                • 在 Mac OS X 上使用 clang -S -mllvm --x86-asm-syntax=intel
                猜你喜欢
                • 2018-03-30
                • 1970-01-01
                • 1970-01-01
                • 2014-08-07
                • 2017-06-22
                • 1970-01-01
                • 1970-01-01
                • 2013-02-17
                • 1970-01-01
                相关资源
                最近更新 更多