Изменения

ARM-декомпилятор

189 байтов добавлено, 10:19, 18 апреля 2011
м
Этап 1 — Дизассемблировать файл целиком
Внутри дизассемблера код удобно представлять в специальном виде, который всё ещё бинарный, но удобный для анализа. Каждая инструкция превращается в:
* Имя инструкции '''без''' условных суффиксов и суффикса «s» (adds/movs/…). С запасом 8 байт.
* Байт условий: <tt>S000CCCC</tt>.** Бит <tt>S </tt> = 1, если инструкция меняет флаги — либо явное «s» adds/movs/…, либо инструкции, всегда меняющие флаги — cmp, cmn, tst, teq.** Биты CCCC — <tt>CCCC</tt> — номер условия или 0, если выполняется всегда. Номера условий см.ниже.
* Опционально — байт с количеством аргументов (хотя их самый максимум 6 в инструкциях сопроцессора).
* Аргументы.
Формат аргумента:
* Непосредственный аргумент: <tt>'I', dword</tt>.* Регистр, м.б со сдвигом: <tt>'R', 0SSSRRRR, [ N10IIIII | N000RRRR ]</tt>. По порядку:** RRRR — <tt>RRRR</tt> — номер регистра (0-15)** SSS — <tt>SSS</tt> — номер функции сдвига или 000, если без сдвига, тогда аргумент занимает только 2 байта.** N — <tt>N</tt> — если дописан флаг ! (бывает по сути только в LDM/STM)** IIIII — <tt>IIIII</tt> — непосредственное значение сдвига (0-32)** RRRR — <tt>RRRR</tt> — номер регистра (0-15), на значение которого сдвигаем базовый* Обращение к памяти: <tt>'M', 0000RRRR, M0BA00IR, [ (0SSSRRRR, [ N10IIIII | N000RRRR ]) | IIIIIIII 0000IIII ]</tt>. По порядку:** RRRR — <tt>RRRR</tt> — номер базового регистра (0-15)** M — <tt>M</tt> — если смещение со знаком «-»** B — <tt>B</tt> — пре-индексированное обращение (увеличить базовый регистр на смещение, потом обратиться)** A — <tt>A</tt> — пост-индексированное обращение (обратиться, потом увеличить базовый регистр на смещение)** I — <tt>I</tt> — если смещение непосредственное. Тогда <tt>IIIIIIII 0000IIII — 0000IIII</tt> — 12-битное значение смещения (0-4095).** R — <tt>R</tt> — если смещение регистровое. Тогда последующие два байта полностью эквивалентны формату регистрового аргумента (см. предыдущий пукт).* Список регистров для LDM/STM: <tt>'L'</tt>, 16 бит маска включения регистров.* Обращение к спец.регистру (регистры сопроцессора и т. п.): <tt>'X'</tt>, 8 бит номер спец.регистра.
Номера условий удобно использовать не какие-нибудь, а такие, чтобы изменением одного бита условие можно было обратить. У меня сейчас сделаны свои номера, можно их переделать на стандартные ARM’овские: 0..13 это eq, ne, cs, cc, mi, pl, vs, vc, hi, ls, ge, lt, gt, le. А можно и не переделывать. Смысл «моих» номеров в том чтобы это было более человекочитаемо. Младший бит = 1, если это одно из сравнений на >/</>=/<=, знаковых или беззнаковых. Тогда биты выглядят как GUE1. G = Greater, U = Unsigned, E = allow Equal. Не сравнения - Остальные суффиксы: младший бит=1 0 и остаются только eq/ne (N010), vs/vc (N100), pl/mi (N110). Бит N = Negate, т.е. отрицание. Итак, получаются следующие номера:
<tab sep=bar class="wikitable sortable" head="top">
Код | xx | Значение