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++?的主要内容,如果未能解决你的问题,请参考以下文章