Guest User

Untitled

a guest
Jul 22nd, 2019
638
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.82 KB | None | 0 0
  1. # Инициализация различных переменных
  2. L B#16#0
  3. T #CHECK_N # Счетчик успешно пройденных проверок
  4. T #COUNTER_N # Счетчик общего количества проверок
  5. L P#DBX 0.0
  6. T #POINTER # Указатель на текущую инструкцию
  7. CLR
  8. = #PRE_RET_VAL
  9.  
  10. # Основной цикл работы интерпретатора байт-кода
  11. LOOP: L #POINTER
  12. LAR1
  13. OPN DB 100
  14. L DBLG
  15. TAR1
  16. <=D # Проверка выхода указателя за пределы программы
  17. JC FINISH
  18. L DW#16#0
  19. T #REG0
  20. L #TEMP6
  21. L W#16#0
  22. <>I
  23. JC M00d
  24. L P#DBX 0.0
  25. LAR1
  26.  
  27. # Конструкция switch - case для обработки различных опкодов
  28. M00d: L B [AR1,P#0.0]
  29. T #OPCODE
  30. L W#16#1
  31. ==I
  32. JC OPCODE_1
  33. L #OPCODE
  34. L W#16#2
  35. ==I
  36. JC OPCODE_2
  37. L #OPCODE
  38. L W#16#3
  39. ==I
  40. JC OPCODE_3
  41. L #OPCODE
  42. L W#16#4
  43. ==I
  44. JC OPCODE_4
  45. L #OPCODE
  46. L W#16#5
  47. ==I
  48. JC OPCODE_5
  49. L #OPCODE
  50. L W#16#6
  51. ==I
  52. JC OPCODE_6
  53. JU OPCODE_OTHER
  54.  
  55. # Обработчик опкода 01: загрузка значения из DB101[X] в регистр Y
  56. # OP01(X, Y): REG[Y] = DB101[X]
  57. OPCODE_1: +AR1 P#1.0
  58. L P#DBX 0.0
  59. LAR2
  60. L B [AR1,P#0.0] # Загрузка аргумента X (индекс в DB101)
  61. L C#8
  62. *I
  63. +AR2
  64. +AR1 P#1.0
  65. L B [AR1,P#0.0] # Загрузка аргумента Y (индекс регистра)
  66. JL M003 # Аналог switch - case на основе значения Y
  67. JU M001 # для выбора необходимого регистра для записи.
  68. JU M002 # Подобные конструкции используются и в других
  69. JU M004 # операциях ниже для аналогичных целей
  70. M003: JU LOOPEND
  71. M001: OPN DB 101
  72. L B [AR2,P#0.0]
  73. T #REG0 # Запись значения DB101[X] в REG[0]
  74. JU PRE_LOOPEND
  75. M002: OPN DB 101
  76. L B [AR2,P#0.0]
  77. T #REG1 # Запись значения DB101[X] в REG[1]
  78. JU PRE_LOOPEND
  79. M004: OPN DB 101
  80. L B [AR2,P#0.0]
  81. T #REG2 # Запись значения DB101[X] в REG[2]
  82. JU PRE_LOOPEND
  83.  
  84. # Обработчик опкода 02: загрузка значения X в регистр Y
  85. # OP02(X, Y): REG[Y] = X
  86. OPCODE_2: +AR1 P#1.0
  87. L B [AR1,P#0.0]
  88. T #TEMP3
  89. +AR1 P#1.0
  90. L B [AR1,P#0.0]
  91. JL M009
  92. JU M00b
  93. JU M00a
  94. JU M00c
  95. M009: JU LOOPEND
  96. M00b: L #TEMP3
  97. T #REG0
  98. JU PRE_LOOPEND
  99. M00a: L #TEMP3
  100. T #REG1
  101. JU PRE_LOOPEND
  102. M00c: L #TEMP3
  103. T #REG2
  104. JU PRE_LOOPEND
  105.  
  106. # Опкод 03 не используется в программе, поэтому пропустим его
  107. ...
  108.  
  109. # Обработчик опкода 04: сравнение регистров X и Y
  110. # OP04(X, Y): REG[0] = 0; REG[X] = (REG[X] == REG[Y])
  111. OPCODE_4: +AR1 P#1.0
  112. L B [AR1,P#0.0]
  113. T #TEMP7 # первый аргумент - X
  114. L P#M 100.0
  115. LAR2
  116. L #TEMP7
  117. L C#8
  118. *I
  119. +AR2
  120. TAR2 #TEMP9 # REG[X]
  121. +AR1 P#1.0
  122. L B [AR1,P#0.0]
  123. T #TEMP8
  124. L P#M 100.0
  125. LAR2
  126. L #TEMP8
  127. L C#8
  128. *I
  129. +AR2
  130. TAR2 #TEMP10 # REG[Y]
  131. TAR1 #POINTER
  132. LAR1 #TEMP9 # REG[X]
  133. LAR2 #TEMP10 # REG[Y]
  134. L B [AR1,P#0.0]
  135. L B [AR2,P#0.0]
  136. AW
  137. INVI
  138. T #TEMP12 # ~(REG[Y] & REG[X])
  139. L B [AR1,P#0.0]
  140. L B [AR2,P#0.0]
  141. OW
  142. L #TEMP12
  143. AW # (~(REG[Y] & REG[X])) & (REG[Y] | REG[X]) - аналог проверки на равенство
  144. T B [AR1,P#0.0]
  145. L DW#16#0
  146. T #REG0
  147. L MB 101
  148. T #REG1
  149. L MB 102
  150. T #REG2
  151. L #POINTER
  152. LAR1
  153. JU PRE_LOOPEND
  154.  
  155. # Обработчик опкода 05: вычитание регистра Y из X
  156. # OP05(X, Y): REG[0] = 0; REG[X] = REG[X] - REG[Y]
  157. OPCODE_5: +AR1 P#1.0
  158. L B [AR1,P#0.0]
  159. T #TEMP7
  160. L P#M 100.0
  161. LAR2
  162. L #TEMP7
  163. L C#8
  164. *I
  165. +AR2
  166. TAR2 #TEMP9 # REG[X]
  167. +AR1 P#1.0
  168. L B [AR1,P#0.0]
  169. T #TEMP8
  170. L P#M 100.0
  171. LAR2
  172. L #TEMP8
  173. L C#8
  174. *I
  175. +AR2
  176. TAR2 #TEMP10 # REG[Y]
  177. TAR1 #POINTER
  178. LAR1 #TEMP9
  179. LAR2 #TEMP10
  180. L B [AR1,P#0.0]
  181. L B [AR2,P#0.0]
  182. -I # ACCU1 = ACCU2 - ACCU1, REG[X] - REG[Y]
  183. T B [AR1,P#0.0]
  184. L DW#16#0
  185. T #REG0
  186. L MB 101
  187. T #REG1
  188. L MB 102
  189. T #REG2
  190. L #POINTER
  191. LAR1
  192. JU PRE_LOOPEND
  193.  
  194. # Обработчик опкода 06: инкремент #CHECK_N при равенстве регистров X и Y
  195. # OP06(X, Y): #CHECK_N += (1 if REG[X] == REG[Y] else 0)
  196. OPCODE_6: L #COUNTER_N
  197. INC 1
  198. T #COUNTER_N
  199. +AR1 P#1.0
  200. L B [AR1,P#0.0]
  201. T #TEMP7 # REG[X]
  202. L P#M 100.0
  203. LAR2
  204. L #TEMP7
  205. L C#8
  206. *I
  207. +AR2
  208. TAR2 #TEMP9 # REG[X]
  209. +AR1 P#1.0
  210. L B [AR1,P#0.0]
  211. T #TEMP8
  212. L P#M 100.0
  213. LAR2
  214. L #TEMP8
  215. L C#8
  216. *I
  217. +AR2
  218. TAR2 #TEMP10 # REG[Y]
  219. TAR1 #POINTER
  220. LAR1 #TEMP9 # REG[Y]
  221. LAR2 #TEMP10 # REG[X]
  222. L B [AR1,P#0.0]
  223. L B [AR2,P#0.0]
  224. ==I
  225. JCN M013
  226. JU M014
  227. M013: L P#DBX 0.0
  228. LAR1
  229. T #POINTER
  230. L B#16#0
  231. T #TEMP6
  232. JU PRE_LOOPEND
  233. M014: L #POINTER
  234. LAR1
  235. # Инкремент значения #CHECK_N
  236. L #CHECK_N
  237. L L#1
  238. +I
  239. T #CHECK_N
  240. JU PRE_LOOPEND
  241.  
  242. PRE_LOOPEND: L #REG0
  243. T MB 100
  244. L #REG1
  245. T MB 101
  246. L #REG2
  247. T MB 102
  248. +AR1 P#1.0
  249. L #TEMP6
  250. + 1
  251. T #TEMP6
  252. JU LOOPEND
  253.  
  254. OPCODE_OTHER: L P#DBX 0.0
  255. LAR1
  256. L 0
  257. T #TEMP6
  258. TAR1 #POINTER
  259.  
  260. LOOPEND: TAR1 #POINTER
  261. CLR
  262. = #TEMP16
  263. L #CHECK_N
  264. L L#20
  265. ==I
  266. S #TEMP16
  267. L #COUNTER_N
  268. ==I
  269. A #TEMP16
  270. # Все проверки пройдены, если #CHECK_N == #COUNTER_N == 20
  271. JC GOOD
  272. L #CHECK_N
  273. L L#20
  274. <I
  275. S #TEMP16
  276. L #COUNTER_N
  277. ==I
  278. A #TEMP16
  279. JC FAIL
  280. JU M019
  281. GOOD: SET
  282. = #PRE_RET_VAL
  283. JU FINISH
  284. FAIL: CLR
  285. = #PRE_RET_VAL
  286. JU FINISH
  287. M019: CLR
  288. O #PRE_RET_VAL
  289. = #RET_VAL
  290. JU LOOP
  291. FINISH: CLR
  292. O #PRE_RET_VAL
  293. = #RET_VAL
Advertisement
Add Comment
Please, Sign In to add comment