Visual Studio 2010 компилирует встроенную сборку в c ++, как будто Visual Studio 6? - PullRequest
2 голосов
/ 07 января 2011

У меня есть проект C ++, созданный в VS6, который был открыт в VS2010 и прекрасно компилируется. Он содержит класс с небольшим количеством встроенных сборок, включая следующий код:

__asm{
  mov eax,this
  mov esi,[eax].m_pImage
  ...

Все отлично, пока я не попытаюсь создать новый проект MFC C ++ в VS2010 и добавить класс с кодом сборки, показанным выше. Внезапно это не скомпилируется, поскольку более новая интерпретация __asm ​​требует, чтобы код был следующим (или что-то похожее; это компилируется в любом случае):

__asm{
  mov eax,this
  mov esi,[eax]this.m_pImage
  ...

Теперь, на всю жизнь, я не могу понять, в чем разница между двумя проектами, которая позволяет преобразованному проекту VS6 скомпилировать (предположительно в настоящее время недействительный) встроенный код сборки в VS2010, в то время как недавно созданный проект «т.

Есть ли где-нибудь (скрытый) параметр, позволяющий использовать старый компилятор VS6?

1 Ответ

2 голосов
/ 07 января 2011

Встроенный ASM VS6 кажется исправленной ошибкой.Я говорю это, потому что я не уверен, как компилятор мог проверить, что m_pImage был членом того, что было загружено в регистр eax, и поэтому не смог найти смещение.Чтобы ответить на ваш вопрос, я не знаю, как использовать старую семантику ASM в компиляторе VS6.

Я бы создал локальную переменную вне встроенного ASM и присвоил бы ей esi.

void * pointer = this.m_pImage;
__asm
{
   mov ebx, pointer
   mov esi, ebx
   ...
...