ANOMALY:使用无意义的REX前缀

时间:2016-04-26 19:06:08

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

1 个答案:

答案 0 :(得分:-1)

Myria在评论中说:

指的是不需要REX前缀字节的x86-64汇编指令

为此,在一些不同的情况下,REX前缀将被忽略。

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

  2. 如果一条指令中使用了超过1个REX前缀(尽管我在osdev.org上进行了阅读,这是未定义的

  3. 如果不遵循常规格式。例如,除非与强制性前缀结合使用,否则REX前缀必须在操作码或转义操作码字节之前。在这种情况下,REX可以紧接在操作码/转义字节之后。

  4. 如果尝试在64位模式下使用INC / DEC的单字节形式。

看起来像这样的ANOMALY消息在git到Java相关程序(可能是您正在引用的程序)的各种上下文中显示,其中新驱动程序似乎是问题所在。罪魁祸首:Raptr,它带有AMD Radeon驱动程序。在Java帖子中,有人报告使用SAPPHIRE Radeon HD 5850,在我将与您链接的下一个站点上,一个人使用AMD R9 390,另一个人使用380。在这种情况下,有人在其{{3 }。sys。现在,此人的站点带我通过Raptr所使用的(连接到opengl32.dll的)钩子64-bit Win7,我开始研究这个“ Windows API钩子库”并发现了这个mhook

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前缀忽略时,就会出现此异常消息。

因此,您在正确的位置就拥有了它。 mhook库甚至还有一长串要忽略的Visual Studio文件。
附加说明* 我在starting on line 1230网站上发现了此评论,这是整个谜团的一个很好的线索

Windows amd64 ABI要求函数的第一个操作码的长度至少为2个字节。 (我认为这样可以对函数进行热修补。)很多时候,第一条指令是“ push”,但该指令具有1字节的编码!为了符合ABI,在指令中添加了rex前缀,使其成为2个字节-“ rex push rbp”或“ rex push rbx”或其他内容。编译器会为您执行此操作,但是如果您要在汇编器中编写函数,则需要记住该规则。

在这个特定的钩子库中,其他有趣的错误消息(只是其中的一些!)包括

ANOMALY: Meaningless segment override

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

ANOMALY: Conflicting prefix\n

ANOMALY: Reached maximum prefix count %d\n

和我的最爱:

ANOMALY: branch into the middle of an instruction\n

仅仅因为我自己也无法帮助自己,所以可能值得注意的是这些默认为64位操作数的指令:


+--------------+------------+-------------+
| CALL (near)  | ENTER      | Jcc         |
+--------------+------------+-------------+
| JrCXZ        | JMP (near) | LEAVE       |
+--------------+------------+-------------+
| LGDT         | LIDT       | LLDT        |
+--------------+------------+-------------+
| LOOP         | LOOPcc     | LTR         |
+--------------+------------+-------------+
| MOV CR(n)    | MOV DR(n)  | POP reg/mem |
+--------------+------------+-------------+
| POP reg      | POP FS     | POP GS      |
+--------------+------------+-------------+
| POPFQ        | PUSH imm8  | PUSH imm32  |
+--------------+------------+-------------+
| PUSH reg/mem | PUSH reg   | PUSH FS     |
+--------------+------------+-------------+
| PUSH GS      | PUSHFQ     | RET (near)  |
+--------------+------------+-------------+