错误ANOMALY: meaningless REX prefix used是什么意思?我已经用谷歌搜索,并且我得到的所有信息都是完全随机的,因为它与java或avg或minecraft有关(由于Java)。

但是,合并c++ opengl 4.0图形引擎的多个分支后,我的Visual Studio控制台应用程序的控制台输出中出现了此错误,并且突然弹出了该错误。我可能已经在编写它们的时间点之间更新了AMD图形驱动程序,因此这可能是一个来源。错误弹出后,深度缓冲区测试也突然被禁用。

在Visual Studio中使用clean and rebuild之后,错误现在消失了,因此,我不需要修复错误的帮助,但是我想知道它的含义以及通常导致此错误的原因。这让我感到好奇,因为我没有发现任何有用的搜索此错误的信息。

最佳答案

Myria在评论中说:



为了对此进行扩展,在一些不同的情况下,将忽略REX前缀。

  • 如果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-bit Win7 sys控制台上看到了该消息。现在,此人的站点带我通过Raptr所使用的钩子(Hook)(该钩子(Hook)连接到opengl32.dll),该钩子(Hook)称为mhook,我开始研究这个“Windows API钩子(Hook)库”,并找到了这个starting on line 1230:
    assert(X86Instruction->AddressSize >= 4);
        if (X86Instruction->rex.w)
        {
            X86Instruction->OperandSize = 8;
            X86Instruction->HasOperandSizePrefix = FALSE;
        }
        else if (X86Instruction->HasOperandSizePrefix)
        {
            assert(X86Instruction->OperandSize == 2);
        }
        else if (X86Instruction->rex_b == REX_PREFIX_START)
        {
            if (!Instruction->AnomalyOccurred)
            {
                if (!SuppressErrors) printf("[0x%08I64X] ANOMALY: meaningless REX prefix used\n", VIRTUAL_ADDRESS);
                Instruction->AnomalyOccurred = TRUE;
            }
            X86Instruction->rex_b = 0;
        }
    

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

    因此,您到了那里,就在所有正确的地方。 mhook库甚至还有一长串要忽略的Visual Studio文件。
    附加说明*
    我发现os2museum网站上的评论很好地说明了整个谜团



    在这个特定的钩子(Hook)库中,其他有趣的错误消息(只是其中的一些!)包括
    ANOMALY: Meaningless segment overrideANOMALY: REX prefix before legacy prefix 0x%02X\nANOMALY: Conflicting prefix\nANOMALY: Reached maximum prefix count %d\n
    和我的最爱:
    ANOMALY: branch into the middle of an instruction\n
    只是因为我无法自救,所以可能值得注意这些是默认为64位操作数的指令:

    + -------------- + ------------ + ------------- +
    |致电(附近)| ENTER | Jcc |
    + -------------- + ------------ + ------------- +
    | JrCXZ | JMP(附近)|离开
    + -------------- + ------------ + ------------- +
    | LGDT | LIDT | LLDT |
    + -------------- + ------------ + ------------- +
    |圈| LOOPcc | LTR |
    + -------------- + ------------ + ------------- +
    | MOV CR(n)| MOV DR(n)| POP注册/内存|
    + -------------- + ------------ + ------------- +
    | POP reg | POP FS | POP GS |
    + -------------- + ------------ + ------------- +
    | POPFQ |推imm8 |推imm32 |
    + -------------- + ------------ + ------------- +
    |推注册/内存| PUSH reg |推式FS |
    + -------------- + ------------ + ------------- +
    |推GS | PUSHFQ | RET(附近)|
    + -------------- + ------------ + ------------- +

    09-25 18:30