Как получить доступ к массивам C из ассемблера для Windows x64? - PullRequest
3 голосов
/ 18 марта 2010

Я написал функцию ассемблера для ускорения обработки изображений (изображения создаются с помощью CreateDIBSection).

Для Win32 ассемблерный код работает без проблем, но для Win64 происходит сбой, как только я пытаюсь получить доступ к данным моего массива.

Я помещаю соответствующую информацию в структуру, и моя ассемблерная функция получает указатель на эту структуру. Указатель структуры помещается в ebx / rbx, и с помощью индексации я считываю данные из структуры.

Есть идеи, что я делаю не так? Я использую nasm вместе с Visual Studio 2008, и для Win64 я устанавливаю «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!
...

Ответы [ 2 ]

8 голосов
/ 18 марта 2010

Вполне возможно, поле pData находится на [rbx + 8], а не [rbx + 4]. Компилятор вставляет некоторое дополнительное пространство («заполнение») между ulParam1 и pData, так что pData выравнивается на 8 байтов (что ускоряет доступ).

2 голосов
/ 18 марта 2010

Взгляните на свою структуру в памяти.Может быть смещение отличается в x64

...