GCC-无效使用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的建议,我决定告诉编译器不要删除临时文件。 这是由旗帜完成的:

– 保存 – 临时工

正如詹姆斯所说,汇编程序会生成一些很好的注释,这些注释可以准确地告知我们的C ++代码中的哪一行引发了错误。 就我而言,看起来它不接受这样的指示:

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

我不知道为什么他不再接受英特尔语法,因为它与以前的GCC版本一起使用,现在我更新了它不再了。

无论如何,这些问题的解决方案是詹姆斯提到的问题:不要删除中间文件,以便你可以直接监视汇编代码有什么问题。

关于INTEL语法的问题,任何想法为什么它不再起作用?