1. Assembler / Говнокод #6452

    +234

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    00614A77  |.  8BF0          MOV ESI,EAX
    00614A79  |.  BB 01000000   MOV EBX,1
    00614A7E  |.  EB 01         JMP SHORT 00614A81
    00614A80  |>  43            /INC EBX
    00614A81  |>  3BF3           CMP ESI,EBX
    00614A83  |.  7C 07         |JL SHORT 00614A8C
    00614A85  |.  807C1F FF 20  |CMP BYTE PTR DS:[EDI+EBX-1],20
    00614A8A  |.^ 76 F4         \JBE SHORT 00614A80

    Оптимизация компилятора

    Запостил: Xekep, 22 Апреля 2011

    Комментарии (20) RSS

    • Куда смотреть?
      Ответить
      • К.О. Поясняет что это - стандартный цикл For со счетчиком ЕВХ, который работает с массивом чисел.
        Вот аналогичный код на Delphi:
        For i := 1 to EAX do
         If vArray[i] <= 20 then Inc(EBX);

        Как видно из кода, конечное значение ЕВХ будет равно кол-ву чисел в массиве, которые меньше или равны 20.
        Вывод: Ничего говенного (кроме использования регистра ESI в качестве счётчика, вместо которого можно было использовать ЕАХ) в коде нет.
        Ответить
      • Просто немного некорректно построенный код. ЕВХ используется и в качестве счетчика и в качестве переменной, возвращающей получившееся значение. Но если этот код - дело рук компилятора, то это говорит о полном несовершенстве последнего.
        Ответить
        • Вы просто неверно проинтерпретировали код, а ругаетесь на компилятор.

          Код не занимается никаким подсчетом количества числе меньше 20. Код занимается поиском первого числа, большего 20. Никакого "подсчета" там нет и в помине. Регистр 'EBX' используется только как индекс элемента массива (при том, что размер элемента, очевидно, равен одному байту). Его конечное значение будет равно индексу найденного элемента (если таковой найдется).

          Аналогичный код будет выглядеть так

          For i := 1 to EAX do
           If vArray[i] > 20 then break;


          Удивляться тут можно лишь неестественному порядку инструкций и манипуляциям с 'ESI' и 'EAX' (зачем было копировать 'EAX' в 'ESI'?), но компилятор - он есть компилятор.
          Ответить
          • Ох, точно! Черт, сказывается 3-х месячный отпуск! Спасибо вам! И как я сразу не догадался?
            Ответить
          • > Удивляться тут можно лишь неестественному порядку инструкций и манипуляциям с 'ESI' и 'EAX' (зачем было копировать 'EAX' в 'ESI'?), но компилятор - он есть компилятор.

            "Неестественный порядок" инструкций в цикле как раз очень даже естественный. Я где-то даже целую статью читал, зачем в цикл делается короткий джамп, только не помню уже ничего. :)

            Копирование EAX в ESI - тоже понятно: в EAX пришел аргумент функции.
            Ответить
      • В зад.
        Ответить
    • где в этой куче говно?
      Ответить
    • А компилировал, небось, с -O0?
      Ответить
    • очень смешно
      Ответить
    • это что так дизассембли декорирует?
      Ответить
    • А слева там:
      |.^ - бреинфак или птичий язык смайликов?
      Ответить
      • Похоже на ollydbg, там код в окне CPU обильно пестрит символами, облегчающими восприятие. Типа переходы вверх, вниз, точки входа, циклы, всё такое.
        Ответить
    • а если так

      MOV ESI,EAX
      XOR EBX,EBX
      @@:
      INC EBX
      CMP ESI,EBX
      JL SHORT 00614A8C
      CMP BYTE PTR DS:[EDI+EBX-1],20
      JBE @b
      Ответить
    • >@@:
      эт анон метки
      Ответить
    • хачу Visual Assembler
      Ответить

    Добавить комментарий