25. Уча — учимся,
или...
МОДЕЛИРОВАНИЕ БОЛЬШОГО КОМПЬЮТЕРА
Если вы читаете эти строки, у вас почти наверняка есть под рукой подходящий компьютер. Возможно, покажется несколько странным, зачем нужно писать программу, делающую буквально то же самое, что уже умеет делать компьютер (если он исправен). Но уверены ли вы, что в точности знаете, что ваша ЭВМ в состоянии делать? Да и позволят ли вам другие пользователи достаточно долго узурпировать машину, чтобы изучить все черты ее характера? Билл Мак-Киман утверждает, что никогда не следует браться за большой проект, зависящий от структуры машины вроде компилятора или операционной системы, до тех пор, пока не создан имитатор. Но как это всегда бывает, чтобы чему-то научиться, надо научить этому кого-нибудь другого (скажем, компьютер?!).
Учебной машины модели 1 в действительности не существует. Однако, следуя традиции, она заимствует характерные черты нескольких известных машин. УМ-1 проще многих компьютеров из пластика и металла, но именно это позволяет больше внимания уделить ее структуре. Приводимое описание не претендует на полноту, характерную для руководств по ЭВМ — для такого изложения потребовалось бы дополнительное место, а его у нас нет. Чтобы восполнить пробелы, необходимо обратиться к собственным знаниям о других компьютерах. Численные значения везде, где они будут встречаться ниже, представлены в шестнадцатеричной системе (по основанию 16), как наиболее удобной для машины. Память и регистры ЭВМ УМ-1 снабжена памятью из 216 8-разрядных байтов, адресуемых от 0 до 216-1. Каждый байт памяти может содержать одну из 256 литер в коде ASCII [41], воспроизведенном на рис. 25.1. Любая группа четырех смежных байтов, адрес самого левого из которых делится нацело на четыре, является словом.
Рисунок 25.1. Набор кодировок символов ASCII. Позиции, отмеченные знаком , в УМ-1 не употребляются. Символ NUL не воспринимается; знаком NL заканчивается запись; LF вызывает переход на новую строку; CR — возврат каретки; FS — переход на новую страницу.
Слова участвуют в ряде операций, а граница самого левого байта слова называется границей слова.
Вычисления производятся с помощью 16 общих регистров размером в одно слово, перенумерованных от 0 до 15. Эти регистры располагаются в первых 64 байтах памяти, и любое обращение к байту с адресом от 0 до 63 связывается на самом деле с соответствующим байтом в блоке регистров. В некоторых командах указатель регистра рассматривается как адрес байта, вычисляемый умножением указателя на четыре. Отметим, что нумерация разрядов в слове, литере или иной конструкции будет всегда начинаться с 0 и вестись слева направо.
Имеется еще два других регистра. Счетчик адреса команды (САК) всегда указывает на адрес команды, следующей по порядку за выполняемой при обычной последовательности команд.
Рисунок 25.2. Схема основной памяти. Обратите внимание, что к регистрам можно адресоваться как к памяти.
Регистр признака результата (РПР) содержит 4 двоичных разряда. Чаще всего формирование РПР является побочным результатом выполнения команды, и его содержимое может опрашиваться командами передачи управления. Четыре разряда этого регистра — признак результата — называются (слева направо) соответственно бит переполнения, бит больше, чем, бит меньше, чем, и бит равно. В случае когда содержимое РПР задается непосредственно в команде, РПР сначала полностью обнуляется, а затем уже требуемые разряды устанавливаются равными 1. Если происходит переполнение, устанавливается лишь бит переполнения. Опрос состояния РПР не влияет на его содержимое.
О литерах выше уже упоминалось. Иногда их рассматривают как положительные 8-разрядные целые числа. Слова могут содержать 32-разрядные целые числа в дополнительном коде. Нулевой разряд в слове является разрядом знака и равен нулю в случае положительных чисел и единице — в случае отрицательных (знак является признаком дополнительного кода). Когда более короткие целые со знаком, например, обсуждаемые ниже непосредственные операнды, выступают в комбинации со словами, знаковый разряд укороченного слова размножается влево, заполняя отсутствующие биты.
41
American Standart Code for Information Interchange—американский стандартный 8-разрядный код для обмена информацией. — Прим. перев.