Assembler - язык неограниченных возможностей

         

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


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

; цикл от 10 до 2 mov dx,10 loop_start:

; [тело цикла]

dec dx ; уменьшить DX, ja loop_start ; если DX больше 1 - продолжить цикл

; цикл от 10 до 1 mov dx,10 loop_start:

; [тело цикла]

dec dx ; уменьшить DX, jae loop_start ; если DX больше или равно 1 - продолжить цикл

; цикл от 10 до 0 mov dx,10 loop_start:

; [тело цикла]

dec dx ; уменьшить DX, jns loop_start ; если DX не отрицательный - продолжить цикл

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



Содержание раздела