Intel набор инструкций ссылка дает нам addsd инструкцию:Intel VEX префикс L разрядное значение не ведет себя в соответствии с Документами
VEX.NDS.LIG.F2.0F.WIG 58 /r
VADDSD xmm1, xmm2, xmm3/m64
Как мы можем видеть, L бит игнорируется (может быть либо 0 или 1) ,
код Машина addsd 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));
}
Fine, а также визуальная студия ассемблер распознает инструкцию.
Однако, когда я меняю L бит до 1 (0x7B заменен на 0x7F) дизассемблер не распознает инструкцию и генерируется исключение Invalid Instruction. Означает ли это, что бит L всегда должен быть 0, несмотря на руководство Intel?
Если вы хотите проверить, что последовательности байтов являются действительными инструкциями, гораздо проще просто поместить их в '.asm' и собрать его, например' _start: db 0xC4, 0xE1, 0x7B, 0x58, 0xC0'. Затем вы просто собираете и запускаете его. Что еще более важно, дизассемблеры будут счастливо работать с вашими байтами, потому что они находятся в части вашего объектного файла, который должен содержать код. Похоже, ваш метод работает нормально; это просто сложно. –
С Visual C++ вы также можете использовать '#pragma code_seg (". Text ")' и 'unsigned char const __declspec (выделить (". Text ")) код [] = {0xC4, 0xE1, 0x7B, 0x58, 0xC0, 0xC3}; 'С GCC вы можете просто использовать' unsigned char const __attribute __ ((раздел (". Text"))) code [] = {0xC4, 0xE1, 0x7B, 0x58, 0xC0, 0xC3}; '. –
@PeterCordes: Знаете ли вы, что тег 'незаконной инструкции' прошел обгонку. Я замечаю, что @tkausl удалил его из всех вопросов. Я знаю, вы добавили его к вопросам в прошлом. –