2011-05-17 136 views
3

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

我想做某事这样的:

int temp = 0; 
int usernb = 3; 

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

这是唯一的例子。 我该怎么办?

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

+0

DevC++不是编译器。它附带一个**非常老的**和**非常差的MinGW 3.x副本。你可能应该得到一个最近的MinGW编译并手动使用它。请注意,任何嵌入式asm都将是编译器特定的。 (而且建议你真的不这样做,因为编译器生产的ASM比现在大多数人生产的更好)# – 2011-05-17 23:35:46

+2

@Everyone:[''Bloodshed Dev-C++是一个全功能的C/C++编程语言集成开发环境(IDE) 。它使用GCC(GNU编译器集合)的Mingw端口作为它的编译器。 Dev-C++也可以与Cygwin或任何其他基于GCC的编译器结合使用。](http://www.bloodshed.net/devcpp.html) – sehe 2011-05-17 23:37:16

+0

@Sehe:我相信这就是我所说的。 :) – 2011-05-17 23:43:43

回答

2

更新:它在Visual Studio中看起来如何?

如果您正在构建64位,则无法在Visual Studio中使用内联汇编。如果您正在构建32位,那么您使用__asm来执行嵌入。

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

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

这里有一个简单的例子,以示对GCC /开发-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 inline assembler。但是它的语法很奇怪,与intel的语法有些不同,尽管它达到了相同的效果。

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

+1

'gcc'和'g ++'也可以编译intel语法asm你需要添加标志'-masm = intel' :) – DipSwitch 2011-05-17 23:52:40

+0

哇,现在我不知道。使gcc内联汇编程序对我更有用,因为我是这种丑陋gcc语法的真正敌人(即使它可能更强大)。但实际上,我尽量避免使用asm,因为内在函数是最充分的(例如SSE)。 – 2011-05-17 23:56:55

+0

hehe是啊,我不太喜欢AT&T;) – DipSwitch 2011-05-18 00:00:33

1

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

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

如果你打算尝试MSVC(不确定是否需要GCC),我建议你看一下MSVC的解释(在我看来)很容易阅读/理解,尤其是对于学习汇编程序。一个例子可以发现here

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); 
} 

之后,一个完整的HOWTO,你需要的东西,如编译:

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

需要,因为要与-masm =英特尔标志编译英特尔汇编语法:)

+0

有没有一种写作方法可以在微软的visual studio C++编译器上运行? – WiSaGaN 2013-11-06 08:42:48