[Упражнение 0001] Простое упражнение декомпиляции для начинающих

Опубликовал – 23.09.2010

Ваша цель – проанализировать следующий, генерированный компилятором код и понять что он делает:

...
mov edx, Var1
mov ecx, Var2
mov eax, edx
imul ecx
mov edx, eax
imul edx, eax
mov Var3, ecx
...

У вас должен получится правильный C/C++ код или псевдокод. Не запрещается его комментировать.

Рассказать друзьям:
  • Добавить ВКонтакте заметку об этой странице
  • Мой Мир
  • Facebook
  • Twitter
  • Яндекс.Закладки
  • В Живую Ленту Google
  • Сто закладок
Комментарии (13) - [Упражнение 0001] Простое упражнение декомпиляции для начинающих

Ответ

  1. kookoorooza:

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

    Thumb up Thumb down 0

    • это очень простой пример.. собственно, на таких и надо учиться. Алгоритм обучения простой: ищешь справочник, например этот и следишь за происходящим. Через год таких задачек сможешь ломать казуалки, ваять кряки и тд )

  2. Aleksss:

    Ну у меня до написания кода на С++ пока не дошло, но вот мне что непонятно…
    В первых четырех строках идет явная подготовка к умножению со знаком Var1 и Var2. Далее младшая часть этого умножения возводится в квадрат, а потом… Var2 (который все это время лежал в EСX) заносится в Var3. Вопрос – смысл в такой запутанности действий? Или это просто пример на разбор специально лишенный логики?

    Thumb up Thumb down 0

    • Подсказывать не буду. Просто составь псевдокод, если не знаешь С++

      • Aleksss:

        Я не говорил про С++ что знаю его или нет. Я говорил про то, что не вижу смысла в этом коде. Я привел свои рассуждения. Можно ответить – я прав или нет?

        Thumb up Thumb down 0

        • естественно в этом коде логика не закончена, поэтому он определяется отрывком.. не факт что дальше ECX не будет использоваться… но мыслишь ты правильно

          • Aleksss:

            Ясно. Вообще задачки такого рода интересны. Только если брать за цель то, что Вы написали, то, возможно, интереснее было бы давать какие-то законченные процедуры, что-бы человек сразу учился их видеть в реальном коде.
            Как пример того, что я имею ввиду:
            Исследуя кусок кода на асме, имел счастье воочию видеть процедуру, которая переводит в верхний регистр некую символьную строчку. Пока я не разобрал ее по крупицам, я бы никогда не догадался, что она делает. Но потом, когда в других кодах встречал этот фрагмент, то уже мне было легче ее определить, так как я понял логику.

            Thumb up Thumb down +1

    • Другое дело, что законченные процедуры будут только вводить в заблуждения начинающих – кучами джампов и поп-пушей.. Но, думаю в дальнейшем конечно будут и такие задачи. Если есть желание помочь в составлении толковых заданий, буду очень признателен!

      • Aleksss:

        Желание помочь есть. Так как ассемблер мне лично очень близок, да и по профессии пригодится – учусь на системного программиста. Но к несчастью, пока изучение остановилось на довольно уверенном прикладном программировании под DOS и написании простых приложений под Win32 (в основном окон). Так что я могу быть скорее активным учащимся.

        Thumb up Thumb down 0

  3. xrnd:

    //int Var1,Var2,Var3;

    Var3 = Var1*Var2;

    Странно, но результат второго умножения похоже не используется?

    Thumb up Thumb down 0

Ответить

Comments

Перед отправкой формы: