Анимация
JavaScript
|
Главная Библионтека Наша первая сопрограмма с именем IN находит символы входной последовательности и количество их повторений. В первый раз ее выполнение начинается с IN1. 16 * ПЕРВАЯ СОПРОГРАММА
(Напоминаю, что в символьно.м коде MIX цифры 0-9 имеют коды 30-39.) Эта сопрограмма имеет следующие характеристики. Последовательность вызова: JMP IN. Состояние при выходе (при вызове OUT): Состояние при входе (после возврата): г А = следующий символ ввода с соответствующим числом повторений; содержимое г14 остается таким же, как при входе. содержимое гА, гХ, г15, г16 должно оставаться неизменным с момента последнего выхода. Вторая сопрограмма с именем OUT разбивает код на группы по три символа и осуществляет перфорацию. Ее выполнение начинается с 0UT1. 31 * ВТОРАЯ СОПРОГРАММА 32 ALF 33 OUTPUT ORIG *+16 34 PUNCH EQU 17 35 OUTl ENT4 -16 36 ENTl OUTPUT 37 MOVE -1,1(16) 38 IH JMP IN 39 STA 0UTPUT+16.4(1:1) 40 CMPA PERIOD 41 JE 9F 42 JMP IN 43 STA 0UTPUT+16,4(2:2) 44 CMPA PERIOD Постоянная, используемая для пробелов. Буферная область для ответов. Номер устройства перфорирования. Начать новую выходную перфокарту. Занести в область вывода пробелы. Взять следующий преобразованный символ. Сохранить его в поле (1:1). Это "."? Если нет, взять другой символ. Сохранить его в поле (2:2). Это "."? 45 46 47 48 49 50 51 52 53 55 56 JE 9F JMP IN STA 0UTPUT+16,4(3:3) CMPA PERIOD JE 9F INC4 1 J4N IB 9H OUT OUTPUT(PUNCH) JBUS *(PUNCH) JNE OUTl HLT PERIOD ALF UULiU • Если нет, взять следующий символ Сохранить его в поле (3 3) Перейти к следующему слову в буфере вывода Конец карты Если да, перфорировать ее Ожидать заверщения Вернуться за следующими символами, если не появилась "." Эта сопрограмма имеет следующие характеристики Последовательность вызова JMP OUT. Состояние при выходе (при вызове IN): Состояние при входе (при возврате). Содержимое регистров гА, гХ, г15, г16 остается неизменным с момента входа, значение в гИ может измениться, предыдущий символ записывается в выходные данные гА = следующий символ ввода с числом повторений; значение в г14 не меняется с момента последнего выхода. Для завершения программы нужно обеспечить связь между сопрограмлгами (см. (1)) и должны.м образом вьшолнить инициализацию Инициализация сопрограмм- это довольно тонкое, хотя и несложное, дело 57 * ИНИЦИАЛИЗАЦИЯ И СВЯЗЬ 58 59 60 61 62 63 64 65 START OUT OUTX IN INX ENT6 0 ENTX 0 JMP OUTl STJ INX JMP OUTl STJ OUTX JMP INI END START Инициализировать rI6 для NEXTCHAR Инициализировать rX для NEXTCHAR Начать с OUT (см упр 2) Связь сопрограмм Теперь программа полностью готова Читателю следует тщательно ее изучить, в особенности обращая внимание на то, как можно независимо написать каждую сопрограмму, считая, что другая сопрограмма - это ее подпрограмма В приведенной выше программе состояния при входе и при выходе для сопрограмм IN и OUT идеально согласованы Но в более общем случае нам вряд ли так повезет и, чтобы связать сопрограммы, придется также включить команды загрузки и сохранения соответствующих регистров Например, если бы программа OUT изменяла содержи.мое регистра А, то связь сопрограмм нужно было бы запро- Проход А ->ентаТ) (Ъвод-Сопрограмма А (ЛентаТ)-> Проход В У->{Лента"2) (нтаГ2у-> Проход с у-{лента~3 (Лента-» Проход D >(Вьгвод (Сопрограмма опрограмма V (Сопрограмма ->(Вывод (а) (Ь) Рис. 22. Проходы: (а) четырехпроходный алгоритм и (Ь) однопроходный алгоритм. граммировать следующим образом. OUT STJ INX STA HOLDA Сохранить A при выходе из IN. OUTX JMP OUTl IN STJ OUTX LDA HOLDA Восстановить A при выходе из OUT. INX JMP INI I Существует важная связь между сопрограммами и многопроходными алгоритмами. Например, описанный выше процесс преобразования можно выполнить за два отдельных прохода. Можно сначала выполнить только сопрограмму IN, применяя ее ко всему вводу и записывая каждый символ с соответствующим числом повторений на магнитную ленту, а зате.м перемотать ленту в начало и выполнить только сопрограмму OUT, выбирая символы с ленты группами по три. Такой процесс называется двухпроходным. (На интуитивном уровне термин "проход" воспринимается как полный просмотр входных данных. Это определение является неточным, и во многих алгоритмах совсем не очевидно, чему равно число выполненных проходов. Но, несмотря на некоторую неопределенность данного термина, полезно понять его на интуитивном уровне.) На рис. 22, (а) показан четырехпроходный процесс. Во многих случаях будет оказываться, что такой же процесс можно выполнить только за один проход, как показано в части (Ь) рисунка, если заменить сопрограммами А, В, С, D соответствующие проходы А, В, С, D. Сопрограмма А вызывает В, после того как во время прохода А элемент выходных данных записан на ленту 1. Сопрограмма В вызывает А, после того как во время прохода В элемент входных данных считан с ленты 1. Сопрограмма В вызывает С, после того как во время прохода В элемент выходных данных записан на ленту 2 и т. д. Пользователи UNIX® узнают в этом "канал", который обозначается как ПроходА ПроходВ ПроходС I ПроходО. Программы, соответствующие проходам В, С и D, иногда назьшаются фильтрами. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 [ 73 ] 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 |