К сожалению, MSVC ++ не поддерживает встроенную сборку в 64-битном коде и также не поддерживает __emit. В MSVC ++ вы должны либо реализовать фрагменты кода в отдельных файлах .asm и скомпилировать и связать их с остальным кодом, либо прибегнуть к грязным хакерским атакам, как показано ниже (реализовано для 32-битного кода в качестве подтверждения концепции):
#include <windows.h>
#include <stdio.h>
unsigned char BswapData[] =
{
0x0F, 0xC9, // bswap ecx
0x89, 0xC8, // mov eax, ecx
0xC3 // ret
};
unsigned long (__fastcall *Bswap)(unsigned long) =
(unsigned long (__fastcall *)(unsigned long))BswapData;
int main(void)
{
DWORD dummy;
VirtualProtect(BswapData, sizeof(BswapData), PAGE_EXECUTE_READWRITE, &dummy);
printf("0x%lX\n", Bswap(0x10203040));
return 0;
}
Выход: 0x40302010
Я думаю, что вы должны быть в состоянии сделать то же самое не только с gcc, но и с Linux, с двумя незначительными отличиями (VirtualProtect () - одно, соглашения о вызовах - другое).
РЕДАКТИРОВАТЬ : Вот как можно выполнить BSWAP для 64-битных значений в 64-битном режиме в Windows (не проверено):
unsigned char BswapData64[] =
{
0x48, 0x0F, 0xC9, // bswap rcx
0x48, 0x89, 0xC8, // mov rax, rcx
0xC3 // ret
};
unsigned long long (*Bswap64)(unsigned long long) =
(unsigned long long (*)(unsigned long long))BswapData64;
А остальное тривиально.