Программируя на Бейсике, вы привыкли, что в циклах можно задавать любые граничные значения управляющей переменной. Оказывается, в ассемблере это также возможно, хотя здесь и есть ряд ограничений, касающихся выбора регистра и, естественно, диапазона границ его изменения. В этом случае в качестве счетчика удобнее всего использовать аккумулятор, что избавит от необходимости применения дополнительных команд пересылок между регистрами. Перед началом цикла нужно занести в аккумулятор стартовое значение счетчика, а в конце сравнивать его с числом, до которого он должен измениться. Команда сравнения величины регистра A (и только его!) с числовым значением или с содержимым другого регистра записывается как CP (compare - сравнить), а в поле операндов помещается число или имя регистра, например:
CP 5 ;сравнить значение в аккумуляторе с числом 5
или
CP D ;сравнить содержимое аккумулятора с регистром D
Операция сравнения исключительно важна и ее применение, конечно, далеко не ограничивается только циклами, поэтому мы сочли необходимым привести возможные результаты сравнения регистра A с операндом X и используемые при этом мнемоники условий для переходов в табл. 5.1.
Таблица 5.1. Результаты операции сравнения
Результат сравнения | Состояние флагов | Мнемоника условия перехода |
A = X | Z = 1 | Z |
A <> X | Z = 0 | NZ |
Беззнаковое сравнение (числа от 0 до 255) | ||
A < X | CY = 0 | C |
A >= X | CY = 0 | NC |
Сравнение с учетом знака (числа от -128 до +127) | ||
A < X | S = 1 | P |
A >= X | S = 0 | M |
Используя операцию сравнения, можно написать цикл, в котором регистр A изменяется, например, от 12 до 24:
LD A,12 ;задаем начальное значение в аккумуляторе CYCLE PUSH AF ;сохраняем в стеке ......... ;тело цикла POP AF ;восстановление аккумулятора INC A ;увеличение счетчика CP 25 ;сравниваем содержимое регистра A ; с числом 25 JR C,CYCLE ;переход на начало, если меньше 25 ; (меньше или равно 24)
В данном примере ничего принципиально не изменится, если команду JR C,CYCLE заменить на JR NZ,CYCLE - результат будет тем же, но если шаг цикла окажется отличным от единицы, то второй вариант может не сработать, поэтому предпочтительнее все же применять проверку флага переноса, а не нуля.