C++ 无法通过函数调用读取eflags

C++ 无法通过函数调用读取eflags,c++,visual-c++,C++,Visual C++,我正在使用MSVC 2015 我试图按照提供的答案进行操作,并根据以下内容调整程序: #include <iostream> #include <limits> inline unsigned long long query_intel_x86_eflags(const unsigned long long query_bit_mask) { return __readeflags() & query_bit_mask; } int main(int

我正在使用MSVC 2015

我试图按照提供的答案进行操作,并根据以下内容调整程序:

#include <iostream>
#include <limits>

inline unsigned long long query_intel_x86_eflags(const unsigned long long query_bit_mask)
{
    return __readeflags() & query_bit_mask;
}

int main(int argc,char **argv)
{
    int x = std::numeric_limits<int>::max();
    int y = std::numeric_limits<int>::max();
    int z = x * y;
    //auto g{__readeflags() & 0x801}; // sees overflow and carry flags
    auto g{query_intel_x86_eflags(0x801)}; // doesn't see overflow and carry flags
    std::cout << std::hex << g << '\n';
}

为什么编译器生成的附加指令最终会重置寄存器?

开场白代码似乎正在堆栈上设置金丝雀。你有没有考虑过调试版本?无论如何,对于这种低级的函数,您可能需要
\uu declspec(裸体)
@igortandtnik Aha。是的,这是一个调试版本。在这种情况下,我如何使用
\uu declspec(裸体)
?当然,您可以按照文档中描述的方式使用它。@IgorTandetnik我不确定它是否适合这种情况。我得到以下错误:
C2485:“裸”:无法识别的扩展属性
。我查看并尝试了
\u declspec(裸)内联无符号长查询\u intel\u x86\u eflags(常量无符号长查询\u位掩码)
。我用的是64位,没关系<代码>\uu declspec(裸版)只有当函数体主要在内联汇编中编写时才真正有意义(基本上不包括64位构建)。这样的函数甚至不能有
return
语句。我想你最好的选择是宏。开场白代码似乎是在堆栈上设置金丝雀。你有没有考虑过调试版本?无论如何,对于这种低级的函数,您可能需要
\uu declspec(裸体)
@igortandtnik Aha。是的,这是一个调试版本。在这种情况下,我如何使用
\uu declspec(裸体)
?当然,您可以按照文档中描述的方式使用它。@IgorTandetnik我不确定它是否适合这种情况。我得到以下错误:
C2485:“裸”:无法识别的扩展属性
。我查看并尝试了
\u declspec(裸)内联无符号长查询\u intel\u x86\u eflags(常量无符号长查询\u位掩码)
。我用的是64位,没关系<代码>\uu declspec(裸版)只有当函数体主要在内联汇编中编写时才真正有意义(基本上不包括64位构建)。这样的函数甚至不能有
return
语句。我想你最好的选择是宏。
inline unsigned long long query_intel_x86_eflags(const unsigned long long query_bit_mask)
{
00007FF6396D1BF0 48 89 4C 24 08       mov         qword ptr [rsp+8],rcx  
00007FF6396D1BF5 55                   push        rbp  
00007FF6396D1BF6 57                   push        rdi  
00007FF6396D1BF7 48 81 EC C8 00 00 00 sub         rsp,0C8h // changes the flags 
00007FF6396D1BFE 48 8B EC             mov         rbp,rsp  
00007FF6396D1C01 48 8B FC             mov         rdi,rsp  
00007FF6396D1C04 B9 32 00 00 00       mov         ecx,32h  
00007FF6396D1C09 B8 CC CC CC CC       mov         eax,0CCCCCCCCh  
00007FF6396D1C0E F3 AB                rep stos    dword ptr [rdi]  
00007FF6396D1C10 48 8B 8C 24 E8 00 00 00 mov         rcx,qword ptr [rsp+0E8h]  
    return __readeflags() & query_bit_mask;
00007FF6396D1C18 48 9C                pushfq  
00007FF6396D1C1A 58                   pop         rax  
00007FF6396D1C1B 48 23 85 E0 00 00 00 and         rax,qword ptr [query_bit_mask]  
}