Как поместить маркеры сборки в код C ++ (x64) - PullRequest
3 голосов
/ 29 марта 2012

Мне нужно поместить маркеры в код C ++, которые должны быть видны в сборке или в двоичном виде.Кажется, это просто сделать для 32, используя встроенную сборку:

__asm {
    NOP
    NOP
    NOP
}

или используя оператор сборки DB:

__asm {
     DB  0x00, 0xFF, 0x10
}

Но VisualStudio 2005 и более поздние версии не поддерживают встроенную сборку для x64,Есть ли способ сделать это?Возможно, я могу сделать функцию в отдельном модуле сборки, но как я могу быть уверен, что компоновщик поместит туда реальную сборку вместо CALL?

Ответы [ 3 ]

2 голосов
/ 11 апреля 2012

Определите где-нибудь глобальную переменную, скажем, volatile __int64 blah = 0;. Затем, где бы вы ни хотели использовать маркер, используйте _InterlockedCompareExchange64(&blah, SOME_UNIQUE_CONSTANT1, SOME_UNIQUE_CONSTANT2);. Вы гарантированно найдете инструкции, загружающие ECX:EBX с SOME_UNIQUE_CONSTANT1 и EDX:EAX с SOME_UNIQUE_CONSTANT2, за которыми следует LOCK CMPXCHG8B (0xF0, 0x0F, 0xC7 и т. Д. - см. Подробности кодирования инструкций).

1 голос
/ 29 марта 2012

MSDN говорит, что вы можете использовать встроенные функции.

0 голосов
/ 11 апреля 2012
//MyAsmCode.asm
.code
  MyFunction proc
  ...
  MyFunction endp
end

скомпилируйте его (ml64.exe).

Вы получите объектный файл (MS COFF 64): MyAsmCode.obj

В VS добавьте MyAsmCode.obj для дополнительной ссылки компоновщика.

Теперь вы можете вызвать эту функцию.;)

...