Kev*_*her 7 c++ opengl visual-studio-2015
错误ANOMALY: meaningless REX prefix used是什么意思?我用google搜索,我得到的所有信息都是完全随机的,它与java或avg或minecraft有关(因为java).
但是,在我合并了我的c ++ opengl 4.0图形引擎的几个分支之后,我在Visual Studio控制台应用程序的控制台输出中出现了这个错误,它突然弹出.我可能已经在我写的时间点之间更新了AMD图形驱动程序,所以这可能是一个来源.弹出错误后,深度缓冲测试也突然被禁用.
在visual studio中使用clean和rebuild之后,错误现在消失了,因此我不需要帮助修复错误,但我想知道它的含义以及通常会导致此错误的原因.这让我很好奇,因为我没有找到任何有用的搜索此错误.
米里亚在评论中说道:
\n\n它指的是在不需要时使用 REX 前缀字节的 x86-64 汇编指令\n\n
为了扩展这一点,在一些不同的场景中 REX 前缀会被忽略。
\n\n如果ModR/M字段指定其他寄存器或扩展操作码。
如果指令中使用了超过 1 个 REX 前缀(尽管我在osdev.org上读到,这是未定义的
如果不遵循一般格式。例如,REX 前缀必须位于操作码或转义操作码字节之前,除非与强制前缀结合使用。在这种情况下,REX 可以位于操作码/转义字节之后。
如果您尝试在 64 位模式下使用单字节形式的 INC/DEC。
看起来这条异常消息显示在从 git 到Java相关程序(也许是您引用的程序)的各种上下文中,其中新的驱动程序似乎是问题所在。罪魁祸首:Raptr,它随 AMD 的 Radeon 驱动程序一起提供。在 Java 帖子中,有人报告使用 SAPPHIRE Radeon HD 5850,在我将链接到您的下一个网站上,一个人使用 AMD R9 390,另一个人使用 380。在这种情况下,有人在他们的 64- 控制台上看到了这条消息位Win7系统。现在这个人的网站带我了解了 Raptr 使用的一个名为mhook的钩子(它连接到 opengl32.dll) ,我开始挖掘这个“Windows API 钩子库”,并发现它从第 1230 行开始:
\n\nassert(X86Instruction->AddressSize >= 4);\n if (X86Instruction->rex.w)\n {\n X86Instruction->OperandSize = 8;\n X86Instruction->HasOperandSizePrefix = FALSE;\n }\n else if (X86Instruction->HasOperandSizePrefix)\n {\n assert(X86Instruction->OperandSize == 2);\n }\n else if (X86Instruction->rex_b == REX_PREFIX_START)\n {\n if (!Instruction->AnomalyOccurred)\n {\n if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: meaningless REX prefix used\\n", VIRTUAL_ADDRESS);\n Instruction->AnomalyOccurred = TRUE;\n }\n X86Instruction->rex_b = 0;\n }\nRun Code Online (Sandbox Code Playgroud)\n\n所以你已经知道了,你处于所有正确的位置。mhook 库甚至有一长串需要忽略的 Visual Studio 文件。
\n附加说明*\n我从 os2museum 找到了这条评论网站上的这条评论是解开整个谜团的好线索
\nWindows amd64 ABI 要求函数的第一个操作码长度至少为 2 个字节。(我认为这样函数就可以热修补。)很多时候第一条指令是 \xe2\x80\x9cpush \xe2\x80\x9d 但该指令具有 1 字节编码!为了符合 ABI,指令中添加了 rex 前缀,使其长度为 2 个字节 \xe2\x80\x94 \xe2\x80\x9crex Push rbp\xe2\x80\x9d 或 \xe2\x80\x9crex Push rbx\xe2 \x80\x9d 或其他。编译器会为您完成此操作,但如果您在汇编程序中编写函数,则需要记住该规则。\n\n
这个特定的钩子库中的其他有趣的错误消息(只是其中的几个!)包括
\n\nANOMALY: Meaningless segment override
ANOMALY: REX prefix before legacy prefix 0x%02X\\n
ANOMALY: Conflicting prefix\\n
ANOMALY: Reached maximum prefix count %d\\n
和我最喜欢的:
\n\nANOMALY: branch into the middle of an instruction\\n
正因为我无法控制自己,所以值得注意的是这些默认为 64 位操作数的指令:
\n\n\n\n+--------------+------------+------------+\n| 呼叫(近)| 输入 | Jcc |\n+--------------+------------+------------+\n| JrCXZ | JMP(近)| 离开 |\n+-------------+------------+------------+\n| LGDT | LIDT| LLDT |\n+------------+------------+------------+\n| 循环| 循环cc | LTR |\n+--------------+------------+------------+\n| MOV CR(n)| MOV DR(n) | MOV DR(n) | MOV DR(n) | POP reg/mem |\n+-------------+------------+------------+\ n| POP 注册 | POP FS | POP GS |\n+--------------+------------+------------+\n| POPFQ | 推imm8 | PUSH imm32 |\n+--------------+------------+------------+\n| PUSH 寄存器/内存 | 推注册| PUSH FS |\n+--------------+------------+------------+\n| 推 GS | 普什夫Q | RET(近)|\n+--------------+------------+------------+\ n\n