Visual c++ GNU g++;内联装配块,如Apple g++/visualc&x2B+;?

Visual c++ GNU g++;内联装配块,如Apple g++/visualc&x2B+;?,visual-c++,gcc,assembly,g++,inline-assembly,Visual C++,Gcc,Assembly,G++,Inline Assembly,我目前正在大学学习一门课程,在这一阶段,我们将学习某些C/C++结构背后的汇编代码 工作流程通常是这样的:实验室助理简短地谈论一个主题,我们找出其中的怪癖,然后使用内联汇编解决一些完全随机的问题 (例如:他简要介绍了struct(成员)如何存储在内存中,我们找出了模式,然后使用内联汇编编写了一个简单问题的解决方案,在这个问题中,我们使用struct) 实验室助理(以及小组其他成员)正在使用Visual C++编译器和调试器(用于反汇编)进行演示,但出于道德原因,我无法使用它,因此我选择了g++和

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

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

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

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

<> p>与VisualC++相比,我觉得G++的内联汇编很难理解的是:

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

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

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

在整个搜索过程中,我发现苹果的代码g++< /c>与Visual C++具有相同的语法支持(-FASM块),但是GNU<代码> G++似乎不是这样。


希望我可能错过了一些东西,我在这里询问是否可以像GNU下的内联汇编块一样编译
Visual C++
g++
,您所指的语法不是Microsoft特有的。正如你所发现的,苹果也拥有它(尽管苹果放弃了GCC,转而使用了Clang)。另外,Metrowerks支持相同的语法。GCC不支持它(可能是因为GCC的人相信GCC是如此的好,以至于没有人再需要编写汇编:-)。但是,不需要一直键入
\n\t
,您可以将其替换为
。例如:

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

希望能有帮助。祝你好运

微软放弃了内联asm,并且在64位程序中不支持它,也许这不是一个好主意?这确实让它更清晰了一点,谢谢..但是它仍然有很多东西需要输入。如果没有其他方法,我可能会编写一个转换器。@MihaiBişog:是的。但内联汇编并不意味着用来编写成吨的汇编代码。这确实是一个很大的类型。您总是可以在汇编中编写代码,并使用友好的工具,如
nasm
,然后链接到该对象文件。这就是我要做的。