C++ 无法通过函数调用读取eflags
我正在使用MSVC 2015 我试图按照提供的答案进行操作,并根据以下内容调整程序: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
#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]
}