GNU g++ 内联汇编块,如 Apple g++/Visual C++?

Posted

技术标签:

【中文标题】GNU g++ 内联汇编块,如 Apple g++/Visual C++?【英文标题】:GNU g++ inline assembly block like Apple g++/Visual C++? 【发布时间】:2013-03-12 20:06:18 【问题描述】:

我目前正在我的大学学习一门课程,在这个阶段,我们学习了某些 C/C++ 结构背后的汇编代码。

工作流程通常是这样的:实验室助理简短地谈论一个话题,我们找出其中的怪癖,然后使用内联汇编解决一些完全随机的问题。

(例如:他简要介绍了struct(成员)是如何存储在内存中的,我们找出了模式,然后我们使用内联汇编编写了一个简单问题的解决方案,其中我们使用了struct。 )

实验室助理(以及小组的其他成员)正在使用Visual C++ 编译器和调试器(用于反汇编)进行演示,但是由于道德原因我不能使用它,因此我选择了g++gdb.

与 Visual C++ 相比,我对 g++ 的内联汇编感到尴尬的是:

1234563或者将每条指令放在自己的 asm("..") 块中(导致大量输入)。

如果我想在内联程序集中引用局部变量,我必须使用扩展语法或通过使用 esp/ebp 的偏移量来引用它。

关于上述两个问题,我更喜欢 Visual C++ 的内联汇编风格,在这种风格中,为了编写一个 asm 块,我所要做的就是 __asm .. 并将每条指令写在一个新行上,以便引用一个变量我只需要写下它的名字。

在我的搜索过程中,我发现 Apple 的 g++ 支持与带有开关 (-fasm-blocks) 的 Visual C++ 相同的语法,但 GNU g++ 似乎并非如此。

希望我可能遗漏了一些我在此询问的内容,是否可以像在 GNU g++ 下编译 Visual C++ 这样的内联汇编块。

【问题讨论】:

微软放弃了内联汇编,在 64 位程序中不支持它,也许这不是一个好主意? 【参考方案1】:

您所指的语法不是 Microsoft 特定的。正如您所发现的,Apple 也拥有它(尽管 Apple 放弃了 GCC 并转而使用 Clang)。 AFAIK,Metrowerks 支持相同的语法。 GCC 不支持它(可能是因为 GCC 人认为 GCC 非常好,以至于没有人需要再编写程序集了 :-))。但是,不需要一直键入\n\t,您可以将其替换为;。例如:

void foo()

    asm("xor %eax,%eax;"
        "rep; nop;"
        "nop;"
        "sfence;"
        "nop;");

希望对您有所帮助。祝你好运!

【讨论】:

这确实使它更清晰了,谢谢..但是仍然需要输入很多内容。如果没有其他办法,我可能会写一个转换器。 @MihaiBişog:是的。但是内联汇编并不是用来编写大量的汇编代码的。这确实可以打字很多。您总是可以只编写汇编代码并使用像nasm 这样的友好工具,然后链接到该目标文件。这就是我会做的。

以上是关于GNU g++ 内联汇编块,如 Apple g++/Visual C++?的主要内容,如果未能解决你的问题,请参考以下文章

简单 g++ 内联汇编程序中的错误

SSE 内联汇编和可能的 g++ 优化错误

GNU ARM 汇编指令

gnu 内联汇编错误

如何在 gnu pascal 中编写内联汇编?

试图从 g++ 中理解简单的反汇编代码