【问题标题】:Assembler code in C++ codeC++ 代码中的汇编代码
【发布时间】:2011-08-27 15:43:19
【问题描述】:

如何将英特尔 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 中的外观如何?

【问题讨论】:

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


【解决方案1】:

您可以在这里找到完整的操作指南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 汇编语法:)

【讨论】:

  • 有没有一种方法可以在 microsoft visual studio c++ 编译器上运行?
【解决方案2】:

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

如果您正在构建 64 位,则不能在 Visual Studio 中使用内联汇编。如果您正在构建 32 位,则使用 __asm 进行嵌入。

一般来说,使用内联 ASM 是个坏主意。

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

【讨论】:

  • 这个答案在技术上是正确的,但不是特别有用。
【解决方案3】:

这里有一个简单的例子来展示 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 */
}

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • gccg++ 也可以编译 intel 语法 asm 你需要添加标志 -masm=intel :)
    • 哇,现在我不知道。使 gcc 内联汇编器对我更有用,因为我是这种丑陋的 gcc 语法的真正敌人(即使它可能更强大)。但实际上我还是尽量避免使用 asm,因为内在函数在大多数情况下就足够了(例如 SSE)。
    • 呵呵是的,我也不太喜欢 AT&T ;)
    【解决方案5】:

    如果是为了一些练习,我会推荐一些真正的汇编器,避免内联代码,因为它会变得相当混乱/混乱。

    可以在here找到一些使用 GCC 的基础知识。

    如果您愿意尝试 MSVC(不确定是否需要 GCC),我建议您看一下 MSVC 的解释,这(在我看来)更容易阅读/理解,尤其是对于学习汇编程序。一个例子可以在here找到。

    【讨论】:

      猜你喜欢
      • 2018-05-07
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 2012-03-04
      • 2011-06-14
      • 2023-04-10
      • 2015-04-26
      • 1970-01-01
      相关资源
      最近更新 更多