GCC-寄存器的使用无效

GCC- Invalid use of Register

本文关键字:无效 寄存器 GCC-      更新时间:2023-10-16

我正在VS2012和GCC(CodeBlocks(下为Windows编译一个项目。在VS2012上,一切都很完美。根据GCC,我获得以下编译错误:

C:UsersPiotrekAppDataLocalTempccfdl0Ye.s|164|Error: invalid use of register|
C:UsersPiotrekAppDataLocalTempccfdl0Ye.s|166|Error: invalid use of register|
C:UsersPiotrekAppDataLocalTempccfdl0Ye.s|221|Error: invalid use of register|
||=== Build finished: 3 errors, 14 warnings (0 minutes, 0 seconds) ===|

我正在使用编译器选项-fpermission-它应该与错误无关。

我只是不明白为什么它指向本地临时文件夹下的一个临时文件,并说我使用了错误的寄存器??

有人知道发生了什么事吗?

看起来您在编译器中遇到了一个错误。这个错误消息(根据"源"文件名判断(来自汇编程序。汇编程序唯一应该生成错误消息是当汇编程序,并且C++编译器应该永远不要生成非法汇编程序;如果它不能生成合法的汇编程序,它应该输出错误消息并失败。

当你收到这种信息时,真正的问题是找出代码中触发它的原因。g++有一个选项,告诉它不删除任何中间文件。使用此,然后尝试查看请在这些行中对文件进行聚合。(当你要求g++输出时汇编程序中,它会添加漂亮的注释来帮助查找相应的来源。我不知道当生成汇编程序作为中间文件。(然后尝试剪切代码(如果情况越来越糟,使用二进制搜索(直到你能得到一个一两行程序的错误。试着猜测他们有什么特别之处,并改变他们的做法同样的事情,以不同的方式。

并且不要不向g++报告错误。

感谢James Kanze的推荐,我决定告诉编译器不要删除临时文件。这是由标志完成的:

-保存时间

正如James所说,汇编程序生成了一些不错的注释,这些注释准确地告知C++代码中的哪一行抛出了错误。就我而言,它似乎不接受这样的指令:

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

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

无论如何,解决这些问题的方法就是James提到的:不要删除中间文件,这样你就可以直接窥探汇编代码的错误。

关于INTEL语法的问题,你知道为什么它不再工作了吗?