簡體   English   中英

在GNU中使用C ++代碼中的C頭。 錯誤包括內聯匯編:'asm'中不可能的約束

[英]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也稱為swiARM / 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,也許你會被這種情況所困擾。 奇怪的是, gccg++ (相同的版本?)處理代碼的方式不同,它可能只是一個編譯器錯誤,但我認為只有在所有其他解釋都用盡之后。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM