2011-05-17 144 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