[英]Using C headers in C++ code in GNU. Error including inline assembly: impossible constraint in 'asm'
我有一個奇怪的。 我正在使用供應商頭文件在嵌入式系統上工作。 我正在使用GCC 4.6.3編譯文件。 我想將C ++用於我的代碼,我有錯誤,我無法弄清楚。 我正在運行一個供應商示例程序,我所做的就是將main.c文件的名稱更改為main.cpp。 因此,我認為,頭文件正由C ++編譯器解釋。 其中一個包含以下行:
__attribute__((naked)) static return_type signature \
{ \
__asm( \
"svc %0\n" \
"bx r14" : : "I" (number) : "r0" \
); \
}
如果文件的名稱是main.c,則文件編譯正確,我認為這是因為C編譯器正在處理該文件。 如果我使用C ++,我得到的錯誤是
error: impossible constraint in 'asm'
但同樣,我對C編譯器沒有任何問題。 我需要在C ++文件中調用使用此定義的函數。 我已經考慮過編寫保留在c端並鏈接到它們的包裝函數,但這將是一個真正的痛苦,而且效率較低。 有什么建議?
svc
也稱為swi
是ARM / Thumb 軟件中斷指令。 它只需要常量,但它們與其他寄存器常量不同。 即, mov r0, #4096
。 如果要指定立即數,則需要使用預處理程序和標記粘貼。 number
不能是變量或寄存器 。
#define syscall(number) __attribute__((naked)) static return_type signature \
{ \
__asm( \
"svc " #number "\n" \
"bx r14" : : : "r0" \
); \
}
將工作。 注意: #
是'C'預處理器stringify。 另請注意,查看SVC
編號是有效的,因為它在I-CACHE
並且檢查需要D-CACHE
。 通常它總是constant
, 函數號在寄存器中傳遞,以便更快地進行系統調用。
gcc手冊說,
'I' - 在數據處理指令中作為立即操作數有效的整數。 也就是說,0到255范圍內的整數旋轉2的倍數
這是典型的數據處理操作數 - 立即 ,ARM ARM的A5.1.3節。 SVC
操作數在拇指模式下固定為8位,在ARM模式下固定為24位。 可能還有一些我不知道的其他約束,但至少只要數值常量傳遞給宏,預處理器的字符串化就會起作用。
我想幸運的是,這可以從gcc
和不幸的g++
沒有。 您可以使用-S
並使用這兩種工具查看(和發布)輸出,從而獲得進一步的洞察力。
編輯:您的代碼似乎與gcc-4.7.2
,但在我的情況下, number
是本地的const int
,使用number
可能是個問題。 也許它從'C'到'C ++'有一個微妙的語義變化。
檢查GCC手冊 (內聯匯編程序),了解機器約束的確切含義。 較舊的GCC版本在檢查約束方面一直都很邋of,也許你會被這種情況所困擾。 奇怪的是, gcc
和g++
(相同的版本?)處理代碼的方式不同,它可能只是一個編譯器錯誤,但我認為只有在所有其他解釋都用盡之后。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.