错误ANOMALY: meaningless REX prefix used
是什么意思?我用google搜索,我得到的所有信息都是完全随机的,它与java或avg或minecraft有关(因为java)。
然而,在我合并了我的c ++ opengl 4.0图形引擎的几个分支之后,我在Visual Studio控制台应用程序的控制台输出中出现了这个错误,它突然弹出。我可能已经在我写的时间点之间更新了AMD图形驱动程序,所以这可能是一个来源。弹出错误后,深度缓冲测试也突然被禁用。
在visual studio中使用clean和rebuild后,错误现在消失了,因此我不需要帮助修复错误,但我想知道它的含义以及通常会导致此错误的原因。这让我很好奇,因为我没有找到任何有用的搜索此错误。
答案 0 :(得分:-1)
Myria在评论中说:
指的是不需要REX前缀字节的x86-64汇编指令
为此,在一些不同的情况下,REX前缀将被忽略。
如果ModR / M字段指定其他寄存器或扩展操作码。
如果一条指令中使用了超过1个REX前缀(尽管我在osdev.org上进行了阅读,这是未定义的
如果不遵循常规格式。例如,除非与强制性前缀结合使用,否则REX前缀必须在操作码或转义操作码字节之前。在这种情况下,REX可以紧接在操作码/转义字节之后。
如果尝试在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;
}
因此,您在正确的位置就拥有了它。 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) | +--------------+------------+-------------+