C++代码中的汇编代码

3

我该如何将Intel汇编代码嵌入到我的C++应用程序中? 我正在使用Dev-C++。

我想要做类似于以下的事情:

int temp = 0;
int usernb = 3;

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

这只是一个例子。 那我该如何做类似的事情呢?

更新: 在Visual Studio中该怎么做呢?


DevC++ 不是一个编译器。它附带了一个极其古老和极其糟糕的 MinGW 3.x 版本。你应该自己获取最新的 MinGW 构建并手动使用。请注意,任何嵌入汇编都将是特定于编译器的。(而且推荐你真的不要这样做,因为编译器生成的 ASM 比大多数人现在生成的更好) - Billy ONeal
@Sehe:我相信那就是我说的。 :) - Billy ONeal
@Billy:这只证明我们都认为有需要指出的地方。记录一下,SO网页界面在这方面是非常容易出现竞态条件的 :) - sehe
5个回答

5

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

以上内容涉及IT技术,提供一个完整的操作指南链接。请点击链接获取更多相关信息。
#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标志进行编译,因为您想要英特尔汇编语法 :)


有没有一种编写方式,也适用于Microsoft Visual Studio C++编译器? - WiSaGaN

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
这取决于你的编译器。但从你的标签来看,我猜你使用的是gcc/g++编译器,那么你可以使用gcc内联汇编。但语法非常奇怪,与英特尔语法有些不同,尽管它实现了相同的功能。
编辑:如果使用Visual Studio(或Visual C++编译器),则会变得更容易,因为它使用通常的英特尔语法。

1
gccg++ 也可以编译 Intel 语法汇编,你只需要添加 -masm=intel 标志即可 :) - DipSwitch
哇,现在我不知道这个。对我来说,这使得gcc内联汇编更加可用,因为我真的很讨厌这个丑陋的gcc语法(即使它可能更强大)。但实际上,我尽量避免使用汇编,因为内部函数大多数时候已经足够了(例如SSE)。 - Christian Rau
嘿嘿,我也不太喜欢AT&T ;) - DipSwitch

2
更新:在 Visual Studio 中看起来怎么样?
如果您正在构建 64 位,您不能在 Visual Studio 中使用内联汇编。如果您正在构建 32 位,则可以使用 __asm 进行嵌入。
通常,使用内联汇编是一个坏主意。
  1. 您可能会产生比编译器更糟糕的汇编代码。
  2. 在方法中使用任何汇编代码通常会破坏尝试操作该方法的任何优化(即内联)。
  3. 如果您需要访问 C++ 中不明显的处理器特定功能(例如 SIMD 指令),则可以使用大多数编译器供应商提供的 内置函数,这样可以以与语言语义和优化器兼容的方式获得所有"特殊"指令的速度。

1
这个答案在技术上是正确的,但并不特别有帮助。 - Mateen Ulhaq

1

如果是为了一些练习,我建议使用一些真正的汇编语言,避免使用内联代码,因为它可能会变得非常混乱/令人困惑。

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

如果您愿意尝试MSVC(不确定是否需要GCC),我建议您查看MSVC的解释,这在我的看法中更容易阅读/理解,特别是学习汇编语言。一个例子可以在这里找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接