Странно, второй день подряд не могу попасть в свою предыдущую тему. Не выкачивается весь HTML. Происходит это только в том случае, если залогинен. Модераторы, скиньте, пожалуйста, эту тему в этот пост: http://wasm.ru/forum/viewtopic.php?id=33513 . Заранее благодарен. bugaga Не, я вообще не понял "кто на ком стоял" . Что делает сервер? Что делает клиент? Как взаимодействуют? И для чего? Synth Щупатели нужны, причем очень. Мне страшно не хватает времени на тестирование, особенно вдумчивого -- всякие необычные комбинации префиксов, например. Если желание еще не пропало, постучись, пожалуйста, в ICQ (номер в профиле), разберемся. По поводу пожеланий. Флаги есть. Я просто забыл внести их в выходную структуру . Код (Text): uint8_t tested_flags; //Флаги, которые тестирует инструкция. uint8_t modified_flags; //Флаги, которые модифицирует инструкция. uint8_t set_flags; //Флаги, которые устанавливает инструкция. uint8_t cleared_flags; //Флаги, которые очищает инструкция. uint8_t undefined_flags; //Неопределнные флаги. Все эти флаги находятся в таблицах, надо будет скопировать их в результат. Черт, опять выходная структура подрастет. Почему не надо убирать длину инструкции? Она вернется как результат вызова ф-ии дизассемблирования. Не совсем понял, как и зачем . Нечто подобное есть: наличие modrm/sib отображается во флагах инструкции. Наличие imm/rel/disp можно выяснить из операндов. Хотя, флаги инструкции почти не заполнены, можно будет внести туда информацию о imm/rel/etc. С другой стороны, хотелось бы избежать дублирования информации. Может лучше заполнить флаги чем-то более полезным? С этим несколько сложнее. Дизассемблер, как я говорил, скорее движек для дизассемблирования, чем дизассемблер . Т.е. о "потоковом" дизассемблировании я пока не думал. dendi Прикинул, в принципе, из выходной структуры можно собрать инструкцию заново. Но сначала надо дизассемблер закончить . s0larian Восьми бит не хватит. Инструкций больше чем 256. Насчет многопоточности и скорости -- я не против многопоточности и скорости. С другой стороны, если на дизассемблирование уходит секунда, то разница даже на четырех ядрах не будет особо заметна. Тем более, что алгоритм дизассемблирования не очень сложный и выполняется довольно быстро. На libdisasm я смотрел. Вообще, мой дизассемблер на него очень похож, т.к. там отличные идеи, которые просто нельзя не подобрать. Только рекурсию в поиске в таблице я убрал, т.к. не нужна, на мой взгляд. Ну и 64 бита у меня поддерживаются. -- Забыл сказать: Sol_Ksacap предложил ввести Unicode для мнемоник. Сделаю так: мнемоники будут TCHAR. Чтобы можно было собрать как удобнее. Судьба типа операнда REL, похоже, никого не волнует. Раз возражений нет, убираю его. Инструкции jcc/call/jmp будут иметь операнд типа IMM. Тем более, что разницы между REL и IMM никакой, кроме названия.
длину убирать не надо, иногда в процессе работы к ней нужно иметь возможность обратиться... не помню уже где, но где-то мне это нужно было. рел убирать не надо, он нужен! пусть будет обычный DWORD. я по карйней мере считаю что должно быть так. по поводу юнионов на модрм. в ХДЕ32 это сделано так: Код (Text): BYTE modrm; /* ModR/M byte */ BYTE modrm_mod; /* mod field of ModR/M */ BYTE modrm_reg; /* reg field of ModR/M */ BYTE modrm_rm; /* r/m field of ModR/M */ не юнион, но всё доступно по поводу составных частей - имм может быть 0, и фиг ты тестанёшь его на наличие этой части в этой инструкции без табличного флага )
да, и ещё - имхо пофиг выходные размеры и прочие заморочки с размерами. для любителей мини - есть ХДЕ32. а то что делаешь ты - это другое. тут должна быть информативность, местами даже избыточность информации, для удобства юзабилити. ИМХА!
Ну, вопрос с длиной можно решить довольно просто: Код (Text): struct INSTRUCTION_EX { struct INTRUCTION instr; uint8_t len; }; Т.е. небольшое расширение решит проблемы страждущих . Ты мог бы привести пример, когда REL реально пригодится? Мне, например, в голову не приходит так сразу. Хотя убирать тоже не хочется. А щупатель возмущен его наличием . Я не стал разбирать modrm/sib. Просто копирую их в выходную струтуру, и все. По сути, они уже разобраны -- есть все операнды, и их типы. Для адреса я сделал свой modrm/sib байт. С его помощью можно унифицированно подойти к разобру адреса, независимо от того, как он описан, с помощью modrm или sib. Код (Text): struct ADDR { uint8_t seg; //сегментный регистр. uint8_t mod; //мое поле mod. Битовая маска, описывающая наличие base/index/scale/disp. uint8_t base; //код базового регистра. uint8_t index; //код индексного регистра. uint8_t scale; //множитель (1/2/4/8). } addr; Думаю, такое кодирование охватывает большинство нужд. Ну а для специфики остаются скопированные байты modrm/sib. Не уловил. Я всегда точно знаю, присутствует ли imm, или нет. А его значение меня не волнует. Оно в любом случае будет скопировано в результирующую инструкцию и расширено со знаком до восьми байт. В каком-то смысле согласен. Я просто хочу найти золотую середину. И просто так выбрасывать байты на ветер мне жалко .
1. REL не нужен однозначно. Все достаточно легко описывается с помощью IMM. 2. Мнемоники тоже не для всех целей нужны, поэтому, возможно, имеет смысл сделать их наличие опциональным. 3. C UNICODE больше геморроя. В большинстве программ, даже в юникодных, можно обойтись без трансляции. Ну а тип TCHAR вообще разрушит сложившуюся кроссплатформенную идиллию
для начала по поводу длины. и зачем мне расширять? ))) расширить можно всё что угодно ) Код (Text): else // is_rel_jump || is_rel_call jump_rva = pInstrFrom->rel32 + sign_extend_to_32(pInstrFrom->rel8) + pInstrFrom->OldRVA + pInstrFrom->len; ну вот примерно так например у меня в коде. я юзаю ХДЕ32 по поводу имм = 0. это я всё говорю что практически для дальнейших целей бывает нужно узнать, юзает ли УЖЕ ОТДИЗАСМЛЕННАЯ функа имм. т.е. я продизассемблировал программу, начинаю анализ... и гдето у меня идёт if в зависимости юзает ли команда имм или нет.
Ну так REL никуда не исчезает, вместо него будет IMM. Логика та же, просто название другое. Насчет IMM все равно не уловил . У инструкции есть несколько операндов, наличие/отсутствие операнда описывается флагом OPERAND_PRESENT. Тип тоже известен. Если OPERAND_PRESENT выставлен и тип операнда -- IMM, то в поле value лежит его значение.
ммм теперь уловил я ) таки да, именно это я и имел ввиду. но составные части, которые описывал я - они нужны больше для создания готовых инструкций.
Изначально у меня не было цели генерировать инструкции после дизассемблирования. dendi предложил это сделать. Думаю, можно, но сначала надо сам дизассемблер закончить, как я уже говорил .