Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ДОКУМЕНТАЦИЯ
- ____________________________________________
- Синтаксис:
- ____________________
- Поддерживается неограниченное количество строк кода программы,
- каждая строка не более 255 символов. Для оформления кода можно
- использовать символы пробела, табуляции, перехода на новую строку.
- Поддерживается директива #INCLUDE (вложенные INCLUDE не реализованы
- - и без того пока проблем хватает)
- Пример: #INCLUDE utils.bfh
- $o0 - указатель на заголовок операционной области памяти.
- Может использоваться для передачи параметров процедуре.
- $o1 - указатель на следующий элемент после заголова.
- $o-1 - указатель на предыдущий элемент после заголовка.
- Следует помнить, что команды ALLOC и FREE смещают позицию
- заголовка, соответственно, вправо и влево.
- Типы:
- ____________________
- str - строка текста. Для одновременного ввода поддерживаются
- строки не длиннее 255 символов.
- Обозначения некоторых символов:
- \n - перевод строки
- \t - табуляция
- \s - пробел
- char - Символ, число от 0 до 255.
- int - 8/16-битное число (в зависимости от реализации BF)
- Стоит помнить, что это число по модулю 256/65536.
- addr - адрес ячейки памяти. Должен быть меньше значения,
- заданного командой MEMORY. Нумерация адресов начинается
- с нуля. Существует ограничение реализации BF на
- максимальный объём памяти, порядка 30000 ячеек.
- Команды:
- ____________________
- ================= СТРУКТУРА ПРОГРАММЫ ====================
- MEMORY int - задать количество выделяемой динамической памяти.
- Обычно предел чуть менее 30000 ячеек.
- Внимание! Перераспределение памяти во время работы
- программы возможно, но при этом возможны серьёзные
- последствия.
- Внимание! Чем меньше памяти зарезервировано, тем короче код программы.
- Если Вам вовсе не нужна статически выделенная память, не используйте
- эту команду.
- ===================== АРИФМЕТИКА =========================
- ZERO addr - обнулить ячейку addr
- INC addr - увеличить значение в ячейке addr на 1
- ADD addr,int - увеличить значение в ячейке addr на int
- ADD addr1,addr2 - увеличить значение в ячейке addr1 на значение addr2
- MUL addr,int - умножить значение в ячейке addr в int раз
- DIV addr,int - разделить значение в ячейке addr на int
- Внимание! Данная команда работает только если
- число делится нацело. В противном случае
- неизбежны проблемы.
- ================= ДВОИЧНАЯ АРИФМЕТИКА ====================
- NOT addr - обращение значения по адресу addr.
- Внимание! Всегда помните, какова разрядность
- обращаемого числа. В зависимости от разрядности
- значения будут различаться.
- ========================= ПАМЯТЬ =========================
- MOV addr1,addr2 - скопировать значение из ячейки addr1 в ячейку addr2
- MOV addr,int - поместить значение int в ячейку addr
- MOV addr,str - поместить строку str по адресу addr
- ALLOC int - выделить int ячеек динамической (операционной)
- памяти для последующего использования.
- FREE int - освободить int ячеек динамической (операционной)
- памяти. Память при этом не будет обнулена.
- ===================== ВВОД/ВЫВОД =========================
- PRINTLINE addr - вывести на экран строку по адресу addr.
- Внимание! Для успешного вывода строка должна быть
- экранирована нуль-символами с обеих сторон.
- PRINTLINE str - вывести на эран строку str.
- Работает эффективнее, чем аналог с адресом,
- желательно использовать этот вариант где возможно.
- PRINTCHAR addr - вывести на экран символ по адресу addr.
- PRINTCHAR char - вывести на экран символ char.
- READCHAR addr - получить от пользователя один символ и поместить
- его по адресу addr.
- READLINE addr, int
- - получить от пользователя строку длины int и положить её
- по адресу addr.
- Внимание! Не забывайте экранировать строки, полученные с
- помощью данной команды, для вывода.
- ======================== ПРОЧИЕ ==========================
- RAW str - прямая запись в код программы на BF. Следует
- использовать с осторожностью т.к. код может быть
- вставлен не совсем там, где Вы этого ожидаете.
- Команды PBRAIN:
- ____________________
- Внимание! Если Ваша версия интерпретатора BF не поддерживает
- PBRAIN, не используйте данные команды -- иначе программа будет
- неработоспособной.
- ====================== СРАВНЕНИЕ =========================
- CMP0_EQ addr,str1 str2
- - сравнивает ячейку addr с нулём и выполняет процедуру
- str1 если addr=0, иначе выполняет процедуру str2.
- CMP0_EQ addr,str1
- - сравнивает ячейку addr с нулём и выполняет процедуру
- с именем str1 если значение по адресу addr равно 0
- CMP0_EQ addr,,str1
- - сравнивает ячейку addr с нулём и выполняет процедуру
- с именем str1 если значение по адресу addr не равно 0
- CMP_EQ addr1,addr2,str1 str2
- - сравнивает значения ячеек addr1 и addr2. В случае
- равенства выполняет процедуру str1, иначе str2.
- CMP_EQ addr1,addr2,str1
- - сравнивает значения ячеек addr1 и addr2. В случае
- равенства выполняет процедуру str1.
- CMP_EQ addr1,addr2,,str1
- - сравнивает значения ячеек addr1 и addr2. В случае
- неравенства выполняет процедуру str1.
- CMP_EQ addr1,int,str1 str2
- - сравнивает значение ячейки addr1 с int. В случае
- равенства выполняет процедуру str1, иначе str2.
- CMP_EQ addr1,int,str1
- - сравнивает значение ячейки addr1 с int. В случае
- равенства выполняет процедуру str1.
- CMP_EQ addr1,int,,str1
- - сравнивает значение ячейки addr1 с int. В случае
- неравенства выполняет процедуру str1.
- CMP_LESS addr1,int,str1 str2
- - сравнивает значение ячейки addr1 с int. Если
- значение по адресу addr1 меньше int, то выполняется
- процедура str1, иначе str2.
- CMP_LESS addr1,int,str1
- - сравнивает значение ячейки addr1 с int. Если
- значение по адресу addr1 меньше int, то выполняется
- процедура str1.
- CMP_LESS addr1,int,,str1
- - сравнивает значение ячейки addr1 с int. Если
- значение по адресу addr1 больше либо равно int,
- то выполняется процедура str1.
- Осторожно! Реализация CMP_LESS работает крайне медленно.
- ====================== ПРОЦЕДУРЫ =========================
- PROCEDURE str
- - описание процедуры с именем str без параметров.
- Процедуры могут быть вложенными.
- PROCEDURE str int
- - описание процедуры с именем str и числом
- параметров int. Процедуры могут быть вложенными.
- EXTERN PROCEDURE str
- - объявление процедуры с именем str.
- END PROCEDURE - завершает процедуру (необходимо для
- соблюдения синтаксиса PB).
- CALL str - вызывает процедуру. После окончания
- процедуры управление будет передано обратно.
- JMP в привычном виде в BF нет, не обессудьте.
- ПРИМЕРЫ
- ____________________________________________
- Арифметика:
- ____________________
- MEMORY 1
- PRINTLINE "15/3="
- MOV 00,15
- DIV 00,3
- ADD 00,48
- PRINTCHAR 00
- END
- Hello World:
- ____________________
- MEMORY 0
- PRINTLINE "Hello\sWorld!"
- END
- Less/More:
- ____________________
- MEMORY 2
- PROCEDURE less
- MOV 01,49
- END PROCEDURE
- MOV 00,0
- MOV 01,48
- CMP_LESS 00,48,less
- PRINTCHAR 01
- END
- Процедуры:
- ____________________
- procedures.bfa:
- MEMORY 3
- #INCLUDE procedures.bfh
- MOV 00,3
- MOV 01,1
- MOV 01,2
- MOV 02,3
- CMP_EQ 01,2,printgood printbad
- END
- procedures.bfh:
- PROCEDURE printgood
- PRINTLINE "Good!"
- END PROCEDURE
- PROCEDURE printbad
- PRINTLINE "Bad!"
- END PROCEDURE
- Тест основных операций:
- ____________________
- MEMORY 3
- PROCEDURE good
- PRINTLINE "\tOK\n"
- END PROCEDURE
- PROCEDURE bad
- PRINTLINE "\tFAILED!\n"
- END PROCEDURE
- // Проверка арифметики
- PRINTLINE "Compare\s0\sprecheck\s"
- CMP0_EQ 01,good bad
- PRINTLINE "Arithmetic\scheck\s"
- MOV 01,9
- MUL 01,2
- ADD 01,3
- DIV 01,7
- SUB 01,3
- CMP0_EQ 01,good bad
- // Проверка FASTMOV
- PRINTLINE "FASTMOV\scheck\s1\s"
- MOV 02,10
- FASTMOV 01,02
- CMP_EQ 01,10,good bad
- PRINTLINE "FASTMOV\scheck\s2\s"
- CMP_EQ 02,00,good bad
- // Проверка функций сравнения
- PRINTLINE "Compare\scheck\s1\s"
- MOV 01,10
- MOV 02,200
- CMP_LESS 01,02,good bad
- PRINTLINE "Compare\scheck\s2\s"
- MOV 01,200
- CMP_LESS 01,02,bad good
- PRINTLINE "Compare\scheck\s3\s"
- MOV 01,0
- MOV 02,0
- CMP_LESS 01,02,bad good
- PRINTLINE "Compare\scheck\s4\s"
- MOV 01,240
- MOV 02,200
- CMP_LESS 01,02,bad good
- PRINTLINE "Compare\scheck\s5\s"
- CMP_EQ 01,02,bad good
- PRINTLINE "Compare\scheck\s6\s"
- MOV 01,200
- CMP_EQ 01,02,good bad
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement