C ++代码中的汇编代码

时间:2011-05-17 23:28:12

标签: c++ gcc assembly g++ inline-assembly

如何将英特尔asm代码放入我的c ++应用程序? 我正在使用Dev-C ++。

我想这样做:

int temp = 0;
int usernb = 3;

pusha
mov eax, temp
inc eax
xor usernb, usernb
mov eax, usernb
popa

这只是一个例子。 我怎么能这样做?

更新: 它在Visual Studio中的外观如何?

5 个答案:

答案 0 :(得分:4)

您可以在此处找到完整的指南http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

#include <stdlib.h>

int main()
{
     int temp = 0;
     int usernb = 3;

     __asm__ volatile (
          "pusha \n"
          "mov eax, %0 \n"
          "inc eax \n"
          "mov ecx, %1 \n"
          "xor ecx, %1 \n"
          "mov %1, ecx \n"
          "mov eax, %1 \n"
          "popa \n"
          : // no output
          : "m" (temp), "m" (usernb) ); // input
     exit(0);
}

之后你需要编译类似:

gcc -m32 -std=c99 -Wall -Wextra -masm=intel -o casm casmt.c && ./casm && echo $?
output:
0

您需要使用-masm = intel标志进行编译,因为您需要intel汇编语法:)

答案 1 :(得分:2)

这是一个显示GCC / Dev-C ++语法的简单示例:

int main(void)
{
    int x = 10, y;

    asm ("movl %1, %%eax;"
         "movl %%eax, %0;"
        :"=r"(y)    /* y is output operand */
        :"r"(x)     /* x is input operand */
        :"%eax");   /* %eax is clobbered register */
}

答案 2 :(得分:2)

这取决于你的编译器。但是从你的标签我猜你使用gcc / g ++然后就可以使用gcc inline assembler。但是语法非常奇怪,与intel语法略有不同,尽管它实现了相同的目标。

编辑:使用Visual Studio(或Visual C ++编译器),它会更容易,因为它使用通常的英特尔语法。

答案 3 :(得分:2)

  

更新:它在Visual Studio中的外观如何?

如果要构建64位,则无法在Visual Studio中使用内联汇编。如果要构建32位,则使用__asm进行嵌入。

通常,使用内联ASM是一个坏主意。

  1. 你可能会比编译器产生更糟糕的ASM。
  2. 在方法中使用任何ASM通常会使尝试触及该方法的任何优化失败(即内联)。
  3. 如果您需要访问C ++中不明显的处理器的特定功能(例如SIMD指令),那么您可以使用大多数编译器供应商提供的语言 intrinsics 更加一致。内在函数为您提供了所有“特殊”指令的速度,但其方式与语言语义兼容,并与优化器兼容。

答案 4 :(得分:1)

如果是某些练习,我建议使用一些真正的汇编程序,避免内联代码,因为它可能会变得混乱/混乱。

可以找到使用GCC的一些基础here

如果您愿意尝试使用MSVC(不确定是否需要GCC),我建议您查看MSVC的解释(在我看来)更容易阅读/理解,特别是对于学习汇编。可以找到一个示例here