9.2.3. Выполнение цикла задом наперед

Циклы, в которых значение счетчика растет от единицы или нуля до некото­рой константы, можно реализовать вообще без операции сравнения, выполняя цикл в обратном направлении (и мы пользовались этим приемом неоднократно в наших примерах). Дело в том, что команда DEC counter устанавливает флаги почти так же, а команда SUB counter,! - абсолютно так же, как и команда СМР

Оптимизация на бреднем то есть следующая команда условного перехода будет обрабатывать ре­зультат сравнения счетчика с единицей:

;  Цикл от 10 до 1.

mov       dx,10

loop_start:

[тело цикла] dec dx

jnz loop_start

Уменьшить

если DX не стал нулем

продолжить цикл.

;  Цикл от 10 до 0. '

mov       dx,10 loop_start:

[тело цикла]

dec dx

jns loop_start

;  Уменьшить DX, ;  если DX не отрицателнный

продолжить цикл.

Конечно, не все циклы можно заставить выполняться в обратном направлении сразу. Например, иногда приходится изменять формат хранения массива данных также на обратный или вносить другие изменения, но в целом, если это возмож­но, всегда следует стремиться к циклам, выполняющимся задом наперед. Кроме того, если цикл построен по этому образцу, выполняется до значения счетчика, равного нулю, и регистр СХ можно освободить для выполнения роли счетчика, есть вариант воспользоваться командой LOOP, хотя в некоторых случаях в низ­коуровневой оптимизации команды DEC/JNZ оказываются более эффектив­ными.