Как написать игру для ZX Spectrum на ассемблере

       

«Длинные» циклы


Нередко могут понадобиться циклы с количеством повторений значительно больше256. На первый взгляд решение такой проблемы может показаться весьма тривиальным: достаточно использовать для размещения счетчика не отдельный регистр, а регистровую пару. Это так, но не совсем. Дело в том, что команды увеличения или уменьшения содержимого регистровых пар, оказывается, никак не влияют на флаги. Не получится использовать и операцию сравнения, разве только проверять регистры, составляющие пару, раздельно - сначала один, затем другой. Поэтому в таких случаях применяется совершенно иной подход.

Наиболее простой вариант состоит в проверке на обнуление регистровой пары: она будет содержать нулевое значение только в том случае, если оба ее регистра будут равны нулю. Иными словами, алгоритм такого цикла с использованием в качестве счетчика, для определенности, пары BC можно сформулировать так: «если регистр B не равен нулю ИЛИ регистр C не равен нулю, то перейти на начало цикла». Команда «ИЛИ» выглядит так же, как и в Бейсике - OR. Правда, в ассемблере она служит в основном совершенно для других целей, о чем мы обязательно расскажем. Но сначала приведем общий вид программы, иллюстрирующий «длинные» циклы:

LD BC,NN ;записываем в пару BC счетчик MET PUSH BC ;сохраняем ......... ;выполняем тело цикла POP BC ;восстанавливаем значение счетчика DEC BC ; и уменьшаем его на единицу LD A,B ;проверка условия завершения цикла OR C JR NZ,MET



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