2010-03-18 6 views
3

이미지 처리를 위해 몇 가지 작업 속도를 높이기 위해 어셈블러 함수를 작성했습니다 (이미지는 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! 
... 

답변

8

아마도 pData 필드는 [rbx + 4]이 아니라 [rbx + 8]입니다. 컴파일러는 ulParam1pData 사이에 여분의 공백 ("패딩")을 삽입하여 pData이 8 바이트로 정렬되므로 액세스가 빨라집니다.

+0

sizeof (myData)를 인쇄하거나 디버거에서 C++ 측의 주소를보고 쉽게 확인할 수 있습니다. –

+0

정말로 고마워요. pData 필드는 [rbx + 8]에서 시작합니다. 이제 모든 것이 작동합니다. – user296502

2

메모리에 struncture를 살펴 보자. x64에서 오프셋이 다를 수 있습니다.

관련 문제