ANOMALY:使用无意义的REX前缀

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之后,错误现在消失了,因此我不需要帮助修复错误,但我想知道它的含义以及通常会导致此错误的原因.这让我很好奇,因为我没有找到任何有用的搜索此错误.

Rob*_*ton 3

米里亚在评论中说道:

\n\n
它指的是在不需要时使用 REX 前缀字节的 x86-64 汇编指令
\n\n

为了扩展这一点,在一些不同的场景中 REX 前缀会被忽略。

\n\n
    \n
  1. 如果ModR/M字段指定其他寄存器或扩展操作码。

  2. \n
  3. 如果指令中使用了超过 1 个 REX 前缀(尽管我在osdev.org上读到,这是未定义的

  4. \n
  5. 如果不遵循一般格式。例如,REX 前缀必须位于操作码或转义操作码字节之前,除非与强制前缀结合使用。在这种情况下,REX 可以位于操作码/转义字节之后。

  6. \n
  7. 如果您尝试在 64 位模式下使用单字节形式的 INC/DEC。

  8. \n
\n\n

看起来这条异常消息显示在从 git 到Java相关程序(也许是您引用的程序)的各种上下文中,其中新的驱动程序似乎是问题所在。罪魁祸首:Raptr,它随 AMD 的 Radeon 驱动程序一起提供。在 Java 帖子中,有人报告使用 SAPPHIRE Radeon HD 5850,在我将链接到您的下一个网站上,一个人使用 AMD R9 390,另一个人使用 380。在这种情况下,有人在他们的 64- 控制台上看到了这条消息位Win7系统。现在这个人的网站带我了解了 Raptr 使用的一个名为mhook的钩子(它连接到 opengl32.dll) ,我开始挖掘这个“Windows API 钩子库”,并发现它从第 1230 行开始

\n\n
assert(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    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

总而言之,当软件处理 REX 前缀忽略时,就会出现此异常消息,就像 Windows API 库所做的那样。

\n\n

所以你已经知道了,你处于所有正确的位置。mhook 库甚至有一长串需要忽略的 Visual Studio 文件。
\n附加说明*\n我从 os2museum 找到了这条评论网站上的这条评论是解开整个谜团的好线索

\n\n
\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\n

ANOMALY: Meaningless segment override

\n\n

ANOMALY: REX prefix before legacy prefix 0x%02X\\n

\n\n

ANOMALY: Conflicting prefix\\n

\n\n

ANOMALY: Reached maximum prefix count %d\\n

\n\n

和我最喜欢的:

\n\n

ANOMALY: branch into the middle of an instruction\\n

\n\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