很長時間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