Задача - расставить переходы (JMP, JCC)

Тема в разделе "WASM.A&O", создана пользователем luckysundog, 10 авг 2009.

  1. luckysundog

    luckysundog New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2008
    Сообщения:
    106
    Предположим, мы разрабатываем ассемблер. Абстрагируемся пока от всяких аццких алгоритмических и прочих штук, присущих программе компилятора, сосредоточившись на следующей задаче:
    - дан код(последовательность команд и меток). например:
    label1:
    jc label2
    mov eax, ecx
    mov edx, eax
    test eax, ecx
    je label1
    xor eax, ecx
    jne label2
    ; ...
    label2:

    - у каждой инструкции (кроме переходов) известен размер.

    = нужен оптимальный алгоритм, определяющий для каждого перехода размер его команды (короткий переход или длинный переход).

    Вроде и просто, но пока не могу придумать. Всякие вырожденные случаи ломают все мои теории :)

    P.S. Не надо отсылать меня к гуглу и исходникам FASM и других ассемблеров. Во-первых, копаться в исходниках FASM долго и тоскливо, во-вторых, мне интересен ВАШ ход мыслей при решении этой задачи.
     
  2. luckysundog

    luckysundog New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2008
    Сообщения:
    106
    ...здесь бы топологическую сортировку на графе зависимостей длин переходов друг от друга. но в графе могут быть циклы...
     
  3. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Это вы на каком языке сказали ? ;)
     
  4. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    на русском. между прочим, интересное предложение)
     
  5. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    boost.graph library поможет

    кстати такая тема уже поднималась, об оптимальной длине переходов
     
  6. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    а тупо проанализировать адреса
    если label2-addr jc+2 < 80h => jc label2 = 2 байтам
    иначе если 16 бит, то
    если label2-addr jc+4 < 32768 => jc label2 = 4 байтам
    иначе ошибка (слишком далеко)
    с jmp тоже самое, но в зависимости от операндов может указываться тип
    например jmp 80:128 не куда не денешься только jmp ptrSeg:Off = 7 байтам
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    max7C4
    а если в промежутке label2..addr jc есть невычисленные jxx?
     
  8. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    ну а предположить их максимального размера? и после проанализировать все 4-х байтные jcc переходы, у которых смещение меньше 0x0080+количество переходов между меткой и командой*2
     
  9. luckysundog

    luckysundog New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2008
    Сообщения:
    106
    а поподробнее можно насчет boost.graph? там стандартные алгоритмы реализованы, а проблема-то не в них. надо знать, как их применять в данном случае и стоит ли применять вообще.
     
  10. luckysundog

    luckysundog New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2008
    Сообщения:
    106
    Наивно предположить, что все переходы между меткой и командой маленькие? (ну раз умножаешь на 2)

    Предполагать можно всё, что угодно. Такие вот словесные описания могут нести в себе неоднозначность и вызывать недопонимание :) (к тому же в них неудобно вчитываться).
    Так что лучше ты, чтоб не быть голословным, предоставь конкретный алгоритм. Авось найдешь еще кучу ошибок...
     
  11. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    2 это для 16 бит разница между маленьким переходом и большим
     
  12. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    или вот вам еще один подход.
    предполагаете, что длина инструкции перехода равна 0 и по возможности генерируете малый jcc. после генерации всех jcc корректируете на их длины все имеющиеся и изменяете маленькие на большие при необходимости. повторяете описанные действия до тех пор, пока не прекратятся корректировки или рекурсия не достигнет пика (допустим в 5 вложенностей, что для средней длины программы более чем достаточно, но если не хватит можно и увеличить)
     
  13. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    luckysundog
    Оптимальный вриант который я применял для морфинга - двухпроходовый парсинг таблицы ветвлений. На первом проходе выполняется дизассемблирование кода и создание сырой таблицы ветвлений, где каждое ветвление определяет его адрес и положений до перехода в таблице. Второй проход - создание таблицы перекрёстных ссылок, в этой таблице каждый элемент определяет положение входа в первой таблице и содержит перекрётсную ссылку в обеих таблицах, что позволяет предельно просто трассировать таблицу и вычислять размер ветвлений. Последний проход - компиляция. Мб на днях выложу ик.
     
  14. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    Не понял? Это что, запоздалый дубль вот этой http://www.wasm.ru/forum/viewtopic.php?id=33427 темы?
     
  15. luckysundog

    luckysundog New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2008
    Сообщения:
    106
    тему не видел до этого.

    процитирую оттуда:

    это по сути и есть топологическая сортировка.

    такое допущение не устраивает.