Учебник по DCPU-16. Часть 2: Условные операторы
В прошлом уроке мы рассмотрели с вами базовые арифметические операции, доступные в DCPU-16 и посмотрели, какие регистры находятся в нашем распоряжении. Теперь приступим к самой «вкусной» и, несомненно, важной теме практически в любом языке программирования – условным операторам.
Условные операторы позволяют создавать ветвления в алгоритмах.
Пример:
Пояснение: Пусть нам даны некоторые переменные A, B и C и мы не знаем, чему они равны, да и не особо как-то хочется. Однако, мы точно знаем, что если сумма первых двух будет больше десяти, то нам необходимо быстро и решительно присвоить третьей значение 8, в противном же случае – оставить всё как есть. Для этого служит блок условия “A + B > 10?”: если это утверждение истинно, то мы переходим по левому плечу и выполняем операцию присвоения значения. Иначе – идём в конец программы.
В языке DCPU-16 для обработки разветвлений используются следующие команды:
Код | Команда | Пояснение |
0xC | IFE a, b | Следующая после этой команда будет выполнена только если a равняется b |
0xD | IFN a, b | Следующая после этой команда будет выполнена только если a не равняется b |
0xE | IFG a, b | Следующая после этой команда будет выполнена только если a больше b |
- IFE – If Equal To (Если равняются…)
IFN – If Not Equal To (Если не равняются…)
IFG – If Greater Than (Если больше, чем…)
Теперь о каждой по порядку.
IFE
Команда IFE позволяет проверить, равняются ли значения указанных в аргументах регистров.
Приведём следующий пример:
:init
set a, 2 set b, 6 set i, a add i, b ife i, 16 set c, 4 ife i, 8 set c, 8 :loop set PC, loop |
- Заметки на полях
Привыкайте делать отступы и вообще следить за красотой кода. Во-первых, вы не будете выглядеть, как перевыпивший Снусмумрик, а во-вторых, такой код будет удобно читать. В DCPU-16 принято делать дополнительные отступы для команд, следующих за условными операторами (посмотрите, как выровнены ife и следующая за ней set).
Мы устанавливаем значения A и B равными 2 и 6 соответственно. После этого мы суммируем их и результат сохраняем в регистре i. Следом идут две команды разветвлений IFE:
- ■ Первая (ife i, 16) проверяет, равна ли сумма 16. Если равна, то записывает 4 в регистр C.
■ Вторая (ife i, 8) проверяет, равна ли сумма 8. Если равна, то записывает 8 в регистр C.
Несложно сообразить, что после выполнения программы содержимым регистра C окажется число 8 (так как A + B = 8).
* * * * * *
IFN
Команда IFN позволяет проверить, не равняются ли значения указанных в аргументах регистров.
Замените в прошлом примере IFE на IFN и запустите программу. После завершения исполнения, в регистре C будет находиться число 4.
* * * * * *
IFG
Команда IFG позволяет проверить, больше ли значение первого указанного в аргументах регистра, чем второго. Важно запомнить порядок: IFG выполнит следующую за ней команду тогда и только тогда, когда A > B.
Решим задачу, о которой шла речь в начале поста:
:init
set a, 1 set b, 4 set c, a add c, b ifg c, 10 set c, 8 :loop set PC, loop |
Пример использования: Ограничение значения
Позже, когда мы будем работать с вводом с клавиатуры, нам может потребоваться ограничивать вводимое пользователем значение.
Предположим, что значение, которое требуется ограничить, записано в регистре А. Нам необходимо, что введённое число было больше 50, но меньше 200. Напишем программу, которая будет это реализовывать:
:init
set a, 150 ifg a, 200 set a, 200 ifg 50, a set a, 50 :loop set PC, loop |
- Заметки на полях
Если нужно проверить A < B, достаточно просто переставить местами названия регистров. Так, ifg 50, a будет проверять условие 50 > a, то есть меньше ли значение регистра А числа 50.
Запускайте программу. После исполнения кода, в регистре А будет храниться число 150, то есть то, которое было изначально. Это логично, согласитесь: 50 < 150 < 200.
Поиграйтесь с установкой первоначального значения регистром А: поставьте 300 или 25 и увидите, что после того, как программа отработает, в первом случае, в нём будет храниться число 200, а во втором – 50.
За сим разрешите откланяться, удачных сражений с кодом. fr4ntic out.