AOP_Tom1 (1021736), страница 58
Текст из файла (страница 58)
Загрузить значение Ч в гА и гХ. Знаки одинаковы" Занести в гХ знак результата Поместить его в оба имитируемых регистра. Ц7 ОЕТАЧ 148 140 ОЕТЧ 150 151 152 1Н 158 Щ 155 156 2Н 157 158 9Н ЯТ5 9Р 1МР 1Р ЯТ5 9Г 5МР РСНЕСК 5МР МЕМОНЧ 513 2Р ЕМТХ 1 Я1.А -1, 1 ЯНА -1,1 ЬП2М Н ЯНА 5,2 5МР Подпрограмма для нахождения Ч. Обработать поле и установить гП < — Ь. гА < — абсолютное значение памяти, гХ +- знак. Знак включен в поле? Если нет, установите положительный знак.
Обнулите все байты слева от этого поля Сдвиг вправо в соответствующую позицию. Выход. ) МОЬ АНЕО 1МР БТОНЕАХ 5МР ОЕТЧ ЕИТ1 4?,4 ЯТХ ТЕМР ЬОХИ ТЕМР 1МР ЬОАО1 1МР ОЕТЧ ЕИТ1 55,4 ЯТА АНЕ0,1 БТХ 510ИА,1 5МР 512ЕСНК ЯТОНЕ 1Н 207 208 209 210 211 212 218 2Ц 215 21б 217 218 219 220 221 222 5МР РСНЕСК ЛМР МЕМОНЧ 11Р 1Р ЕИТ1 1 ЬОХ 510ИА+39,4 ЬО2И Н ЯНАХ 5,2 ЬОА АМЕБ+39,4 ЯЬАХ 5,2 ЕИИ2 0,1 ЯНАХ 5,2 ЬОА 0,5 ЯНА б,2 ЯНАХ -1,1 ЯТХ 0,5 ЛМР СЧСЬЕ г12 <- -1.
175 175 17б 177 178 179 1ВО 181 1В2 1В8 185 1В5 18б 187 1ВВ 189 Ь90 191 192 198 195 195 198 197 198 199 200 201 202 208 205 205 20б 01Ч ЯТОНЕАХ ОЧСНЕСК ЬОАОИ ЬОАОИ1 ЬОАО ЬОАО1 ЬОА 510ИА БТА 510ИХ 5МР ОЕТЧ СМРХ 510ИА ЕИТХ 1 ЛЕ а+2 ЕИИХ 1 ЯТХ 510ИА ЯТА ТЕМР ЬОА АНЕО ЬОХ ХНЕО О1Ч ТЕМР ЯТА АНЕО ЯТХ ХНЕО 5ИОЧ СЧСЬЕ ЕИТХ 1 ЯТХ ОЧТОО ЛМР СЧСЬЕ Перемножить операнды.
Сохранить абсолютные значения. Установить знак остатка. Загрузить значение Ч в гА и гХ. Знаки одинаковы? Занести в гХ знак результата. Поместить его в имитируемый гА. Разделить операнды. Сохранить абсолютные значения. Только что произошло переполнение? Если да, установить имитируемый 4ллаг переполнения в положение 1. Вернуться в управляющую программу. Загрузить значение Ч в гА и гХ. гП +- С вЂ” 16; указывает регистр.
Сделать знак отрицательным. Заменить ЬОАОИ на ЬОАО, Загрузить значение Ч в гА и гХ. гП з- С вЂ” 8, указывает регистр. Сохранить абсолютные значения. Сохранить знак. Проверить, не слишком ли велико абсолютное значение. гП +- 1,. Взять содержимое ячейки памяти.
Знак включен в поле? Если да, заменить Ь на 1 и "сохранить" знак регистра. г12 <- -Н. Сохранить область справа от паля. Вставить регистр в поле. Восстановить область слева от поля. Присоединить знак. Сохранить в памяти. Вернуться в управляющую программу. ЛАР ЯМР ЯМР С?СЬЕ ЯАР ЯМР ЛАЕ ЛМР ЛМР С'г'СЬЕ ЯМР МЕМОКТ ЕМТБ О,Б ЯМР С'г'СЬЕ ЬОА АКЕО+23,4 ЯАЕ а+2 ЬОА Я1ОИА+23,4 РЕСЗ Б ЯЗИР ЯТАВЬЕ,З 1МР РЕВКОМ ОЕСЗ 3 ЛЗР РЕВКОМ - ЕИТХ О,Б ЛХИЕ а+2 ЬОХ 1МЯТ ЕИТА 1 ЯКАХ Б 1.ОА М(1:Б) Найти знак М. 221 225 226 227 228 229 280 281 282 28Я 281 285 286 287 288 2Я9 ЦО Щ 212 268 2лл 265 216 267 268 259 250 251 252 258 256 255 256 257 258 259 260 261 262 268 265 265 266 267 268 269 270 27? 272 ДОМР ЯМР ЛТАВЬЕ ЯОЧ ЯИОУ ЬЕ ЬЯ ИЕ СК ОЕ ЕЦ ЯЯЯ КЕОЯОМР АРОКОР ОЕСЗ 9 ЛЗР РЕККОК ЬОА СОИР1 ЯМР ЯТАВЬЕ,З ЯТБ 1КЕО ЛМР ЛЯЯ ЯМР ЛОЧ ЛИР ЛИОН ЯМР ЬЯ ЯМР ЕЦ ЛМР ОК ЯМР ОЕ 1МР МЕ ЛМР ЬЕ ЬОХ О'г'ТОО ЯМР а+3 ЬО1 ОЧТОО ОЕСХ 1 яте очтос ЯХИЕ ЛМР ЯМР С?СЬЕ ЯАЕ ЯМР ЛАИ ЯМР ЯМР СУСЬЕ ЛАИ ЯМР Операторы перехода.
Р слишком велико? гА < — флаг сравнения. Перейти к соответствующей программе. Установить имитируемый регистр 1. Конец таблицы перехода. Проверить, делать ли переход по переполнению. Взять дополнение флага переполнения. Отключить флаг переполнения. Перейти. Не переходить. Перейти, если в гА — нуль или отрицат, число. Перейти, если в гА — отрицат. число. Не переходить. Перейти, если в гА — отрицат, или положит. число.
Перейти, если в гА — положит, число. Не переходить. Перейти, если в гА — положит, число или нуль. Перейти, если в гА — нуль. Не переходить. Проверить допустимость адресов памяти. Имитировать переход. Вернуться в главную управляющую программу. Регистровые переходы. В регистре нуль? Если нет,поместить знак в гА. Заменить командой условного перехода, если Р-спецификация не слишком велика. Операторы пересылки адреса. Г слишком велико? гХ <- знак М.
гА <- абсолютное значение М. ЯМР ОЕТЧ ЯВАХ 5 ЯТХ Ч ЬПА ХВЕО,4 ЬПХ 51ОМХ,4 ЛМР ОЕТАЧ ЯВАХ 5 СМРХ Ч ЯТЕ СОМР1 ЛЕ СЧСЬЕ ЕМТА 1 ЯО в+2 ЕММА 1 ЯТА СОМР1 ЯМР СЧСЬЕ ЕМП ВЕО1М $ 278 27з 278 270 277 278 1Н 279 ПЕС 280 281 1МС 282 288 288 288 280 287 1Н 288 2Н 289 51ЕЕСНК 290 291 292 298 291 ь 298 СОМРАВЕ 298 297 298 299 ЯОО 801 802 ЯОЯ 808 808 806 807 808 809 810 ь 811 ЕМТ1 15,4 ЯМР 1Р,З ЯМР 1МС ЯМР ПЕС ЯМР ЬОА01 ЯМР 1.ОАПМ1 ЯТХ ТЕМР ЬПХМ ТЕМР СМРХ Я1ОМА, 1 ЯЕ 1Р ЯОН АВЕО, 1 ЯАМР 2Р ЯТХ Я1ОМА,1 ЯМР 2Р АПП АВЕО,1 ЯТА АВЕО,1(1г5) Ь01 ОРТАВЬЕ,4(3:3) 1!Е ОЧСНЕСК СМРА ЕЕВО(!гЗ) ЯЕ СЧСЬЕ ЯМР ЯТЕЕЕВВОВ гП указывает регистр.
Четырехсторонний переход. Увеличить. Уменьшить. Занести. Занести отрицательное число. Изменить знак на противоположный. Заменить ПЕС на 1ИС. Программа сложения. Знаки одинаковы? Нет; вычесть абсолютные значения. Нужно лн изменить знак? Изменить знак регистра. Сложить абсолютные значения.
Сохранить абсолютное значение результата. Только что был загружен индексный регистр? Если да, убедиться, что результат помещается в двух байтах. Загрузить значение У в гА и гХ. Присоединить знак. Взять поле Г соответствующего регистра. Присоединить знак. Сравнить (заметьте, что -0 = +0). Установить флаг сравнения в положение О, +1 либо — 1. Вернуться в управляющую программу.
В приведенном выше коде используется одно хитрое правило, сформулированное в разделе 1.3,1: команда "ЕМТА -О" загружает минус нуль в регистр А, так же как команда "ЕМТА -5,1", когда в индексном регистре ! содержится значение +5. В общем случае, если М равно нулю, команда ЕМТА загружает знак этой команды, а ЕММА загружает противоположный знак. Когда автор писал первый черновик раздела 1.3.1, он гге придал особого значения определению этого условия.
Такие вопросы обычно возникают только при написании компьютерной программы, в которой используются данные правила. Несмотря на свои размеры, приведенная выше программа является неполной в нескольких отношениях. а) Она не распознает оцераций с плавающей точкой. Ь) Программирование кодов операций 5 — 7 оставлено для упражнения. с) Программирование операторов ввода-вывода оставлено для упражнения. с[) Не предусмотрены средства загрузки имитируемых программ (см.
упр. 4). е) Не включены программы 1ИРЕХЕВЕОЕ, АРОЕЕВЕОЕ, ОРЕЕЕОЕ, МЕМЕЕЕОЕ, РЕВЕОЕ, 812ЕЕВЕОВ. Они предназначены для обработки ошибок, обнаруженных в имитируемой программе. г) Не предусмотрены средства диагностики. (Хороший имитатор должен, например, быть способным распечатать содержимое регистров во время выполнения программы.) УПРАЖНЕНИЯ 1. [Ц] Изучите все варианты применения подпрограммы ГСИЕСК в программе. имитаторе. Можете ли вы предложить более удачный способ организации программы? (См.
шаг 3 в конце раздела 1.4.1.) 2. [20] Напишите программу 381ГТ, которой не хватает в программе, приведенной в тексте (код операции 6). 3. [22] Напишите программу МОТЕ, которой не хватает в программе, приведенной в тексте (код операции 7). 4. [14] Измените программу в тексте раздела, чтобы она начиналась так, как будто была нажата "кнопка 00" машины М1Х (см. упр, 1,3.1-26). 6. [24[ Определите, сколько времени потребуется для имитирования операторов 10А и ЕИТА по сравнению с реальным временем, которое И11 затратит на их непосредственное выполнение. 6.
[28] Напишите программы для операторов ввода-вывода 1603, 10С, 1И, ООТ и ЗИЕР, которых не хватает в программе, приведенной в тексте раздела, разрешив использовать только устройства 16 и 18. Предполагается, что операции "читать перфокарту" и "перейти к новой странице" занимают Т = 10000и, в то время как операция "печатать строку" занимает Т = 7500и. [Замечание. Опыт показывает, что команду ЗВОВ следует имитировать, рассматривая "ЗВНВ М' как частный случай; иначе имитатор, похоже, остановится!] ° 7.
[82) Модифицируйте решение предыдущего упрюкнения таким образом, чтобы выполнение команды 1И или ООТ не приводило к немедленной передаче входных-выходных данных. Такая передача должна происходить только после того, как пройдет примерно половина времени, которое необходимо лли имитируемых устройств. (Это позволит избежать распространенной студенческой ошибки, когда комацлы 1И н ООТ используются неправильно.) 8.
[20] Истинно или ложно следующее утверждение: "Каждый раз при выполнении строки 010 программы-имитатора выполняется неравенство 0 < г16 ( ВЕ01И" 7 в1.4.3.2. Программы трассировки. Когда машина имитируется на самой себе (как в предыдущем разделе М1Х имитировался на М1Х), получается частный случай имитатора, который называется программой тлрассировки или слежения. Подобные программы иногда используются при отладке, так как позволяют распечатать пошаговый отчет о поведении имитируемой программы. В предыдущем разделе программа была написана так, как будто И1Х имитировался на другом компьютере. Для программ трассировки используется совершенно другой подход; обычно м(а позволяем, чтобы регистры представляли сами себя, а операторы выполняли сами себя, т.