Анимация
JavaScript


Главная  Библионтека 

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

ENTl

15,4

rll указывает регистр.

1F,3

Четырехсторонний переход.

Увеличить.

Уменьшить.

LOADl

Занести.

LOADNl

Занести отрицательное число.

TEMP

Изменить знак на противоположный.

LDXN

TEMP

Заменить DEC на INC.

CMPX

SIGNA,1

Программа сложения.

Знаки одинаковы?

AREG.l

Нет; вычесть абсолютные значения.

JANP

Нужно ли изменить знак?

SIGNA,1

Изменить знак регистра.

AREG.l

Сложить абсолютные значения.

AREG,1(1:5)

Сохранить абсолютное значение результата.

SIZECHK

OPTABLE,4(3:3)

Только что был загружен

OVCHECK

индексный регистр?

CMPA ZERO(1:3)

Если да, убедиться, что результат

CYCLE

помещается в двух байтах.

SIZEERROR

COMPARE

GETV

Загрузить значение V в гА и гХ.

SRAX

Присоединить знак.

XREG,4

Взять поле F соответствующего регистра.

SIGNX,4

GETAV

SRAX

Присоединить знак.

CMPX

Сравнить (заметьте, что -0 = +0).

COMPI

Установить флаг сравнения

CYCLE

в положение 0,-1-1

ENTA

либо -1.

ENNA

COMPI

CYCLE

Вернуться в управляющую программу.

BEGIN 1

В приведенном выше коде используется одно хитрое правило, сформулированное в разделе 1.3.1: команда "ENTA -О" загружает минус нуль в регистр А, так же как команда "ENTA -5,1", когда в индексном регистре 1 содержится значение --5. В общем случае, если М равно нулю, команда ENTA загружает знак этой команды, а ENNA загружает противоположный знак. Когда автор писал первый черновик раздела 1.3.1, он не придал особого значения определению этого условия. Такие вопросы обычно возникают только при написании компьютерной программы, в которой используются данные правила.

Несмотря на свои размеры, приведенная выше программа является неполной в нескольких отношениях.



a) Она не распознает оцераций с плавающей точкой.

b) Программирование кодов операций 5-7 оставлено для упражнения.

c) Программирование операторов ввода-вывода оставлено для упражнения.

d) Не предусмотрены средства загрузки имитируемых программ (см. упр. 4).

e) Не включены программы

INDEXERROR, ADDRERROR, OPERROR, MEMERROR, FERROR, SIZEERROR.

Они предназначены для обработки ошибок, обнаруженных в имитируемой программе.

f) Не предусмотрены средства диагностики. (Хороший имитатор должен, например, быть способным распечатать содержимое регистров во время выполнения программы.)

УПРАЖНЕНИЯ

1. [Ц] Изучите все варианты применения подпрограммы FCHECK в программе-имитаторе. Можете ли вы предложить более удачный способ организации программы? (См. шаг 3 в конце раздела 1.4.1.)

2. [20] Напишите программу SHIFT, которой не хватает в программе, приведенной в тексте (код операции 6).

3. [22] Напишите программу MOVE, которой не хватает в программе, приведенной в тексте (код операции 7).

4. [14] Измените программу в тексте раздела, чтобы она начиналась так, как будто была нажата "кнопка GQ" машины MIX (см. упр. 1.3.1-26).

► 5. [24] Определите, сколько времени потребуется для имитирования операторов LDA и ENTA по сравнению с реальным временем, которое MIX затратит на их непосредственное выполнение.

6. [28] Напишите программы для операторов ввода-вьшода JBUS, ЮС, IN, OUT и JRED, которых не хватает в программе, приведенной в тексте раздела, разрешив использовать только устройства 16 и 18. Предполагается, что операции "читать перфокарту" и "перейти к новой странице" занимают Т = lOOOOu, в то время как операция "печатать строку" занимает Т = 7500и. [Замечание. Опыт показывает, что команду JBUS следует имитировать, рассматривая "JBUS *" как частный случай; иначе имитатор, похоже, остановится!]

► 7. [32] Модифицируйте решение предыдущего упражнения таким образом, чтобы выполнение кдманды IN или OUT не приводило к немедленной передаче входных-выходных данных. Такая передача должна происходить только после того, как пройдет примерно половина времени, которое необходимо для имитируемых устройств. (Это позволит избежать распространенной студенческой ошибки, когда команды IN и OUT используются неправильно.)

8. [20] Истинно или ложно следующее утверждение: "Каждый раз при выполнении строки 010 программы-имитатора выполняется неравенство О < г16 < BEGIN"?

*1.4.3.2. Программы трассировки. Когда машина имитируется на самой себе (как в предыдущем разделе MIX имитировался на MIX), получается частный случай имитатора, который назьшается программой трассировки или слежения. Подобные программы иногда используются при отладке, так как позволяют распечатать пошаговый отчет о поведении имитируемой программы.



в предыдущем разделе программа была написана так, как будто MIX имитировался на другом компьютере. Для программ трассировки используется совершенно другой подход; обычно ui позволяем, чтобы регистры представляли сами себя, а операторы выполняли сами себя, т. е. позволяем машине самой выполнять большинство команд. Основное исключение представляет команда перехода или условного перехода, которую нельзя выполнять, не модифицируя, так как программа трассировки должна сохранять общий контроль. Каждой машине присущи уникальные, свойственные только ей особенности, и это значительно усложняет трассировку. Для машины MIX самая трудная и интересная проблема связана с регистром J.

Приведенная ниже программа трассировки запускается, когда главная программа переходит к ячейке ENTER. При этом в регистре J содержится адрес, с которого трассировка должна начаться, а в регистре X - адрес, где она должна закончить-

Это интересная программа,

заслуживающая внимательного изучения.

* TRACE ROUTINE

ENTER

TEST(0:2)

Установить адрес выхода.

LEAVEX(0:2)

AREG

Сохранить содержимое гА.

JREG

Сохранить содержимое rJ.

JREG(0:2)

Взять начальный адрес для трассировки.

CYCLE

PREG(0:2)

Сохранить адрес следующей команды.

TEST

DECA

Это адрес выхода?

LEAVE

PREG

Взять следующую команду.

INST

Скопировать ее.

INST1(0:3)

Сохранить этот адрес и индексы.

INST(5:5)

Взять код операции, С.

DECA

JANN

С > 38 (JRED)?

INCA

JANZ

С / 32 (STJ)?

INST(0:4)

*+2(0:4)

Заменить STJ на STA.

JREG

ENTA

гА <- имитируемое содержимое rJ.

INCP

DECA

JANZ

С / 34 (JBUS)?

DECA

Тест для команд перехода.

О 47 (JXL)?

8F(0:3)

Мы обнаружили команду перехода;

INST(0:3)

изменить ее адрес на "JUMP".

AREG

Восстановить регистр А.

Во всех регистрах, кроме J, теперь правильные

значения по отношению к внешней программе.

INST

Команда выполняется.

AREG

Снова сохранить регистр А.

INCP

PREG(0:2)

Перейти к следующей команде.



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