我正在C ++(Visual Studio 2010)中创建一个非常有限的,特定于域的x86汇编程序,它在运行时动态生成指令,将其写入内存并执行它。首先,我将它们写入临时字节流,然后将整个流写入一个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
的值吗?
换句话说,这是正确,可移植的这样做的方式,还是应该以不同的方式进行?
谢谢!
答案 0 :(得分:2)
http://msdn.microsoft.com/en-us/library/z2cx9y4f.aspx
匿名结构
Microsoft C扩展允许您声明结构变量 在另一个结构中没有给它起名字。这些嵌套 结构称为匿名结构。 C ++不允许 匿名结构。
您可以访问匿名结构的成员,就像它们一样 包含结构中的成员。
但是,您正在做的事情不需要union
。
void WriteValueToMemory(double* dest, SSE2Register source)
{
struct
{
byte insts[4];
double* dest;
} movsd =
{ // movsd [imm32], xmm1
0xF2, 0x0F, 0x11, // Opcode
0x05 + (8 * source), // ModR/M
dest // imm32
};
_stream.Write(&movsd, sizeof(movsd));
}