2013-02-27 499 views
0

我正在轉換MS的簡單彙編代碼與gcc一起使用,我嘗試轉換的MS彙編就在下面。我有兩個int變量,number_return使用內聯彙編與GCC

mov eax, number 
neg eax 
return, eax 

和,我已經試過這樣:

asm("movl %eax, %0" :: "g" (number)); 
asm("neg %eax"); 
asm("movl %0, %%eax" : "=g" (return)); 

但是,編譯器給了我這個錯誤:

main.c:17:9: error: invalid 'asm': operand number missing after %-letter

在哪裏錯誤,以及,我如何解決這個錯誤? 謝謝

回答

3

你不能這樣做,因爲你覆蓋寄存器而不告訴編譯器。此外,%是一個特殊字符,與printf類似。

將所有指令放在一個asm中,否則編譯器可能在之間做一些意想不到的事情也更好。

試試這個:

asm("movl %%eax, %1\n\t" 
    "neg %%eax\n\t" 
    "movl %0, %%eax" : "=g" (_return) : "g" (number) : "eax"); 

有可能是一個更好的辦法,但:

asm("neg %0\n\t": "=a" (_return) : "a" (number)); 

我不知道爲什麼你不能只是做(在C):

_return = -number; 
+0

看到生成彙編,我看到:...「MOV \t DWORD PTR [ESP + 24],0。 ..「%eax,ebx」...「」neg%eax「」movl ebx,%eax「(該變量是錯誤的:() – Alexandre 2013-02-27 14:02:23

+0

我現在測試了這些。兩者都有效。 – ams 2013-02-27 14:07:15

+0

我只是研究:) – Alexandre 2013-02-27 14:08:51

3

嘗試類似:

#include <stdio.h> 
#include <stdlib.h> 
int main(int ac,char**av) 
{ 
    int n=ac>1?atoi(av[1]):42; 
    asm ("movl %0, %%eax \n\t" 
     "neg %%eax \n\t" 
     "movl %%eax, %0 \n\t" : "+r" (n)::"eax"); 
    printf("%d\n",n); 
}  

的問題是:

  • 操作數的順序是instr src,dst
  • %%代替%
  • 彙編沒有孤立線 - 輸入/輸出/撞列表被關聯到所有彙編程序的方框
  • 「+ R」爲具有可以作爲兩個輸入輸出&
  • 我懷疑甚至MS允許使用關鍵字的參數「迴歸」 這樣

,並使其更加有效:

asm("neg %0" : "+r" (n) ::); // works as well 
+0

好的,但我怎麼能把(eax)放在_return變量上? – Alexandre 2013-02-27 14:03:38

+0

你是在正確的軌道上 - 我只是無法弄清楚問題中的所有重要規範:它是'asm(「mov%1,%0 \ n \ t neg%0 \ n \ t」: 「= r」(_return_value):「r」(input):);'如果你稍後'返回_return_value',gcc很可能會將'eax'指定爲寄存器'%0'。 – 2013-02-27 14:19:15