繁体   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