Advertisement
Guest User

BFAssembler

a guest
Jan 29th, 2013
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.08 KB | None | 0 0
  1. ДОКУМЕНТАЦИЯ
  2. ____________________________________________
  3.  
  4. Синтаксис:
  5. ____________________
  6.  
  7. Поддерживается неограниченное количество строк кода программы,
  8. каждая строка не более 255 символов. Для оформления кода можно
  9. использовать символы пробела, табуляции, перехода на новую строку.
  10.  
  11. Поддерживается директива #INCLUDE (вложенные INCLUDE не реализованы
  12. - и без того пока проблем хватает)
  13.  
  14. Пример: #INCLUDE utils.bfh
  15.  
  16. $o0 - указатель на заголовок операционной области памяти.
  17. Может использоваться для передачи параметров процедуре.
  18. $o1 - указатель на следующий элемент после заголова.
  19. $o-1 - указатель на предыдущий элемент после заголовка.
  20. Следует помнить, что команды ALLOC и FREE смещают позицию
  21. заголовка, соответственно, вправо и влево.
  22.  
  23. Типы:
  24. ____________________
  25.  
  26. str - строка текста. Для одновременного ввода поддерживаются
  27. строки не длиннее 255 символов.
  28. Обозначения некоторых символов:
  29. \n - перевод строки
  30. \t - табуляция
  31. \s - пробел
  32.  
  33. char - Символ, число от 0 до 255.
  34.  
  35. int - 8/16-битное число (в зависимости от реализации BF)
  36. Стоит помнить, что это число по модулю 256/65536.
  37.  
  38. addr - адрес ячейки памяти. Должен быть меньше значения,
  39. заданного командой MEMORY. Нумерация адресов начинается
  40. с нуля. Существует ограничение реализации BF на
  41. максимальный объём памяти, порядка 30000 ячеек.
  42.  
  43.  
  44. Команды:
  45. ____________________
  46.  
  47. ================= СТРУКТУРА ПРОГРАММЫ ====================
  48.  
  49. MEMORY int - задать количество выделяемой динамической памяти.
  50. Обычно предел чуть менее 30000 ячеек.
  51.  
  52. Внимание! Перераспределение памяти во время работы
  53. программы возможно, но при этом возможны серьёзные
  54. последствия.
  55.  
  56. Внимание! Чем меньше памяти зарезервировано, тем короче код программы.
  57. Если Вам вовсе не нужна статически выделенная память, не используйте
  58. эту команду.
  59.  
  60. ===================== АРИФМЕТИКА =========================
  61.  
  62. ZERO addr - обнулить ячейку addr
  63. INC addr - увеличить значение в ячейке addr на 1
  64. ADD addr,int - увеличить значение в ячейке addr на int
  65. ADD addr1,addr2 - увеличить значение в ячейке addr1 на значение addr2
  66. MUL addr,int - умножить значение в ячейке addr в int раз
  67.  
  68. DIV addr,int - разделить значение в ячейке addr на int
  69. Внимание! Данная команда работает только если
  70. число делится нацело. В противном случае
  71. неизбежны проблемы.
  72.  
  73. ================= ДВОИЧНАЯ АРИФМЕТИКА ====================
  74.  
  75. NOT addr - обращение значения по адресу addr.
  76. Внимание! Всегда помните, какова разрядность
  77. обращаемого числа. В зависимости от разрядности
  78. значения будут различаться.
  79.  
  80.  
  81. ========================= ПАМЯТЬ =========================
  82.  
  83. MOV addr1,addr2 - скопировать значение из ячейки addr1 в ячейку addr2
  84. MOV addr,int - поместить значение int в ячейку addr
  85.  
  86. MOV addr,str - поместить строку str по адресу addr
  87.  
  88. ALLOC int - выделить int ячеек динамической (операционной)
  89. памяти для последующего использования.
  90. FREE int - освободить int ячеек динамической (операционной)
  91. памяти. Память при этом не будет обнулена.
  92.  
  93. ===================== ВВОД/ВЫВОД =========================
  94.  
  95. PRINTLINE addr - вывести на экран строку по адресу addr.
  96. Внимание! Для успешного вывода строка должна быть
  97. экранирована нуль-символами с обеих сторон.
  98.  
  99. PRINTLINE str - вывести на эран строку str.
  100. Работает эффективнее, чем аналог с адресом,
  101. желательно использовать этот вариант где возможно.
  102.  
  103. PRINTCHAR addr - вывести на экран символ по адресу addr.
  104. PRINTCHAR char - вывести на экран символ char.
  105.  
  106. READCHAR addr - получить от пользователя один символ и поместить
  107. его по адресу addr.
  108.  
  109. READLINE addr, int
  110. - получить от пользователя строку длины int и положить её
  111. по адресу addr.
  112. Внимание! Не забывайте экранировать строки, полученные с
  113. помощью данной команды, для вывода.
  114.  
  115. ======================== ПРОЧИЕ ==========================
  116.  
  117. RAW str - прямая запись в код программы на BF. Следует
  118. использовать с осторожностью т.к. код может быть
  119. вставлен не совсем там, где Вы этого ожидаете.
  120.  
  121.  
  122. Команды PBRAIN:
  123. ____________________
  124.  
  125. Внимание! Если Ваша версия интерпретатора BF не поддерживает
  126. PBRAIN, не используйте данные команды -- иначе программа будет
  127. неработоспособной.
  128.  
  129. ====================== СРАВНЕНИЕ =========================
  130.  
  131. CMP0_EQ addr,str1 str2
  132. - сравнивает ячейку addr с нулём и выполняет процедуру
  133. str1 если addr=0, иначе выполняет процедуру str2.
  134. CMP0_EQ addr,str1
  135. - сравнивает ячейку addr с нулём и выполняет процедуру
  136. с именем str1 если значение по адресу addr равно 0
  137. CMP0_EQ addr,,str1
  138. - сравнивает ячейку addr с нулём и выполняет процедуру
  139. с именем str1 если значение по адресу addr не равно 0
  140.  
  141. CMP_EQ addr1,addr2,str1 str2
  142. - сравнивает значения ячеек addr1 и addr2. В случае
  143. равенства выполняет процедуру str1, иначе str2.
  144. CMP_EQ addr1,addr2,str1
  145. - сравнивает значения ячеек addr1 и addr2. В случае
  146. равенства выполняет процедуру str1.
  147. CMP_EQ addr1,addr2,,str1
  148. - сравнивает значения ячеек addr1 и addr2. В случае
  149. неравенства выполняет процедуру str1.
  150.  
  151. CMP_EQ addr1,int,str1 str2
  152. - сравнивает значение ячейки addr1 с int. В случае
  153. равенства выполняет процедуру str1, иначе str2.
  154. CMP_EQ addr1,int,str1
  155. - сравнивает значение ячейки addr1 с int. В случае
  156. равенства выполняет процедуру str1.
  157. CMP_EQ addr1,int,,str1
  158. - сравнивает значение ячейки addr1 с int. В случае
  159. неравенства выполняет процедуру str1.
  160.  
  161. CMP_LESS addr1,int,str1 str2
  162. - сравнивает значение ячейки addr1 с int. Если
  163. значение по адресу addr1 меньше int, то выполняется
  164. процедура str1, иначе str2.
  165. CMP_LESS addr1,int,str1
  166. - сравнивает значение ячейки addr1 с int. Если
  167. значение по адресу addr1 меньше int, то выполняется
  168. процедура str1.
  169. CMP_LESS addr1,int,,str1
  170. - сравнивает значение ячейки addr1 с int. Если
  171. значение по адресу addr1 больше либо равно int,
  172. то выполняется процедура str1.
  173.  
  174. Осторожно! Реализация CMP_LESS работает крайне медленно.
  175.  
  176.  
  177. ====================== ПРОЦЕДУРЫ =========================
  178.  
  179. PROCEDURE str
  180. - описание процедуры с именем str без параметров.
  181. Процедуры могут быть вложенными.
  182.  
  183. PROCEDURE str int
  184. - описание процедуры с именем str и числом
  185. параметров int. Процедуры могут быть вложенными.
  186.  
  187. EXTERN PROCEDURE str
  188. - объявление процедуры с именем str.
  189.  
  190. END PROCEDURE - завершает процедуру (необходимо для
  191. соблюдения синтаксиса PB).
  192.  
  193. CALL str - вызывает процедуру. После окончания
  194. процедуры управление будет передано обратно.
  195. JMP в привычном виде в BF нет, не обессудьте.
  196.  
  197. ПРИМЕРЫ
  198. ____________________________________________
  199.  
  200. Арифметика:
  201. ____________________
  202.  
  203. MEMORY 1
  204. PRINTLINE "15/3="
  205. MOV 00,15
  206. DIV 00,3
  207. ADD 00,48
  208. PRINTCHAR 00
  209. END
  210.  
  211. Hello World:
  212. ____________________
  213.  
  214. MEMORY 0
  215. PRINTLINE "Hello\sWorld!"
  216. END
  217.  
  218. Less/More:
  219. ____________________
  220.  
  221. MEMORY 2
  222.  
  223. PROCEDURE less
  224. MOV 01,49
  225. END PROCEDURE
  226.  
  227. MOV 00,0
  228. MOV 01,48
  229. CMP_LESS 00,48,less
  230.  
  231. PRINTCHAR 01
  232.  
  233.  
  234. END
  235.  
  236. Процедуры:
  237. ____________________
  238.  
  239. procedures.bfa:
  240.  
  241. MEMORY 3
  242.  
  243. #INCLUDE procedures.bfh
  244.  
  245. MOV 00,3
  246. MOV 01,1
  247. MOV 01,2
  248. MOV 02,3
  249. CMP_EQ 01,2,printgood printbad
  250.  
  251. END
  252.  
  253. procedures.bfh:
  254.  
  255. PROCEDURE printgood
  256. PRINTLINE "Good!"
  257. END PROCEDURE
  258.  
  259. PROCEDURE printbad
  260. PRINTLINE "Bad!"
  261. END PROCEDURE
  262.  
  263. Тест основных операций:
  264. ____________________
  265.  
  266. MEMORY 3
  267.  
  268. PROCEDURE good
  269. PRINTLINE "\tOK\n"
  270. END PROCEDURE
  271.  
  272. PROCEDURE bad
  273. PRINTLINE "\tFAILED!\n"
  274. END PROCEDURE
  275.  
  276. // Проверка арифметики
  277. PRINTLINE "Compare\s0\sprecheck\s"
  278. CMP0_EQ 01,good bad
  279.  
  280. PRINTLINE "Arithmetic\scheck\s"
  281. MOV 01,9
  282. MUL 01,2
  283. ADD 01,3
  284. DIV 01,7
  285. SUB 01,3
  286. CMP0_EQ 01,good bad
  287.  
  288. // Проверка FASTMOV
  289. PRINTLINE "FASTMOV\scheck\s1\s"
  290. MOV 02,10
  291. FASTMOV 01,02
  292. CMP_EQ 01,10,good bad
  293. PRINTLINE "FASTMOV\scheck\s2\s"
  294. CMP_EQ 02,00,good bad
  295.  
  296. // Проверка функций сравнения
  297. PRINTLINE "Compare\scheck\s1\s"
  298. MOV 01,10
  299. MOV 02,200
  300. CMP_LESS 01,02,good bad
  301.  
  302. PRINTLINE "Compare\scheck\s2\s"
  303. MOV 01,200
  304. CMP_LESS 01,02,bad good
  305.  
  306. PRINTLINE "Compare\scheck\s3\s"
  307. MOV 01,0
  308. MOV 02,0
  309. CMP_LESS 01,02,bad good
  310.  
  311. PRINTLINE "Compare\scheck\s4\s"
  312. MOV 01,240
  313. MOV 02,200
  314. CMP_LESS 01,02,bad good
  315.  
  316. PRINTLINE "Compare\scheck\s5\s"
  317. CMP_EQ 01,02,bad good
  318.  
  319. PRINTLINE "Compare\scheck\s6\s"
  320. MOV 01,200
  321. CMP_EQ 01,02,good bad
  322.  
  323. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement