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++?

    下一篇: Understanding basic inline NEON assembly