英特尔指令集参考为我们提供了添加指令:
VEX.NDS.LIG.F2.0F.WIG 58 /r
VADDSD xmm1, xmm2, xmm3/m64
我们可以看到 L 位被忽略(可以是 0 或 1)。
addd xmm0, xmm0, xmm0的机器码:0xC4, 0xE1, 0x7B, 0x58, 0xC0
C4 - indicates 3-byte VEX prefix
E1 - R = 1; X = 1; B = 1; m-mmmm = 1 (implied 0F escape)
7B - W = 0; vvvv = 1111 (xmm0); L = 0; pp = 11 (implied F2 prefix)
58 - opcode byte
C0 - mod-rm byte
让我们测试一下:
void exec(Byte* code, int size)
{
Byte* buf = (Byte*)VirtualAlloc(NULL, 4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(buf, code, size);
buf[size] = 0xC3;
((void (*)())buf)();
VirtualFree(buf, 4096, MEM_DECOMMIT);
}
void f()
{
Byte code[] = { 0xC4, 0xE1, 0x7B, 0x58, 0xC0 };
exec(code, sizeof(code));
}
很好,视觉工作室反汇编程序也可以识别指令。
但是,当我将L 位更改为 1(0x7B 替换为 0x7F)时,反汇编程序无法识别指令并生成无效指令异常。这是否意味着尽管英特尔手册 L 位必须始终为 0?