- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 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
Вот аналогичный код на Delphi:
Как видно из кода, конечное значение ЕВХ будет равно кол-ву чисел в массиве, которые меньше или равны 20.
Вывод: Ничего говенного (кроме использования регистра ESI в качестве счётчика, вместо которого можно было использовать ЕАХ) в коде нет.
Код не занимается никаким подсчетом количества числе меньше 20. Код занимается поиском первого числа, большего 20. Никакого "подсчета" там нет и в помине. Регистр 'EBX' используется только как индекс элемента массива (при том, что размер элемента, очевидно, равен одному байту). Его конечное значение будет равно индексу найденного элемента (если таковой найдется).
Аналогичный код будет выглядеть так
Удивляться тут можно лишь неестественному порядку инструкций и манипуляциям с 'ESI' и 'EAX' (зачем было копировать 'EAX' в 'ESI'?), но компилятор - он есть компилятор.
"Неестественный порядок" инструкций в цикле как раз очень даже естественный. Я где-то даже целую статью читал, зачем в цикл делается короткий джамп, только не помню уже ничего. :)
Копирование EAX в ESI - тоже понятно: в EAX пришел аргумент функции.
|.^ - бреинфак или птичий язык смайликов?
MOV ESI,EAX
XOR EBX,EBX
@@:
INC EBX
CMP ESI,EBX
JL SHORT 00614A8C
CMP BYTE PTR DS:[EDI+EBX-1],20
JBE @b
похапешник детектед
Это его глаза, после 30 часов отладки.
эт анон метки