Я создаю очень ограниченный, специфичный для домена ассемблер x86 в C ++ (Visual Studio 2010), который динамически генерирует инструкции, записывает их в память и выполняет их все во время выполнения. Сначала я записываю их во временный поток байтов, а затем записываю весь поток в исполняемую память за один memcpy
.
Я использую следующий код для построения movsd [imm32], xmm1
инструкции:
typedef unsigned char byte;
enum SSE2Register;
void WriteValueToMemory(double* dest, SSE2Register source)
{
union
{
struct
{
byte insts[4];
double* dest;
};
byte bytes[8];
} movsd =
{
// movsd [imm32], xmm1
0xF2, 0x0F, 0x11, // Opcode
0x05 + (8 * source), // ModR/M
dest // imm32
};
_stream.Write(movsd.bytes, sizeof(movsd.bytes));
}
Этот код работает: три байта кода операции и байт ModR / M записываются в insts
, пункт назначения (imm32
) записывается в dest
, а bytes
содержит всю инструкцию в необработанных байтах, готов к записи в поток инструкций.
Однако мне любопытно, является ли этот метод инициализации объединения безопасным / переносимым. Можно ли инициализировать четыре значения insts
и значение dest
в пределах одного набора скобок?
Другими словами, это правильный, переносимый способ сделать это, или я должен сделать это по-другому?
Спасибо!