До этого статью просто листал (поскольку до этого приходилось исправлять плагины, без исходников, прямо в коде), а щас что-то решил прочитать да покритиковать...
Введение тут конечно весьма краткое, возможно стоит убрать его путем вынесения в отдельную статью с полной переработкой...
Вот например:
>>"amxx файл - это простой метод" - как файл может быть методом;
>>"amx файл разбит на три части: заголовок, раздел кода и раздел данных." - А где секция с public функциями, секция с native - функциями, с таблицами "public variables" и "public tagnames" итп ?
>>"Раздел данных содержит стек, динамическую память и другие данные, такие как массивы и строки." - Раздел данных содержит и другие данные - гы. Да и опять терминологически - как файл может содержать динамическую память... Вот понимаю что файл содержит раздел, который в последующем копируется в память, причем информация содержащаяся в этой "динамической памяти" совершенно не из раздела данных (все переменные и константы разных мерностей). Опять же как файл может содержать стек, когда он всегда пустой, там от стэка только начальный адрес так-то и все...
>>"Стек используется для локальных переменных." - лучше бы уточнил сразуже какие переменные являются локальными или упомянул, что описанное через static и new это глобальные переменные и их начальные значения хранятся в секции данных.
>>"Виртуальная машина довольно проста. Она основана на двух регистрах (PRI и ALT), стеке и динамической памяти." и ниже в описании мы узнаем что там есть еще и скрытые регистры... причем сначала появляется FRM и ниже в догонку нам шлют DAT... А как насчет COD, HEA, STP, STK, FRM и CIP? (в описаниях всетаки чаще употребляют "специальные", а не "скрытые", хотя "скрытые" всетаки лучше суть отражают)
>>"Регистры - простые ячейки, используемые для хранения временной информации и их возвращения" и "Динамическая память - это простой участок памяти, используемый для хранения временных переменных."
И в регистрах хранится временная информация и в динамической памяти хранится она же (более того она записанна еще и в файле, временная и в файле
)... Так все же что там хранится ?) Если честно я не помню, чтоб встречал HEAP итп на практике...
>>"Инструкции, относящиеся к FRM, заканчиваются на '.S'. Инструкции, относящиеся к константам, заканчиваются на '.C'"
А что же заканчивается на '.I' (в примерах оно встречается) ?)
Закончу с введением, думаю и так понятно что тут куча не точностей и упущений, вдобавок при дизассемблировании может попасться опкод который тут совершенно никак не расписан... Статья вроде посвещена декомпиляции плагина на основе проги, но помимо использования программы всетаки приводятся основы и примеры дизассемблирования, которых (в особенности основ) просто не хватает или расписаны совершенно неструктурированно...
Раздел описания программы пропущу и перейду сразу к примерам... Если честно - и тут мне нехочется анализировать всю информацию, поэтому остановлюсь только на том что бросилось в глаза...
>>"Так как используется функция register_clcmd, то мы знаем ее синтаксис: register_clcmd ( const client_cmd[],const function[],flags=-1, info[]="" ) "
В данном описании 4 аргумента, а выше по анализируемому коду получается 5, вот незадача
Но оно спокойно разрешается нормальным описанием функции:
register_clcmd(const client_cmd[],const function[],flags=-1, const info[]="", FlagManager=-1);
В свое время еще так и не понял сокральный смысл "BREAK", описание типа "означает прерывание, можно понимать это, как конец строки" почему-то восприниматься не хочет, помню когда плагины редактировал без декомпиляции - брейки подпортили мне жизнь, где-то все без них работало, где-то из-за их нехватки вылетало... Вообщем в каких-то случаях не может он выполнять просто цепочку команд, без "концов строки", хотя чисто теоретически он должен выполнять коды совершенно не обращая внимания на такие "концы"... Но для дизассемблирования большего понимания конечно и не требуется
ЗЫ есть ли какиенить новости по декомпилятору, или и вправду забросил
[ADD:]А вообще щас что-то решил почитать как у BAILOPAN`а это написанно... Оказывается точно так же только по английски... Написал бы сразу же что введение это перевод...
Еще меня посетила идея преобразовывать код не в Сишный синтаксис, а в язык ассемблера (под scasm), поидее такое преобразование сделать проще... Но заглянув в исходники scasm понял что это нереализуемо, либо надо дописывать его... BAILOPAN начал видать scasm писать, но так и бросил недоделав