簡體   English   中英

GCC-無效使用Register

[英]GCC- Invalid use of Register

我正在為VS2012編譯一個項目,為Windows編譯GCC(CodeBlocks)。 在VS2012上一切都很完美。 在GCC下我得到以下編譯錯誤:

C:\Users\Piotrek\AppData\Local\Temp\ccfdl0Ye.s|164|Error: invalid use of register|
C:\Users\Piotrek\AppData\Local\Temp\ccfdl0Ye.s|166|Error: invalid use of register|
C:\Users\Piotrek\AppData\Local\Temp\ccfdl0Ye.s|221|Error: invalid use of register|
||=== Build finished: 3 errors, 14 warnings (0 minutes, 0 seconds) ===|

我正在使用編譯器選項-fpermissive - 它應該與錯誤無關。

我只是無法理解為什么它指向Local Temp文件夾下的臨時文件,並說我使用了錯誤的寄存器?

有沒有人知道發生了什么?

看起來您在編譯器中遇到了一個錯誤。 錯誤消息(從“源”文件名判斷)來自匯編程序。 匯編程序生成錯誤消息的唯一時間是匯編程序中存在非法內容,並且C ++編譯器永遠不應生成非法匯編程序; 如果它不能生成合法的匯編程序,它應該輸出錯誤信息並失敗。

當您收到此類消息時,真正的問題是要弄清楚代碼中觸發它的內容。 g ++有一個選項,告訴它不要刪除任何中間文件。 使用它,然后嘗試查看這些行的assember文件中發生了什么。 (當你要求g ++輸出匯編程序時,它會提供很好的注釋以幫助查找相應的源。我不知道在將匯編程序生成為中間文件時是否也會這樣做。)然后嘗試切割代碼(如果更糟的是更糟糕的是,使用二進制搜索)直到你可以得到一行或兩行程序的錯誤。 試着猜出它們的特殊之處,並以不同的方式改變它們以做同樣的事情。

並且不要將錯誤報告給g ++。

感謝James Kanze的建議,我決定告訴編譯器不要刪除臨時文件。 這是由旗幟完成的:

- 保存 - 臨時工

正如James所說,匯編程序會生成一些很好的注釋,這些注釋可以准確地告知我們的C ++代碼中的哪一行引發了錯誤。 就我而言,看起來它不接受這樣的指示:

asm
(
    ".intel_syntax noprefix\n"
    "lock dec [DWORD PTR eax]\n"
    ".att_syntax \n"
    :
    : "a" (data)
    :
);

我不知道他為什么不再接受英特爾語法,因為它正在使用以前的GCC版本,現在我更新了它不再了。

無論如何,這些問題的解決方案是詹姆斯提到的問題:只是不要刪除中間文件,以便你可以直接監視匯編代碼有什么問題。

關於INTEL語法的問題,任何想法為什么它不再起作用?

暫無
暫無

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

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