Здравствуйте! Пишу некое подобие дизассемблера - мне нужно взять опр. количество байт, содержащих в себе команды ассемблера, но так чтобы не было перебора или недобора в байтах :P Не знаю, где бы нарыть инфу по структуре опкодов, как они составляются, чтоб все до бита? PS гугл язал, не нарыл
Бери по 15 байт, так как это предельная длина комманды. Инфа по структуре опкодов - intel.com Список опкодов с определениями их структуры - http://ms-rem.dot-link.net/files/pentium.rar
Синия книжка В.Юрова "Спец. справочник" содержит в себе пояснения к мнемоникам, но увы не ковсем. Електрическую версию не видел, а бумажную везде продают.
Ms Rem чет я не все команды там нашел, в файле по твоей сцылке. некоторы[ "извращенных" команд не увидел, например push [reg1+reg2*4+const]
Смотри внимательно: FF /6 PUSH r/m32 А "извращенная" адресация задается с помощью байтов MOD r/m и SIB, которые к опкоду никакого отношения не имеют. А у меня там только таблица опкодов (которая как раз нужна при написании дизассемблера), а адресация всегда разбирается по общим правилам. Смотри http://ms-rem.dot-link.net/files/cadt.rar
-> Бери по 15 байт, так как это предельная длина комманды. а вдруг захвачу часть лишней команды или "недохвачу" часть последней? А за сцылки спасибо огромное, буду смотреть
Берешь 15 байт, дизассемблируешь их, когда длина определена, то уже ясно с какого места брать следующие. А недохватить просто невозможно, так как комманд длиннее 15 байт не бывает.
ааа ты про это ну дык понятно... Я просто думал чтобы копировать допустим первые 30 байт (мне больше и не надо) и дизасмить их... глянул в ссылки - не то. Что-то никак не могу найти чтобы прям каждый бит команды описывался! c intel.com скачал "IA-32 Intel Architecture Software Developer’s Manual" - только там описание команд... и ничего (
Хорошо поищи в яндексе. Я там много чего находил Например есть статья Криса на эту тему. Описано там неплохо, но полно ошибок
хм, так случайно наткнулся в гугле на: Intel x86 instructions are between 1 and 17 bytes long. http://64.233.161.104/search?q=cache:fyusRsSrF-kJ:engineering.dartmout h.edu/~engs116/lectures/engs%2520116%2520lecture%25203-04f.ppt+17+inte l+opcode+length&hl=ru только вот примеров то нет )) и вообще слышал что вроде как больше 15 размер команд, тока подтвердить нечем )
А ты проверь на практике. Приписывай к комманде префиксы до тех пор, пока она не станет генерировать #UD
2 warsem: У меня второе издание справочника - описание есть ко всем командам, включая FPU, SSE и SSE2 ... P.S. Кстати очень рекомендую ...
MaDF > скачал "IA-32 Intel Architecture Software Developer’s Manual" - только там описание команд... и ничего ( Как это ничего ( Открываешь vоlume 2: Instruction Set Reference и для общего развития изучаешь раздел Instruction format. Потом берешь для примера инструкцию ADD и видишь обозначения типа 81 /0 id ADD r/m32,imm32 или 01 /r ADD r/m32,r32. Идешь в начало раздела в Interpreting..\Instruction format\Opcode column и смотришь что скрывается за /0, /r и id. Например, 81 /0 id означает опкод = 81h, /0 - поле reg байта ModR/M = 0, id - в конце инструкции идет непосредственный операнд dword. Полный формат инструкции будет определяться байтом ModR/M - кодировку смотрим в таблице в разделе ModR/M and SIB bytes. При reg=0 всего возможно 32 варианта, включая разные регистры и типы адресации памяти. Соответсвенно в зависимости от ModR/M формат и длина инструкции может быть разной (в данном примере 6, 7, 8, 10 или 11 байт без учета префиксов).
гм... почитав описание, сделал вывод что по-любому нужна таблица с опкодами команд... ведь не зная, какой это опкод, не будешь знать какие у данной конструкции операнды, так?
Конечно таблица нужна. Ты бы сначала исходники других дизассемблеров посмотрел, прежде чем за свой браться.