2012-05-23 49 views
0

我試圖使用GCC的擴展彙編語法嵌入以下彙編指令(臂狀結構):此GCC內聯彙編中的參數列表有什麼問題?

__asm__("lsr %[xj], %[xj], %[xn]" : 
      [xj] "=r" (j) : 
      [xi] "[xj]" (j) , [xn] "[xn]" (n)); // j = j >> n 

ijn被聲明爲整數int i, j, n;

(注意, j充當既和出參數)

編譯器生成的ERR或:

../src/fft2dlib.c:55:5: error: matching constraint references invalid operand number 
../src/fft2dlib.c:53:3: error: matching constraint references invalid operand number 

其中行53和55是上述asm代碼的第一行和第三行。

當我用匯編指令明確常數代替n輸入參數,它編譯罰款:

__asm__("lsr %[xj], %[xj], 27" : 
      [xj] "=r" (j) : 
      [xi] "[xj]" (j)); // j = j >> 27 

我從GCC manual下面的例子,但我不能找出問題。

回答

3

該約束"[xn]"[xn] "[xn]" (n)沒有任何意義。使用參數名稱或數字作爲約束意味着「將該操作數放在與指定操作數相同的位置」。因此,在這種情況下,您告訴GCC將[xn]放在與[xn]相同的位置,這是沒有意義的,實際上並不提供有關操作數類型的信息。

您需要使用其他約束類型,例如"r"作爲寄存器操作數,具體取決於彙編指令允許的內容。

+0

我覺得它釘。 – hirschhornsalz

+0

謝謝。所以,如果我正確地理解了這一點,第二個參數('xi')的''[xj]''只編譯b/c'[xj]'被定義爲'「= r」'?這就說得通了。但是,如果你看看我鏈接到的手冊頁,就有一個例子(在「GCC版本3.1以前」的文本中),其中'old'變量被分配了約束'「[result]」w/o這由之前的類型定義。這個怎麼用? – ysap

+0

從GCC版本3.1開始,可以寫[姓名]而不是匹配約束的操作數。例如: 'asm(「cmoveq%1,%2,%[result]」 :[result]「= r」(result) :「r」(test),「r」(new) [結果]「(舊));' – ysap