Pull to refresh

Comments 11

В порядке придирок -- весьма и весьма много ошибок в русском языке, начиная с экспЕрИмента.

По существу вопроса: как минимум, адреса команд стоило б выводить в шестнадцатеричном виде, при реальной работе это обычно намного удобней, чем в десятичном.

В упор не вижу где в десятичном виде адреса команд?

"Наш дизассемблер" -- справа столбец адресов в явно десятичном виде: 6099, за ним 6100 и т.д.

ADD. А, блин, это я ступил: это номера строк, а не адреса. Ну, тогда адреса надо б добавить.

Да именно просто номер строки в пхп шторме, а так как минимум внутренний указатель адреса должен быть в любом случае, но хочу прежде написать простой скрипт ассемблера.

Разобрать код 8 битного процессора не такая уж и сложная задача. Я, например, изучал в детстве ассемблер Z80. Сначала казалось странным такие расположение команд. Но потом до меня дошло, что просто код команды записан в определённых битах команды. Главное эту логику уловить, если у тебя просто есть набор команд. Но с Z80 посложнее было, потому что были и двухбайтовые команды.

Так ведь есть уже несколько, которыми ромхакеры и сценеры пользуются, и даже, НЯП, плагин к Иде есть, причем там функционал весьма приличный. Целью было просто собственное саморазвитие? И сравнивали ли вы вашу разработку с другими дизасмами?

которыми ромхакеры и сценеры пользуются, и даже, НЯП, плагин к Иде есть, причем там функционал весьма приличный

можете наводку дать на такое?

Спасибо, очень интересно!

Немного покоробило include 'opcodes.php'; в конструкторе, я бы конечно загружал отдельно. Это, все-таки, жесткая зависимость, а их в объектах следует избегать. Ну и чисто на рефлексах добавил бы __DIR__ к include.

И примерно из той же серии мелкое замечание про file_put_contents прямо внутри метод disassembly(). Всё-таки, лучше это делать снаружи :) Или добавил два метода в класс, load() и write()

Ну и сам код я бы чуть-чуть оптимизировал,

if (isset($this->instructions[$capitalKey])) {
    $skipKeys = $this->instructions[$capitalKey][1] - 1;
    if ($skipKeys) {
        $value = ($skipKeys == 2) ? "" : $arrayInstructions[$_key + 2];
        $value .=  $arrayInstructions[$_key + 1];
        $resultString .= str_replace('$argument', '$' . $value, $this->instructions[$capitalKey][0]) . PHP_EOL;
    } else {
        $resultString .= $this->instructions[$capitalKey][0] . PHP_EOL;
    }
} else {
    trigger_error("Incorrect instruction $capitalKey", E_USER_ERROR);
}

Хотя не уверен, стоит ли

Вам спасибо за замечание, но тут ключевое функционал а не перфекционизм, можно конечно всё по солиду разложить, сделать фабричный метод, и DI это Я сделаю чуть позже, в планах сделать полноценный дизассемблер с поддержкой маперов. Что касается обработки ошибки, там пока в ней нет необходимости.

Sign up to leave a comment.

Articles