很长时间MSVC用户,gcc新手(非常感谢)。_BitScanForward64在C++。exe中返回错误的答案(rubenvb-4.7.2-release)
我在Windows 7上使用C++的rubenvb版本(请参阅主题中的版本,是的,我正在构建64位),并且使用_BitScanForward64时出现问题。一些示例代码如下所示:
int __cdecl main(int argc, char* argv[])
{
DWORD d = (DWORD)atoi(argv[1]);
DWORD ix, ix2;
ix2 = _BitScanForward64(&ix, d);
printf("bsf %u %u\n", ix, ix2);
}
我与编译:
“C:\ Program Files文件\ GCC2 \ mingw64 \ BIN \ C++ exe文件” -o iTot.exe -mno-MS- bitfields -march = native -momit-leaf-frame-pointer -mwin32 -Os -fomit -frame-pointer -m64 -msse4 -mpopcnt -D WINDOWS main.cpp
当我使用参数8运行iTot.exe时,我预计_BitScanForward64会将ix设置为3.这就是MSVC所做的。然而,九是0和IX2是1
而且,看着汇编,我看到:
bsfq QWORD PTR 44[rsp],rax # MEM[(volatile LONG64 *)&ix], Mask
在这种情况下,为什么在这里阅读GCC力存储器写+?
所以,有几个问题:
- 是_BitScanForward64某种程度上应该根据不同的gcc被称为?如果我只是说错了,那很好知道(虽然与MSVC的不兼容性会很痛苦)。
- 为什么_BitScanForward64内在强制内存写入?
盯着-S的汇编程序输出,我看不到任何错误代码正在生成。然而,使用 objdump.exe -d -Mintel,我看到,而不是使用上述(其似乎将工作)的汇编代码,它实际上所产生的反向:
BSF RAX,QWORD PTR [RSP + 0x2c]
WTF?为什么-S对我撒谎?
就像我说的,我是gcc的新手,所以如果我只是在做一些愚蠢的事情,请对我温柔。谢谢。
0x2c = 44,不是吗?另外,'-S'默认生成AT&T语法的输出,而objdump的输出产生了更为典型的x86 CPU(intel)语法。两者在操作数的顺序上有所不同。 – 2013-03-20 07:08:36
你是否包含声明'_BitScanForward64'函数的正确头文件?否则,编译器将不知道该函数是什么,它需要什么参数以及它返回什么,并且很可能会生成无法正常工作的代码。 – 2013-03-20 07:10:59
@alexey:我特意配置objdump来输出intel,因为这是我读的。我还配置了C++ -S来输出intel。由于他们都在输出英特尔,我预计结果是一样的。当我在调试器(VS)中打开.exe文件时,我看到相同(错误)的代码,这无疑解释了为什么printf显示BitScanForward返回错误答案。 – 2013-03-20 07:35:30