Д. Кнут - Искусство программирования том 1 (1119450), страница 56
Текст из файла (страница 56)
?71 176 ?76 177 О1Ч 178 179 180 ?81 182 ?88 ?~Ц 186 186 ?87 ?88 189 ЯТОКЕАХ Ь90 191 ОЧСНЕСК 192 198 196 196 196 ЬОАОМ 197 ?98 ЬОАОМ1 199 200 201 ЬОАО 202 208 ЬОАО1 206 206 206 207 ЯТОКЕ 208 209 210 211 212 1Н 218 2Ц 216 216 217 218 219 220 221 222 228:л Перемножить операнды. Сохранить абсолютные значения.
Установить знак остатка. Загрузить значение Ч в гА и гХ. Знаки одинаковы? Занести в гХ знак результата. Поместить его в имитируемый гА. Разделить операнды. Сохранить абсолютные значения. Только что произошло переполнение? Если да, установить илгитируел~ый флаг переполнения в положение 1. Вернуться в управляющую программу. Загрузить значение У в гА и гХ. гП +- С вЂ” 1б; указывает регистр. Сделать знак отрицательнылг. Заменить ЬОАОН на ЬОА0, Загрузить значение Ч в гА и гХ. г11 <- С вЂ” 8, указывает регистр. Сохранить абсолютные значения.
Сохранить знак. Проверить, не слишком ли велико абсолютное значение. гП +- Ь. Взять содержимое ячейки памяти. Знак включен в поле? Если да, заменить 1 на 1 и "сохранить" знак регистра. г!2 +- — РЬ Сохранить область справа от поля. Вставить регистр в поле. Восстановить область слева от поля. Присоединить знак.
Сохранить в памяти. Вернуться в управляющую программу. ЗАР ЗМР ЗИР СУСьЕ ЗАР ЗНР ЗАЕ ЗИР ЗИР СУС1Е ЗИР МЕНОВУ ЕМТб 0,5 ЗИР СУСЛЕ ЫА АВЕС+23,4 ЗАЕ а+2 ЮА 31СМА+23,4 РЕСЗ 5 ЗЗМР ЗТАВОЕ,З ЗИР РЕЕВОВ РЕСЗ 3 ЗЗР РЕВВОВ - ЕМТХ 0,5 ЗХМЕ а+2 РРХ 1МЯТ ЕМТА 1 ЯВАХ 5 1.РА И(1:5) Найти знак М. 225 225 226 227 228 229 230 231 232 233 231 235 236 237 238 239 250 211 212 213 2Д 215 256 257 258 259 250 251 252 253 251 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 Л1ИР ЗИР ЗТАВЕЕ ЗОЧ змач РЕ 1Л МЕ СВ СЕ ЕЦ ЗЯЗ ВЕС Л1НР АРРВОР РЕСЗ 9 ЗЗР РЕЙНОВ ОРА СОНЕТ ЗИР ЗТАВРЕ,З ЯТб ЗВЕС ЗИР ЗЯЗ ЗИР ЗОЧ ЗИР ЗМОУ ЗМР ОЯ ЗНР ЕЦ ЗИР СВ ЗМР СЕ ЗИР МЕ ЗИР ьЕ РРХ ОЧТОС ЗМР а+3 ых ачтас РЕСХ 1 яте ачтос ЗХМЕ ЗИР ЗНР СУСЛЕ ЗАЕ ЗИР ЗАМ ЗИР ЗИР СУС1.Е ЗАМ ЗМР Операторы перехода.
Р слишком велико? гА +- флаг сравнения. Перейти к соответствующей программе. Установить имитируемый регистр 3. Конец таблицы перехода. Проверить, делать ли переход по переполнению. Взять дополнение флага переполнения. Отключить флаг переполнения. Перейти. Не переходить. Перейти, если в гА — нуль или отрицат. число. Перейти, если в гА — отрицат. число. Не переходить.
Перейти, если в гА — отрицат. или положит. число. Перейти, если в гА — положит, число. Не переходить. Перейти, если в гА — положит. число или нуль. Перейти, если в гА — нуль. Не переходить. Проверить допустимость адресов памяти. Имитировать переход. Вернуться в главную управляющую программу, Регистровые переходы. В регистре нуль? Если нет, поместить знак в гА.
Заменить командой условного перехода, если Р-спецификация не слишком велика. Операторы пересылки адреса. Г слишком велико? гХ <- знак М. гА +- абсолютное значение М. 1НР 6ЕТЧ ЯВАХ 5 ЯТХ Ч ЬОА ХВЕ0,4 ЬОХ 316МХ,4 ЛИР ОЕТАЧ ЯВАХ 5 СИРХ Ч ЯТ2 СОНР1 1Е СЧСЬЕ ЕМТА 1 10 а+2 ЕММА 1 ЯТА СОИР1 ЛНР СЧСЬЕ ЕМО ЯЕ01М ! 278 271 278 27б 277 278 1Н 279 ОЕС 280 281 1МС 282 288 йЦ 288 28б 287 1Н 288 2Н 289 312ЕСНК 290 291 292 298 298 298 СОНРАВЕ 29б 297 298 299 800 801 802 808 801 808 80б 807 808 809 810 811 ЕМТ1 15,4 ЛМР 1Р,З 1НР ЬМС 1НР РЕС ЗМР ЬОАО1 1НР ЬОАОМ1 ЯТХ ТЕНР ЬОХМ ТЕМР СНРХ 310МА,1 )Е 1Р ЯОВ АВЕ0,1 1АМР 2Р ЯТХ ЯТОМА,1 1НР гр АОО АВЕ0,1 ЯТА АВЕ0,1(1:5) ЬО1 ОРТАВЬЕ,4(3:3) 112 ОЧСНЕСК СИРА ХЕВО(1:3) 1Е СЧСЬЕ ЛИР Я12ЕЕВВОВ гП указывает регистр.
Четырехсторонний переход. Увеличить. Уменьшить. Занести. Занести отрицательное число. Изменить знак на противоположный. Заменить ОЕС иа 1МС. Программа сложения. Знаки одинаковы? Нет: вычесть абсолютные значения. Нужно ли изменить знак? Изменить знак регистра, Сложить абсолютные значения, Сохранить абсолютное значение результата. Только что был загружен индексный регистр? Если да, убедиться, что результат помещается в двух байтах. Загрузить значение У в гА и гХ. Присоединить знак.
Взять поле Г соответствующего регистра. Присоединить знак. Сравнить (заметьте, что — О = +0). Установить флаг сравнения в положение О, +1 либо -1. Вернуться в управляющую программу. В приведенном выше коде используется одно хитрое правило, сформулированное в разделе 1.3.1: команда "ЕМТА -О" загружает минус нуль в регистр А, так же как команда "ЕМТА -5,1", когда в индексном регистре 1 содержится значение +5. В общем случае, есни И равно нулю, команда ЕМТА загружает знак этой команды, а ЕММА загружает противоположный знак. Когда автор писал первый черновик раздела 1.3.1, он не придал особого значения определению этого условия. Такие вопросы обычно возникают только при написании компьютерной программы, в которой используются данные правила.
Несмотря на свои размеры, приведенная выше программа является неполной в нескольких отношениях. а) Она не распознает оцераций с плавающей точкой. Ь) Программирование кодов операций 5 — 7 оставлено для упражнения. с) Программирование операторов ввода-вывода оставлено для упражнения. б) Не предусмотрены средства загрузки имитируемых программ (см. упр. 4). е) Не включены программы 1ИОЕХЕИВОЕ, АООИЕВЕОИ, ОРЕЕИОЕ, ИЕИЕИИОЕ, РЕВЕОВ, 511ЕЕВЕОЕ. Они предназначены для обработки ошибок, обнаруженных в имитируемой программе.
Г) Не предусмотрены средства диагностики. (Хороший имитатор должен, например, быть способным распечатать содержимое регистров во время выполнения программы.) УПРАЖНЕНИЯ 1. [Ц] Изучите все варианты применения подпрограммы ГСВЕСК в программе-имитаторе. Можете лн вы предложить более удачный способ организации программы? (См.
шаг 3 в конце раздела 1.4.1.) 2. [50] Напишите программу ВИ1ЕТ, которой не хватает в программе, приведенной в тексте (код операции 6). 3. [55] Напишите программу ИОУЕ, которой не хватает в программе, приведенной в тексте (код операции 7). 4. [Ц] Измените программу в тексте раздела, чтобы она начиналась так, как будто была нажата "кнопка 00" машины ИХХ (см.
уцр. 1.3.1-26). 6. [54] Определите, сколько времени потребуется для имитирования операторов 101 и ЕИТА по сравнению с реальным временем, которое ИТХ затратит на их непосредственное выполнение. 6. [ЕВ] Напишите программы для операторов ввода-вывода 1805, 10С, 1И, 00Т и 1850, которых не хватает в программе, приведенной в тексте раздела, разрешив использовать только устройства 16 и 18. Предполагается, что операции "читать перфокарту" и "перейти к новой странице" занимают Т = 10000и, в то время как операция "печатать строку" занимает Т = 7500и, [Замечание.
Опыт показывает, что команду 1805 следует имитировать, рассматривая "1В05 М' как частный случай; иначе имитатор, похоже, остановится!] 7. [ВВ) Модифицируйте решение предылущего упражнения таким образом, чтобы выполнение команды 1И или 00Т не приводило к немедленной передаче входных-выходных данных. Такая передача должна происходить только после того, как пройдет примерно половина времени, которое необходимо для имитируемых устройств. (Это позволит избежать распространенной студенческой ошибки, когда команды 1И и 00Т используются неправильно.) 8. [50] Истинно или ложно следующее утверждение: "Каждый раз при выполнении строки 010 программы-имитатора выполняется неравенство 0 < г16 < ВЕСТИ"? *1.4.3.2.
Программы трассировки. Когда машина имитируется на самой себе (как в предыдущем разделе И1Х имитировался на И1Х), получается частный случай имитатора, который называется программой трассировки или слешсеиил. Подобные программы иногда используются при отладке, так как позволяют распечатать пошаговый отчет о поведении имитируемой программы. В предыдущем разделе программа была написана так, как будто Н1Х имитировался на другом компьютере. Для программ трассировки используется совершенно другой подход; обычно м(я позволяем., чтобы регистры представляли сами себя, а операторы выполняли сами себя, т.
е. позволяем машине самой выполнять большинство команд. Основное исключение представляет команда перехода или условного перехода, которую нельзя выполнять, не модифицируя, так квк программа трассировки должна сохранять общий контроль. Каждой машине присущи уникальные, свойственные только ей особенности, и это значительно усложняет трассировку.
Для машины М1Х самая трудная и интересная проблема связана с регистром Л. Приведенная ниже программа трассировки запускается, когда главная программа переходит к ячейке ЕИТЕН. При этом в регистре Л содержится адрес, с которого трассировка должна начаться, а в регистре Х вЂ” адрес, где она должна закончигпьсл. Это интересная программа, заслуживающая внимательного изучения.
01 ь ТНАС 02 ЕИТЕН 02 04 05 0б 07 С?СНЕ 0В ТЕЯТ 00 10 РНЕО 11 12 15 14 15 1б 17 1В 10 20 21 5 НЕС 22 22 24 2Н 25 25 27 1Н 2В 20 БН Эб 21 2Н 52 ВВ 24 1ИЯТ В5 Вб 1МСР ОТ1ИЕ ТЕБТ(0:2) ОЕАЧЕХ(0:2) АНЕО ЛЕЕО ЛНЕО(0:2) РНЕО(0:2) ОЕАЧЕ 1МБТ 2 1ИБТ1(0:3) 1МБТ(бгб) 38 1Р 6 2Г 1ИБТ(0:4) в+2(0:4) 1ИСР 2 2Р ЗР 9 2Р 8Р(0:3) 1МЯТ(0:3) АЕЕО Е НО БТХ ЯТХ ЯТА БТЛ ООА ЯТА РЕСА ЛАХ ООА ЯТА ЯНА ЯТА ЮА ОЕСА ЛАММ 1МСА ЛАИХ ЕОА ЯТА НИТА БТА ЛНР ОЕСА ЛАМЕ ЛНР ОЕСА ЛАР ООА ЯТА ООА МОР БТА АНЕО ООА РНЕО(0".2) Установить адрес выхода.