gcc를 처음 사용하는 MSVC 사용자가 많습니다._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 :. \ 프로그램 파일 \ gcc2 \ mingw64 빈 \의 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가하는 일입니다. 그러나 IX는 0과 IX2는 어셈블러보고, 또한 1
이다, 나는 다음을 참조하십시오 상황에서
bsfq QWORD PTR 44[rsp],rax # MEM[(volatile LONG64 *)&ix], Mask
, 왜 GCC 힘 메모리 쓰기 + 여기 읽을 수 있습니까? 그래서
, 몇 가지 질문이 : 은- _BitScanForward64 어떻게 든 다른 GCC에서 호출 할 건가요? 만약 내가 잘못 부르고있다면 MSVC와의 비 호환성이 고통이 될지라도 알아두면 좋을 것입니다.
- _BitScanForward64 내장 함수가 메모리 쓰기를 강제 실행하는 이유는 무엇입니까?
-S에서 어셈블러 출력을 보았을 때 생성되는 코드에 아무런 이상이 없습니다. 그러나, 사용 objdump.exe -d -Mintel, 나는 그것이 오히려 이상 (작동하는 것처럼 보인다)이 ASM 코드를 사용하는 것보다, 실제로 반대를 생산 참조 :
BSF의 RAX, QWORD PTR [RSP + 0x2c]
WTF? 왜 나 한테 거짓말하는거야?
내가 말했듯이, 나는 gcc를 처음 사용하기 때문에, 만약 내가 바보 같은 짓을하고 있다면, 나와 친하게 지내라. 감사.
0x2c = 44, 그렇지 않습니까? 또한'-S'는 기본적으로 AT & T 구문으로 출력을 생성하며 objdump의 출력은 x86 CPU, 인텔에 대한보다 일반적인 구문을 생성합니다. 이 두 개는 피연산자 순서가 다릅니다. –
'_BitScanForward64' 함수를 선언하는 올바른 헤더를 포함합니까? 그렇지 않으면 컴파일러는 함수가 무엇인지, 인수가 무엇인지, 무엇을 반환하는지 알지 못하며, 제대로 작동하지 않는 코드를 생성 할 가능성이 높습니다. –
@alexey : 나는 내가 읽은 것이기 때문에 int를 출력하도록 objdump를 설정했다. 나는 또한 인텔을 출력하기 위해 C++ -S를 설정했다. 그들은 둘 다 인텔을 출력하기 때문에 결과가 같을 것이라고 기대했습니다. 디버거 (VS)에서 .exe 파일을 열 때 동일한 (잘못된) 코드가 표시되는데, 이는 의심 할 여지없이 printf가 BitScanForward가 잘못된 대답을 반환하는 이유를 설명합니다. –