GCC-寄存器的使用无效
GCC- Invalid use of Register
我正在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语法的问题,你知道为什么它不再工作了吗?
- 本质:使用__128寄存器
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 使用英特尔 PIN 修改寄存器
- AVX 指令中寄存器和指针之间的客观差异
- 如何确定我的处理器有多少个 AVX 寄存器?
- 除非使用某些寄存器,否则函数挂钩会崩溃
- 寄存器上的管道计算
- 其中关于内存和寄存器的左值和右值
- 有没有办法强制C++编译器将变量存储在寄存器中?
- "变量":函数中函数作用域不允许初始化的自动或寄存器变量'naked'
- Atmel Studio:返回一个包含数组的寄存器
- 使用 googletest 测试嵌入式C++代码时处理外设寄存器的重复符号
- 移位寄存器74HC595输出电流
- 超过255的Modbus寄存器无法访问SimpleModbus
- 如何在程序集函数中将元素数组作为参数传递时转发 ARM 寄存器的地址指针
- xmm 寄存器中的__m128何时?
- 是否可以在 GCC 中使用带有 C++17 的显式寄存器变量?
- 处理器寄存器的大小是多少,有多少个处理器寄存器?
- GCC-寄存器的使用无效