2015-10-23 68 views
3

William Hohl的ARM彙編語言手冊討論了嵌入式彙編語法。它的一個例子可在here上ARM參考手冊中找到:gcc是否支持嵌入式彙編語法?

#include <stdio.h> 
__asm void my_strcpy(const char *src, char *dst) 
{ 
loop 
     LDRB r2, [r0], #1 
     STRB r2, [r1], #1 
     CMP r2, #0 
     BNE loop 
     BX lr 
} 

當我谷歌的gcc嵌入式彙編「語法我只得到以下results。海灣合作委員會是否只支持所謂的「extended assembly syntax?」

asm [volatile] (AssemblerTemplate 
        : OutputOperands 
        [ : InputOperands 
        [ : Clobbers ] ]) 
+2

是的,gcc只支持你鏈接的樣式。它不支持其他風格。如果你想編寫像這樣的彙編代碼,直接寫彙編文件。 – fuz

+0

請不要鏈接,只複製你所指的內容,因爲鏈接可能在將來關閉 – Marged

+0

@FUZxxl,考慮我想在彙編中編寫一個FFT例程,並且我在C類型數組中獲得一個輸入。如何將這個數組傳遞給我的彙編程序在單獨的文件中? – user1343318

回答

1

GCC不支持嵌入式彙編功能,如在你的例子所示。你將不得不使用例如一個KEIL編譯器。

GCC支持的內聯彙編的兩種形式是「簡單」(這只是asm關鍵字後跟花括號的變體之一)和更加有用的「擴展」形式,它允許您以非常靈活和有效的方式將輸入和輸出變量映射到寄存器或寄存器類。你可以編寫幾乎與寄存器不可知的程序集,它可以工作,並充分利用編譯器的低級優化能力(它顯然不能進行高級優化,這會被要求太多!)。
不幸的是,語法起初有點......不直觀。

爲了獲得與嵌入式程序集my_strcpy函數相同的效果,您必須編寫一個包含擴展程序集塊的普通函數,並將該函數的參數映射到輸入(並且不要忘記砸memory )。

請注意,海灣合作委員會內聯大會有一些額外的怪癖可能會出人意料。首先,它使用AT & T表示法,然後必須明確地向每行添加\n以防止彙編程序抱怨(如果打算檢查中間文件並關心可讀輸出,則爲\n\t)。
第一個怪癖(AT & T符號)實際上是一個好處,因爲它比英特爾符號更直觀,您只需要首先了解它。另一方面,明確添加轉義換行符的需要是...... bleh。幸運的是,你並不需要經常使用程序集(如果有的話)。