Анимация
JavaScript
|
Главная Библионтека 4. Приведем примеры трех различных компьютеров, имеющих историческое значение, (i) На машине IBM 650 на языке ассемблера SOAP мы написали бы последовательности вызова "LDD А" и "ЬИ? В", а связь между сопрограммами выглядела бы так: "А STD ВХ АХ" и "В STD АХ ВХ" (предпочтительнее, чтобы две эти команды связи находились в оперативной памяти), (ii) На машине IBM 709, воспользовавшись обычными языками ассемблера, мы записали бы последовательность вызова в виде "TSX А,4" и "TSX В,4"; связь между сопрограммами выглядела бы так. А SXA ВХ,4 В SXA АХ,4 АХ АХТ 1-А1.4 ВХ АХТ 1-В1,4 TRA 1.4 TRA 1.4 (iii) На машине CDC 1604 последовательности вызова были бы "обратными переходами" (SLJ 4) к А или В, а команды связи между сопрограммами, например А: SLJ В1; ALS О В: SLJ А1; SLJ А были бы занесены в два последовательных 48-битовых слова. 5. "STA H0LDAIN; LDA H0LDA0UT" между OUT и OUTX и "STA H0LDA0UT; LDA H0LDAIN" между IN и INX. 6. Внутри сопрограммы А напишите команду "JHP АВ", чтобы активизировать В, и команду "JMP АС" -чтобы активизировать С. Адреса ВА, ВС, СА, СВ будут аналогичным образом использоваться и внутри В и С. Связь между сопрограммами будет иметь такой вид. [Замечание. Если имеется п сопрограмм, то для осуществления связи подобного типа понадобится 2(п - 1)п ячеек. Если п достаточно велико, то, конечно, можно использовать "централизованную" программу связи. Нетрудно придумать также метод, для которого нужно Зп + 2 ячеек. Но на практике для приведенного выше более быстрого метода требуется только 2т ячеек, где т - количество пар (г, j), таких, для которых сопрограмма г вызывает сопрограмму j. Когда существует много сопрограмм, каждая из которых независимо вызывает другие, то обычно используется внешняя последовательность операторов управления (более подробно этот вопрос обсуждается в разделе 2.2.5).] РАЗДЕЛ 1.4.3.1 1. FCHECK используется только дважды, и оба раза сразу после нее вызывается подпрограмма MEMORY. Поэтому целесообразнее было бы создать для FCHECK специальный вход в подпрограмму MEMORY и сделать так, чтобы она помещала -R в г12.
3. MOVE J3Z CYCLE STX 0.1 JMP MEMORY LDA CLOCK SRAX 5 INCA 2 LDl IIREG STA CLOCK LDA SIGNl INCl 1 JAP *+3 STl IIREG JINZ MEMERROR INC5 1 STZ SIGNl(0:0) DEC3 1 CMPl =BEGIN« JMP HOVE JGE MEMERROR 4. Просто вставьте "IN 0(16)" и "JBUS * (16)" между строками 003 и 004. (Разумеется, на другом компьютере все было бы совсем по-другому, поскольку нужно было бы выполнять преобразование в символьный код машины MIX.) 5. Общее время выполнения центральной управляющей программы составляет 34и плюс 15и на индексирование, если оно необходимо. Подпрограмма GETV работает 52и плюс 5и, если L / 0; дополнительное время, необходимое для загрузки, равно Ни для LDA или LDX, 13и - для LDl, 21u - для ENTA или ENTX, 23u - для ENTi (добавьте 2и к последним двум значениям времени, если М = 0). Просуммировав, получим общее время 97и для LDA и 55и для ENTA плюс 15и на индексирование и плюс 5и или 2и при некоторых других условиях. Может показаться, что имитирование в данном случае дает для затраченного времени соотношение приблизительно 50:1. (В результате тестового прогона на 178и имитированного времени пришлось 8422и реального времени, т. е. получилось соотношение 47:1.) 7. При выполнении команд IN и OUT переменной, связанной с соответствующим устройством ввода-вывода, присваивается время, когда желательно вьшолнить передачу информации. Управляющая программа "CYCLE" опрашивает эти переменные в каждом цикле, чтобы узнать, не превысило ли значение CLOCK одну из них (или обе). Если превысило, то осуществляется передача информации и соответствующей переменной присваивается значение оо. (Когда подобным образом нужно использовать более двух устройств ввода-вывода, переменных может оказаться так много, что лучше хранить их в рассортированном списке с помощью методов связи с памятью; см. раздел 2.2.5.) При имитации команды HLT необходимо очень осторожно завершать операции ввода-вывода. 8. Ложно. В г16 может содержаться адрес ячейки BEGIN, если мы "попадем" в нее из ячейки BEGIN - 1. Но тогда произойдет MEMERROR и будет предпринята попытка внести команду STZ в ячейку TIME! С другой стороны, всегда выполняется неравенство О < г16 < BEGIN (это следует из строки 254). РАЗДЕЛ 1.4.3.2 1. Замените строки 48 и 49 такой последовательностью команд. XREG ORIG .+2 LEAVE STX XREG l STl XREG+1 *;\ f°(° = 2) LDl XRG.l LM IF S?X -11 LEAVEX JSJ ♦ Особое значение здесь имеет, конечно, оператор "JSJ". 2. ♦ ПРОГРАММА ТРАССИРОВКИ STA BUF+1,1(4:5) ORIG *+99 ENTA 8 BUF CON 0 JNOV IF ..............строки 02-04 ADD BIG STl IIREG IH JL IF .строки 05-07 INCA 1 PTR ENTl -100 JE IF JBUS .(0) INCA 1 STA BUF+1,1(0:2) IH STA BUF+1.1(3:3) .строки 08-11 INCl 10 STA BUF+2,1 JIN IF ..............строки 12-13 OUT BUF-99(0) LDA AREG ENTl -100 STA BUF+3.1 IH STl PTR(0:2) LDA IIREG ..............строки 14-31 STA BUF+4,1 LDI IIREG ST2 BUF+5,1 ..............строки 32-35 ST3 BUF+6,1 STl IIREG ST4 BUF+7,1 ..............строки 36-48 STB BUF+8,1 LDI IIREG ST6 BUF+9,1 ..............строки 49-50 STX BUF+10.1 B4 EQU 1(1:1) LDA JREG(0:2) BIG CON B4-8.B4-1(1:1) После выполнения трассировки необходимо вызвать дополнительную программу, которая выводит на ленту содержимое последнего буфера и перематывает в начало зстройство О (накопитель на магнитной ленте). 3. Запись на ленту происходит быстрее. Редактирование этой информации в текстовом виде во время трассировки потребовало бы слишком много памяти. Кроме того, содержимое ленты можно напечатать выборочно. 4, Истинная трассировка, которая необходима в упр. 6, не будет вьшолнена, так как нарушается ограничение (а), сформулированное в тексте раздела. Первая же попытка выполнить трассировку CYCLE приведет к зацикливанию и возврату к повторной трассировке ENTER+1, так как содержимое ячейки PREG испорчено. 6. Указание. Сохраняйте таблицу значений из всех ячеек памяти внутри области трассировки, которая была изменена внешней программой. 7, Программа трассировки должна просматривать программу, пока не найдет команду первого перехода (или условного перехода). После модификации этой и следующей команд она должна восстановить регистры и позволить программе выполнить все ее команды до данной точки "одним махом". [Этот метод может не пройти, если программа модифицирует собственные команды перехода или заменяет "непереходные" команды командами перехода. Для практических целей можно запретить подобные действия, сделав исключение только для команды STJ, которую, по всей видимости, так или иначе придется обрабатывать отдельно.] РАЗДЕЛ 1.4.4 1. (а) Нет; операция ввода может оказаться незаконченной. (Ь) Нет: операция ввода может выполниться немного быстрее, чем команды MOVE. Поэтому данное предложение слишком рискованно. 2. ENT1 2000 MOVE 1050(50) JBUS .(6) OUT 2000(6) I MOVE 1000(50) 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 |