이미지 처리를 위해 몇 가지 작업 속도를 높이기 위해 어셈블러 함수를 작성했습니다 (이미지는 CreateDIBSection으로 생성됩니다).Windows x64 용 어셈블러에서 C 배열에 액세스하는 방법?
Win32의 경우 어셈블러 코드는 문제없이 작동하지만 Win64의 경우 배열 데이터에 액세스하려고하면 충돌이 발생합니다.
구조체에 관련 정보를 넣었고 내 어셈블러 함수는이 구조체에 대한 포인터를 가져옵니다. 구조체 포인터를 ebx/rbx에 넣고 인덱싱을 통해 구조체의 데이터를 읽습니다.
내가 뭘 잘못하고 있는지 알기! 저는 Visual Studio 2008과 함께 nasm을 사용하고 Win64에서는 "default rel"을 설정했습니다.
C++ 코드 :
struct myData {
tUInt32 ulParam1;
void* pData;
};
CallMyAssemblerFunction(&myData);
어셈블러 코드 :
는 Win32 :
...
push ebp;
mov ebp,esp
mov ebx, [ebp + 8]; pointer to our struct
mov eax, [ebx]; ulParam1
mov esi, [ebx + 4]; pData, 4 byte pointer
movd xmm0, [esi];
...
의 Win64 :
...
mov rbx, rcx; pointer to our struct
mov eax, [rbx]; ulParam1
mov rsi, [rbx + 4]; pData, 8 byte pointer
movd xmm0, [rsi]; CRASH!
...
sizeof (myData)를 인쇄하거나 디버거에서 C++ 측의 주소를보고 쉽게 확인할 수 있습니다. –
정말로 고마워요. pData 필드는 [rbx + 8]에서 시작합니다. 이제 모든 것이 작동합니다. – user296502