GNU g ++内联汇编块,如Apple g ++ / Visual C ++?
我目前正在我的大学学习一门课程,在这个阶段,我们学习了某些C / C ++结构背后的汇编代码。
工作流程通常是这样的:实验室助理简要地谈论一个话题,我们找出怪癖,然后使用内联汇编来解决一些完全随机的问题。
(例如:他简要地谈论了struct
(成员)如何存储在内存中,我们找出了模式,然后使用内联汇编将解决方案写入一个简单问题,我们使用一个struct
。)
实验室助理(以及团队的其他成员)为他的演示使用Visual C++
编译器和调试器(用于反汇编),但由于道德原因我无法使用它,因此我选择了g++
和gdb
。
与Visual C ++相比,我觉得g ++的内联汇编有一个尴尬的事实是:
如果我想写一个内联程序集的“块”,我有两个选择:有一个单一的asm("..")
构造,其中每条指令前面都有一个nt
(导致很多混乱)。 或者让每条指令都有自己的asm("..")
块(导致大量输入)。
如果我想引用内联程序集中的局部变量,我必须使用扩展语法或通过使用esp
/ ebp
偏移量来引用它。
关于上述两个问题,我更喜欢Visual C ++的内联汇编样式,其中为了编写一个汇编代码块,我所要做的就是__asm { .. }
并将每条指令写入一个新行,并且为了引用一个变量我只需要写下它的名字。
在我搜索的过程中,我发现Apple的g++
支持与使用开关的Visual C ++相同的语法(-fasm-blocks),但是这似乎不适用于GNU g++
。
希望我可能错过了一些我在这里问的问题,如果可以在GNU g++
下编译Visual C++
就像内联汇编块一样。
您提到的语法不是Microsoft特定的。 正如你所发现的,苹果也有它(尽管Apple放弃了GCC并转而使用Clang)。 AFAIK,Metrowerks支持相同的语法。 海湾合作委员会不支持它(可能是因为海湾合作委员会的人认为海湾合作委员会是如此之好,以至于没有人需要再编写汇编:-))。 但是,无需一直输入nt
,您可以将其替换为;
。 例如:
void foo()
{
asm("xor %eax,%eax;"
"rep; nop;"
"nop;"
"sfence;"
"nop;");
}
希望能帮助到你。 祝你好运!
链接地址: http://www.djcxy.com/p/59747.html上一篇: GNU g++ inline assembly block like Apple g++/Visual C++?