1

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

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

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

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

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

  • 如果我想编写内联汇编的“块”,我有两个选择: 有一个单一的asm("..")结构,其中每条指令前面都有一个\n\t(导致很多混乱)。或者将每条指令放在自己的asm("..")块中(导致大量输入)。

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

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

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

希望我可能错过了一些我在这里问的东西,是否可以Visual C++在 GNU 下编译像内联汇编块一样g++

4

1 回答 1

2

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

void foo()
{
    asm("xor %eax,%eax;"
        "rep; nop;"
        "nop;"
        "sfence;"
        "nop;");
}

希望能帮助到你。祝你好运!

于 2013-03-12T20:26:52.943 回答