Комментарии 18
но, к сожалению, документация дает неоднозначное представление о данном вопросе
Может, в первую очередь нужно зарепортить баг всё-таки на документацию?
+6
На всякий случай проверил, что эти ненормальные инструкции запрещены в NaCl'e. С множественными префиксами в NaCl все строго.
А вы на AMD процессоре этот странный случай проверяли?
А вы на AMD процессоре этот странный случай проверяли?
+1
На AMD не проверял, так как нету таких под рукой.
Если кто-то может проверить — сообщите, было бы очень интересно.
Если кто-то может проверить — сообщите, было бы очень интересно.
0
По крайней мере приведённая программа выдаёт «4.000000 2.000000» как и на Intel'е.
Но с префиксом 66 связан другой очень весёлый случай, так что понимаю почему хотелось проверить как себя ведёт AMD:
sourceware.org/bugzilla/show_bug.cgi?id=13668
Но с префиксом 66 связан другой очень весёлый случай, так что понимаю почему хотелось проверить как себя ведёт AMD:
sourceware.org/bugzilla/show_bug.cgi?id=13668
0
Если можно, готовый код тестирования, я запущу. Продолжим в личке.
0
«Наверно, логичнее было бы определять, что это за инструкция, по последнему префиксу»
Раз это упущено в мануале, то надо бы сначала уточнить у разработчика, повторяется ли это на всех процессорах?
// Напомнило, как я игрался с turbo debugger на 2 курсе: cs1202.vk.me/u55420/19095012/x_d4218182.jpg
Раз это упущено в мануале, то надо бы сначала уточнить у разработчика, повторяется ли это на всех процессорах?
// Напомнило, как я игрался с turbo debugger на 2 курсе: cs1202.vk.me/u55420/19095012/x_d4218182.jpg
0
f2 66 0f 59 ff — это MULSD согласно 2.2.1 REX Prefixes:
When a REX prefix is used in conjunction with an instruction containing a mandatory prefix, the mandatory prefix must come before the REX so the REX prefix can be immediately preceding the opcode or the escape byte. For example, CVTDQ2PD with REX prefix should have REX placed between F3 and 0F E6. Other placements are ignored.
66 f3 f2 0f 59 ff и 66 f2 f3 0f 59 ff здесь 66 игнорируется согласно 2.2.1. Использование f3 и f2 unpredictable behavior согласно:
Repeat prefixes (F2H, F3H) cause an instruction to be repeated for each element of a string. Use these prefixes only with string and I/O instructions (MOVS, CMPS, SCAS,LODS, STOS, INS, and OUTS). Use of repeat prefixes and/or undefined opcodes with other Intel 64 or IA-32 instructions is reserved; such use may cause unpredictable behavior.
When a REX prefix is used in conjunction with an instruction containing a mandatory prefix, the mandatory prefix must come before the REX so the REX prefix can be immediately preceding the opcode or the escape byte. For example, CVTDQ2PD with REX prefix should have REX placed between F3 and 0F E6. Other placements are ignored.
66 f3 f2 0f 59 ff и 66 f2 f3 0f 59 ff здесь 66 игнорируется согласно 2.2.1. Использование f3 и f2 unpredictable behavior согласно:
Repeat prefixes (F2H, F3H) cause an instruction to be repeated for each element of a string. Use these prefixes only with string and I/O instructions (MOVS, CMPS, SCAS,LODS, STOS, INS, and OUTS). Use of repeat prefixes and/or undefined opcodes with other Intel 64 or IA-32 instructions is reserved; such use may cause unpredictable behavior.
0
Причём тут 2.2.1? Ни в одной из этих инструкций REX префикс не используется.
+1
f2 66 0f 59 ff — это MULSD согласно 2.2.1 REX Prefixes:
When a REX prefix is used in conjunction with an instruction containing a mandatory prefix, the mandatory prefix must come before the REX so the REX prefix can be immediately preceding the opcode or the escape byte. For example, CVTDQ2PD with REX prefix should have REX placed between F3 and 0F E6. Other placements are ignored.
Не понял вашей аргументации, если честно. Тут говорится про REX префикс. В приведенном примере его просто нет.
0
66 — это не REX префикс. Не понимаю при чем здесь документация о их положении. Следующий пункт тоже не применим. Он говорит о строковых инструкциях, а не о SSE-инструкциях с обязательным префиксом. Как показывает случай f2 66, нельзя рассматривать f2 f3 0f… просто как SSE инструкцию с префиксом f2.
0
66 f3 f2 0f 59 ff и 66 f2 f3 0f 59 ff здесь 66 игнорируется согласно 2.2.1. Использование f3 и f2 unpredictable behavior согласно:
Repeat prefixes (F2H, F3H) cause an instruction to be repeated for each element of a string. Use these prefixes only with string and I/O instructions (MOVS, CMPS, SCAS,LODS, STOS, INS, and OUTS). Use of repeat prefixes and/or undefined opcodes with other Intel 64 or IA-32 instructions is reserved; such use may cause unpredictable behavior.
В данном случае это уже не repeat префиксы. Они несут совсем другую смысловую нагрузку.
+1
libopcodes вообще плохо себя ведёт на странных комбинациях префиксов/суффиксов, а иногда может вообще запутаться и выдать чушь (вплоть до того, что несуществующую инструкцию запишет в существующую).
Несколько примеров:
Несколько примеров:
0: 9b rex 1: 40 rex 2: 9b df 28 fildll (%rax)9b — это, как несложно догадаться, ни разу не rex
0: c4 e3 79 44 c0 02 vpclmullqhqdq %xmm0,%xmm0,%xmm0Это, на самом деле, не vpclmullqhqdq, а совсем даже vpclmullqlqdq.
0: c5 fa 28 d1 vmovaps %xmm1,%xmm2Это — вообще не поддерживается в железе (похожая инструкция c5 f8 28 d1, разумеется, поддерживается).
+2
Capstone тоже не справился, попробую им написать.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Правильно ли работает ваш дизассемблер?