Анимация
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

Программа М.

BEGIN

CYCLE TIME

* ИМИТАТОР MIX

ORIG 3500 STZ STZ STZ ENT6 LDA INCA STA LDA STA INC6 LDX SLAX STA LD2 J2Z DEC2 J2P LDA LDX SLAX ADD

time(0:2) ovtog comp i 0

clock 0

clock 0.6 inst 1

inst(1:2) 5 m

inst(3:3) IF 6

indexerrOr

sign6,2 i6reg,2 5 m

cmpa zero(1:3) jne addrerror sta m

ld3 inst(4:4) ld5 m

ld4 inst(5:5)

dec4 63

j4p operror

0ptable,4(4:4) time(0:2) 0ptable,4(0:2)

LDA STA LD2 JNOV 0,2 JMP 0,2

Имитируемая память, начиная с 0000 и далее.

0VT0G - имитируемый флаг переполнения. C0MPI, ±1 или О, -флаг сравнения Взять первую команду из нулевой ячейки Начало выполнения управляющей программы. Указывает на ячейку, содержащую время выполнения предыдущей команды (строка 033) гА <- имитируемая команда

Увеличить значение счетчика адреса Взять абсолютное значение адреса Присоединить знак к адресу

Проверить поле индекса Это нуль

Определен недопустимый индекс

Взять знак индексного регистра

Взять абсолютное значение индексного регистра.

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

Сложение с учетом знаков для индексирования.

Результат слишком велик

Если да, имитировать ошибку

В противном случае адрес найден

г13 <- Р-поле

г15 <- М

г14 <- С-поле

Код операции > 64

Взять из таблицы время выполнения

Взять адрес соответствующей программы Перейти к оператору (Защита от переполнений )

Советую читателю обратить особое внимание на строки 034-036 "Таблица-переключатель" из 64 операторов - это составная часть имитатора, позволяющая ему быстро переходить к нужной программе для выполнения текущей команды. Это важный метод экономии времени (см упр. 1 3 2-9).

В состоящей из 64 слов таблице-переключателе OPTABLE также хранится время выполнения для различных операторов, содержимое этой таблицы определяется в следующих строках.

037 038 039 040

NOP CYCLE(l)

ADD ADD(2)

SUB SUB (2).

MUL MUL(10)

Таблица кодов операций,

ее типичные элементы имеют вид "ОП программа(время)"



DIV(i;2)

SPEC(l)

SHIFTX2)

MOVE

MOVE(l)

L0AD(2)

LOAD,1(2)

LOAD,1(2)

L0AD(2)

LDAN

L0ADN(2)

LDIN

L0ADN,1(2)

LDXN

L0ADN(2)

STORE(2)

ST0RE(2)

STORE(2)

JBUS

JBUS(l)

lOC(l)

IN(1) .

OUT(l)

JRED

JRED(l)

JUMP(l)

REGJUMP(l)

REGJUMP(l)

INCA

ADDROP(l)

INCl

ADDROP.l(l)

INCX

ADDROP(l)

CMPA

COMPARE(2)

OPTABLE CMPX

COMPARE(2)

(Элементы, соответствующие операторам LDi, LDiN и INCi, имеют дополнительную запись ", 1", чтобы сделать поле (3:3) ненулевым. Это используется ниже, в строках 289 и 290, для указания того, что после имитации данных операций необходимо проверить размер величины, содержащейся в соответствующем индексном регистре.)

В следующей части программы-имитатора просто перечисляются ячейки, которые используются для хранения содержимого имитируемых регистров.

AREG

Абсолютное значение регистра A.

I1REG

Абсолютное значение индексных регистров

I6REG

XREG

Абсолютное значение регистра X.

JREG

Абсолютное значение регистра J.

ZERO

Нулевая константа для "STZ".

SIGNA

Знак регистра А.

SIGNl

Знаки индексных регистров.



SIGN6

SIGNX

Знак регистра X.

SIGNJ

Знак регистра J.

SIGNZ

Знак, сохраняемый "STZ".

INST

Имитируемая команда.

COMPI

Флаг сравнения

OVTOG

Флаг переполнения.

CLOCK

Имитируемое время выполнения.

А теперь рассмотрим три подпрограммы, идет подпрограмма MEMORY.

используемые имитатором. Первой

Последовательность вызова: JMP MEMORY.

Состояние при входе: г15 = допустимый адрес памяти (в противном случае

подпрограмма перейдет к MEMERROR).

Состояние при выходе: гХ := знак слова в ячейке памяти г15; гА = абсолютное

значение слова в ячейке памяти г15.

125 * ПОДПРОГРАММЫ

126 MEMORY STJ 9F

127 J5N MEMERROR

128 СМР5

129 JGE

130 LDX

131 ENTA

132 SRAX

133 LDA

134 H JMP

Подпрограмма выборки из памяти.

=BEGIN= Имитируемая память находится MEMERROR в ячейках с 0000 до BEGIN - 1.

0,5 1

5 гХ ч- знак слова.

0,5(1:5) гА<- абсолютное значение слова.

* Выход. I

Подпрограмма FCHECK обрабатывает спецификацию частичного поля и проверяет, имеет ли оно вид 8L + R, где L < R < 5.

Последовательность вызова: JMP FCHECK.

rI3 = допустимая спецификация поля (в противном случае подпрограмма перейдет к FERROR). гА = гИ = L, гХ = R.

Состояние при входе: Состояние при выходе:

135 FCHECK STJ 9F

136 ENTA О

137 ENTX 0,3

138 DIV =8=

139 СМРХ =5= ЦО JG FERROR

141 STX R

142 STA L

143 LDl L

144 CMPA R

145 9H JLE *

146 JMP FERROR

Подпрограмма проверки поля.

гАХ <- спецификация поля. гА ч- L, гХ ч- R.

R> 5?

rll -(- L.

Выйти, если L < R.



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