У меня, например есть команда mov eax,dword ptr [edx] Этой команде соответствует машинный код, например такой 8B02. Ставим перед командой 11 префиксов - 67 - префикс для переопределения размера адреса. Вопрос: везде написано, что команда может иметь не более 4-х префиксов. А данная команда имеет 11 и нормально выполняется. Это что ошибка в источниках. И еще где можно почитать про дизасмы? Вопрос для The Svin. Потому что он является магом в этой области. Знаю что такие вопросы уже были, но ответов мало и все указывают на этот сайт и программы The Svin в которых недостаточно материала. Хочется почитать Криса и его книгу Disasm In Uncovered, но скачивал архив но он не работает Заранее спасибо всем!
Извините, про то что прочитать проехали - нашел книгу The Svin про опкоды. А вопрос про префиксы остается в силе.
Дык написано всё там в статьях про префиксы. Логически разных префиксов может быть 4. Но если их дублировать то байтов сколько префиксы занимают может быть и больше, лишь бы размер опкода общий не превысил допустимого - тогда будет исключение, но уже по другой причине, по причине размера а не использования лишних префиксов. В официальной документации написано, что дублирование префиксов может привести к непредсказуемым последствиям. На практике я ещё с этим не встречался ни на одной машине. Так что может или не может на каких-то машинах она к ним привести - не знаю, знаю только что на тех машинах на которых я работал - ни к каким "непредсказуемым последствиям" дублирование префиксов не приводило. Если префиксы противоречат друг другу то по наблюдениям действует последний в цепочке префиксов принадлежащий данной логической группе. т.е. если поставишь repe repne - то сработает repne если repne repe - то сработает repe. По крайней мере так вели себя дешифраторы на знакомых мне машинах. И об этом уже писал я. А Крыса про опкоды лучше не читай, - полный бред. И я тоже не маг никакой - просто однажды попросили рассказать на борде у Hiro как научится осознано кодировать в машинных кодах, с тех пор всё и спрашивают.
Под 'не более 4х' подразумевается, что большее кол-во префиксов использовать нет смысла (т.е. lock/repX + 66 + 67 + префикс переопределения сегмента). Но, тем не менее, можно задать и большее кол-во префиксов, в т.ч. перекрывающиеся. Процессор работает с префиксами по след правилам: 1. LOCK, 66h, 67h -- ХОТЯ БЫ ОДИН. Т.е., не важно сколько в команде префиксов 66/67/LOCK и в каком они порядке. 2. REPZ/REPNZ и ES/CS/SS/DS/FS/GS -- ПОСЛЕДНИЙ ВСТРЕТИВШИЙСЯ. Т.е. команда 66 26 67 66 3E F3 F3 67 26 26 3E F2 FF 00 (в 32-bit mode) равносильна команде Код (Text): repnz segds inc word ptr [bx+si]
Большое спасибо! Сейчас приступил к читанию книги The Svin. Возможно надо мануалами обзавестись. Просто я пишу дизасм для 32-хбитного x86. Вот не знаю как будет обстоять дело при портировании 32-хбитного дизасма на 64-битную платформу.
Bill_Prisoner Огромный привет Вам, интересно, есть ли возможность влиться в ваш коллектив? Очень буду рад вашему ответу, спасибо.