Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Архитектура вычислительных систем и Ассемблер с приложением методических указаний к лабораторным работам. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
1.2. Структурная декомпозиция вычислительной системы 21
1.2.6. Регистры
Позволь нам пройти землею твоею: мы не пойдем по полям и по виноградникам и не будем пить воды из колодезей твоих; но пойдем дорогою царскою, не своротим ни направо, ни налево, доколе не перейдем пределов твоих.
Чс. 20:17
Чем более объёмно запоминающее устройство, тем, как правило, медленнее оно работает. Оперативная память обладает меньшей скоростью, чем процессор; хотя частоты работы как оперативной памяти, так и процессора непрерывно растут, это соотношение сохраняется. В настоящее время частоты процессоров измеряются в гигагерцах, памяти — в сотнях мегагерц.
Соответственно, использование только данных, расположенных в оперативной памяти, сильно замедлило бы работу. Частично обмен данными ускоряется при помощи кеширования, но оно не уравнивает скорости процессора и памяти.
Кроме того, АЛУ процессора не может обрабатывать данные, расположенные непосредственно в оперативной памяти, так что, в частности, оператор ++i (или соответствующая ему команда ассемблера
inc i
) будет выполняться в несколько
приёмов (раздел 1.2.3):
– загрузка значения переменной i из оперативной памяти в специальную ячейку
внутри процессора — регистр;
– расчёт значения i +1; – выгрузка значения i +1из регистра в память по адресу переменной i,
причём загрузка-выгрузка в ОЗУ занимает больше времени, чем расчёт значения. Для ускорения работы часто используемые переменные логично хранить прямо в процессоре, выделив для этого некоторое количество регистров, не используемых в цикле обработки команд. Они называются регистрами общего назначения.
В отличие от специальных регистров, недоступных программисту, их можно указать в команде как источник или приёмник значения, то есть использовать как сверхбыстрые ячейки памяти. На уровне машинных команд регистры общего назначения обозначаются короткими номерами, на уровне ассемблера — именами. Регистры — часть процессора и работают с ним на одной частоте.
Специальные регистры процессора также имеют имена, но они используют-
19
ся только в документации [
]. Значение специальных регистров программист может узнать или модифицировать только косвенно, с помощью специальных ко­манд. В частности, указатель командipизменяется командами условного или безусловного перехода.
Регистры процессоров семейства x86 подробнее описаны в разделе 3.3.
22 Глава 1. Понятие вычислительной системы (ВС)
1.3. Иерархическая декомпозиция ВС
Государь мой, прости, но для этой песни — я заимствую твой язык Ибо жизнь заставляет заняться работой, к которой я не привык.
С. А. Калугин. Открытое письмо ефрейтору Расчёскину
Согласно Таненбауму [46], вычислительную систему можно представить в виде ряда уровней абстракции. Каждому уровню соответствует свой язык, программы на котором путём компиляции или интерпретации переводятся на язык нижележащего уровня.
Большинство современных систем включает шесть уровней [46]:
– уровень языка прикладных программистов; – уровень ассемблера; – уровень операционной системы; – уровень архитектуры команд; – микроархитектурный уровень;
– цифровой логический уровень. Над этой иерархией языков находится прикладной программист и воплощаемый им алгоритм; под цифровым логическим уровнем — физическая элементная база.
Современная шестиуровневая структура сформировалась далеко не сразу и не является пределом развития. Примитивные счётные устройства (абак, суанпан, русские счёты) рассчитаны на взаимодействие человека напрямую с элементной базой. Развитие вычислительной техники и программной инженерии ведёт к посте­пенному наращиванию уровней абстракции.
Иногда между уровнем языка прикладных программистов и уровнем опера­ционной системы находится уровень байт-кода или p-кода, интерпретируемого виртуальной машиной. Он не эквивалентен уровню ассемблера, так как не отражает специфику аппаратной части вычислительной системы.
1.3.1. Цифровой логический уровень
Он лежит и ждёт, когда придёт сигнал. После этого нужно быстро — очень быстро — изменить ноль на единицу или единицу на ноль. Но сигнала всё нет.
А. В. Жвалевский, И. Е. Мытько.
Порри Гаттер и Каменный Философ
На цифровом логическом уровне существуют цифровые
сигналы
, которые
могут принимать ограниченный набор значений. Для современных ЭВМ эти значе­ния — 0 и 1.
1.3. Иерархическая декомпозиция ВС 23
Соответственно количеству состояний сигнала определяется базовая единица измерения информации. Так как современные ЭВМ двоичны, единицей информа­ции считается бит — один двоичный разряд, который может находиться в двух состояниях —0и1. Для троичных ЭВМ, таких как Сетунь, информация измеряет­ся в тритах.
Сигналы обрабатываются базовыми элементами схем —
логическими венти-
лями, преобразующими множество входных сигналов в выходной в соответствии
с какой-либо из логических операций (в частности, «и», «или», «не», «и-не»).
Существует множество стандартов изображения логических вентилей. В оте­чественной литературе чаще всего используются либо обозначения, описанные в стандарте IEC 60617-12 (1997) , либо похожие обозначения ГОСТ 2.743-91 из единой системы конструкторской документации (ЕСКД).
Из-за особенностей элементной базы основными для построения схем являются вентили «и-не» и «или-не» (NOR и NAND), реализующие соответственно операции ¬(x y) и ¬(x y) для входных сигналов x и y.
Из вентилей конструируются более сложные элементы, в частности, двоичный полусумматор, рассчитывающий сумму двух входов, формируя два выходных сигнала: сумму входов по модулю2и разряд переноса, или полный одноразрядный сумматор, рассчитывающий сумму трёх входов (на один из них при построении многоразрядного сумматора подаётся перенос из предыдущего разряда).
Цифровой логический уровень — хронологически первый уровень абстракции. Впервые он появился ещё в непрограммируемых счётных машинах, в том числе вавилонских и греческих астрономических калькуляторах, но при этом отсут­ствует в простых устройствах наподобие счётов, где перенос между разрядами осуществляется вручную.
1.3.2. Микроархитектурный уровень
...Антагонизмы в области материального производства делают необходимой надстройку из идеологических сословий, деятельность которых, — хороша ли она или дурна, — хороша потому, что необходима...
К. Маркс. Капитал
Микроархитектура процессора — это аппаратная организация и логическая структура микропроцессора:
– регистры — сверхбыстрые ячейки памяти внутри процессора; – набор микрокоманд; – управляющие схемы; – арифметико-логические устройства (АЛУ); – запоминающие устройства;
24 Глава 1. Понятие вычислительной системы (ВС)
– связывающие их информационные магистрали (шины).
В частности, к микроархитектуре относятся все решения, касающиеся цикла выполнения команды: декодирование команды вышележащего уровня в последова­тельность микрокоманд, конвейер, кеширование команд и данных, прогнозирова­ние переходов и т. п.
Микроархитектурный уровень впервые начал отделяться от уровня архитекту­ры команд в ЭВМ EDSAC-2 в 1957 г., когда впервые было применено микропро­граммирование для реализации команды как последовательности микрокоманд.
В настоящее время микроархитектура процессора качественно отличается от архитектуры уровня команд. Так, на уровне микроархитектуры все современные процессоры семейства x86 (то есть процессоры с CISC-набором команд) органи­зованы по принципу RISC. Они имеют набор микрокоманд простой структуры и множество регистров, которые поочерёдно играют роль восьми регистров общего назначения за счёт механизма переименования. Это позволяет ускорить выполне­ние программ, сохраняя при этом совместимость на уровне архитектуры команд.
1.3.3. Уровень архитектуры команд
Это полотно, где одна только краска — число.
В. Хлебников. В. Э. Мейерхольду
Уровень архитектуры команд включает:
– архитектуру памяти; – взаимодействие с внешними устройствами ввода/вывода; – режимы адресации; – регистры; – набор машинных команд; –
различные типы внутренних данных (целочисленные, с плавающей запятой
и т. д.);
– обработчики прерываний и исключений. Эти пункты во многом повторяют компоненты микроархитектуры. Различие состо­ит в том, что уровень архитектуры команд доступен программисту и, как всякий интерфейс, должен соответствовать документации и относительно редко меняется. Микроархитектура скрыта от программиста и может различаться даже у разных партий процессоров одной и той же модели.
В соответствии со структурой памяти, разрядностью шины и регистров опреде-
ляются платформозависимые единицы измерения — байт и машинное слово.
Программа уровня архитектуры команд — последовательность двоичных ма­шинных кодов. Программы ранних поколений записывались непосредственно в дво­ичном коде в виде отверстий на перфокартах и перфолентах (отверстие соответ­ствовало единице, нетронутая позиция — нулю). Позже для хранения программ
1.3. Иерархическая декомпозиция ВС 25
стали использоваться различные виды долговременной памяти (обычно магнитные ленты и диски), а запись — сокращать с помощью восьмеричного и шестнадцате­ричного представления двоичных чисел.
Каждому процессору соответствует свой набор машинных кодов.
В частности, для процессоров семейства x86 опкод пересылки непосредствен­ного тридцатидвухбитного значения в тридцатидвухбитный регистр общего на­значения имеет видB8, после этого кода записывается трёхбитный код регистра, после чего идёт само значение. Соответственно, запись значения гистр с кодом1выполняется командой
B9 CC CC CC CC
. Часто одно и то же действие
CC CC CC CC
в ре-
можно выполнить с помощью различных машинных команд.
Уровень архитектуры команд, отличающий программируемую вычислитель­ную машину (компьютер) от калькулятора или арифмометра, появился в проекте аналитической машины Чарльза Бэббиджа, а впервые реализован был в механи­ческом компьютере Z1 Конрадом Цузе в 1938 г. При этом сама идея цифровых программ появилась задолго до её применения для вычислительных машин. Дво­ичные программы, записанные на перфолентах, использовались в механических орг´анах — шарманках в
XVXIX
вв., на перфокартах — в автоматизированном
ткацком станке Жозефа Жаккара (1802 г.).
Программирование в машинных кодах использовалось в течение долгого вре­мени параллельно с ассемблером и языками высокого уровня. Даже в настоящее время бывает необходимо использовать вставки на машинном языке. Это может по­надобиться либо в случае, когда ассемблер устарел и не распознаёт мнемоническое обозначение необходимой команды, либо при разработке защитных механизмов — для затруднения дизассемблирования и обратной разработки алгоритма защиты.
1.3.4. Уровень операционной системы
Дыхание этого спутника я всегда слышал.
В. Хлебников. Слово о числе и наоборот
На уровне операционной системы осуществляется:
управление памятью (распределение между процессами, организация виртуаль-
ной памяти);
– загрузка программ в оперативную память и их выполнение; – исполнение запросов программ (системные вызовы); –
стандартизованный доступ к периферийным устройствам (устройства ввода-
вывода);
управление доступом к данным на энергонезависимых носителях (таких как
жёсткий диск, оптические диски и др.), организованным в той или иной файло-
вой системе;
– обеспечение пользовательского интерфейса;
26 Глава 1. Понятие вычислительной системы (ВС)
– сохранение информации об ошибках системы. Данный уровень является гибридным — большая часть команд его языка совпа­дает с командами нижележащего уровня (машинного языка), и только некоторые интерпретируются непосредственно операционной системой.
При этом операционная система работает с этим языком и как компилятор (преобразуя исполняемый файл в готовую к выполнению программу в оперативной памяти, что для современных форматов исполняемых файлов не сводится к про­стому копированию), и как интерпретатор (исполняя так называемые системные вызовы).
Именно различие в системных вызовах и формате исполняемых файлов не позволяет выполнять в Microsoft Windows программы, собранные для того же процессора под GNU/Linux и наоборот.
В частности, системные вызовы используются для получения параметров ко­мандной строки (открытие документа двойным щелчком в Microsoft Windows — тоже вызов программы с параметром!) и для завершения работы. Непосредствен­ное обращение к системным вызовам обычно скрыты от прикладного программиста библиотечными функциями-обёртками.
Первой операционной системой можно считать аппаратный супервизор релей­ного многоядерного компьютера Bell Model V (1946 г.), обеспечивавший загрузку следующей программы из очереди на освободившееся ядро без участия оператора и переключение между перфолентами по команде условного перехода. Позже появилась пакетная операционная система GM-NAA I/O (General Motors & North
American Aviation Input/Output system) для IBM 704 (1956 г.) [62].
В конце 1950-х гг. были разработаны первые широко используемые операцион­ные системы FMS (Fortran Monitor System) [46,62] и SOS (Share 709 System) [12, 62
] для IBM 709, которые включали компиляторы (Фортран для FMS и ассемблер для SOS) и обрабатывали системные вызовы, представленные перфокартами со специальным содержимым.
1.3.5. Уровень ассемблера
И язык — звукомые числа <нашего бытия>.
В. Хлебников. И, всенея, ховун...
Программировать в машинных кодах не слишком удобно, даже если записывать их в компактном восьмеричном или шестнадцатеричном виде. Намного удобнее создавать программы, используя понятное человеку символическое представле­ние машинных команд — мнемоники, а также символические имена регистров и адресов в памяти (переменных, меток).
Перевод программы из подобного символического представления в машинные команды реализуется путем трансляции (сборки, ассемблирования), а не интер-
1.3. Иерархическая декомпозиция ВС 27
претации. Программа-транслятор для такого перевода соответственно называется ассемблером, а язык программирования — языком ассемблера. Язык ассемблера часто сокращённо называют просто ассемблером, как и транслятор.
Так как набор мнемоник — символическое представление набора команд про­цессора, процессорам с различным набором команд соответствуют разные языки ассемблера.
Синтаксис языка асемблера также зависит от используемого транслятора, так что для одного и того же процессора могут быть разработаны несколько ассембле­ров.
В частности, команда
B9 CC CC CC CC
, то есть команда записи значения
CC CC CC CC
в регистр с кодом1для x86 (этому коду для тридцатидвухбитного регистра в тек­сте программы соответствует имя
movl $0xCCCCCCCC, %ecx
. Строка
ecx
), на уровне ассемблера будет иметь вид
mov
называется мнемоническим обозначением, или мнемоникой команды пересылки. Одной мнемонике может соответствовать несколько машинных команд (в частности, обозначение
mov
объединяет множество команд пересылки данных); кроме того, одна машинная команда может на уровне ассемблера обозначаться несколькими мнемониками (так, больше или равно и
jnl
— переход, если не меньше, — это одна и та же команда)
jge
— переход, если
Считается, что первый ассемблер появился в 1949 г. По разным источникам, он был разработан Дэвидом Джоном Уилером для ЭВМ EDSAC [58] или Джоном Мокли и Джоном Преспером Экертом для ЭВМ BINAC [45].
Иногда ассемблер называют самым старым языком программирования после машинного кода, хотя первый язык высокого уровня появился ещё раньше. Тем не менее, ассемблер заслуженно считается вторым поколением языков программиро­вания.
1.3.6. Языки высокого уровня
Язык Заменгофа очень строен, лёгок и красив, но беден звуками и не разнообразен: избыток омонимии и скудень синонимии.
В. Хлебников. Мысли и заметки
Третьим поколением считаются языки высокого уровня (ЯВУ), позволяющие программисту описывать алгоритм, а не его реализацию на данной конкретной машине.
Для языка высокого уровня возможна как компиляция до уровней ассембле­ра или операционной системы (или, иногда, до другого ЯВУ), так и пошаговая интерпретация. При этом программы на некоторых языках традиционно только компилируются (в частности, Паскаль/Delphi, C/C++), на некоторых — только ин­терпретируются (в частности, это языки командной оболочки, наиболее известным из которых является семейство sh/bash), для большинства есть и компиляторы,
28 Глава 1. Понятие вычислительной системы (ВС)
и интерпретаторы (Python, PHP и т. д.). В некоторых современных языках высокого уровня (в частности, C#, Java) вводится дополнительный уровень абстракции — программа на ЯВУ компилируется до байт-кода, который затем интерпретируется.
Идея символического языка для прикладного программирования, который не был бы связан с архитектурой конкретной вычислительной машины, почти так же стара, как и само программирование.
Первый язык высокого уровня — Планкалкюль — был разработан Конрадом Цузе в 1943-45 гг., но для него в то время не был разработан компилятор.
Первый компилятор, переводивший программу в алгебраической форме на ма­шинный язык, A-0, был разработан в 1952 г. Грейс Хоппер.
Первый отечественный компилятор с языка высокого уровня ПП-1 (програм­мирующая программа) был разработан в 1954 г. В некоторых источниках считается
47
первым компилятором с языка высокого уровня [
]. Язык ПП-1 (и его позднейшие
потомки) был основан на математической нотации [33].
Первым языком высокого уровня, дожившим до настоящего времени под ори­гинальным именем (но при этом породивший другой известный язык — Бейсик), является Фортран. Он был создан в 1954-1957 гг. группой программистов под руководством Джона Бэкуса в IBM. Также в 1957 г. был создан первый язык функционального программирования APL.
Как конкурент языку от IBM, в 1958 г. группой под руководством Питера Наура был разработан язык Алгол — родоначальник большинства современных языков общего назначения, в частности, семейства, включающего линейки Пас­каль/Delphi/C# и B/C/C++. В это же время появился язык обработки списков Lisp, существующий до сих пор под этим именем.
В 1959 г. под руководством Грейс Хоппер был создан язык Кобол, максимально приближённый к английскому языку. Сейчас аналогичную нишу в нашей стране занимает 1С.
В настоящее время иногда выделяются также сверхвысокоуровневые языки программирования, позволяющие описывать даже не алгоритм решения задачи, а саму задачу, в частности, Python, Ruby, AWK/Perl.
Иногда объектно-ориентированные, а также языки запросов и другие сверх­высокоуровневые языки выделяются в следующее — четвёртое поколение языков программирования. При этом естественные языки объединяются с языками экс­пертных систем и баз знаний в пятое поколение.
В данном пособии уровень языка прикладных программистов будет рассматри­ваться в основном на примере компилируемого языка высокого уровня C++.
1.4. История 29
1.4. История
...В самом деле, так как возникновение по направлению вверх не беспредельно, то необходимо, чтобы не было вечным то, из чего как из первого возникло что-то через его уничтожение.
Аристотель. Метафизика
Термин «компьютер» (вычислитель) в разное время обозначал различные по­нятия — и клерка-вычислителя, проводившего расчёты вручную или с использо­ванием простых (счёты и подобные им устройства — абак, суанпан) или сложных (арифмометр, механический калькулятор) вспомогательных устройств; и сами эти устройства. При этом в настоящее время даже инженерные калькуляторы представ­ляют собой миникомпьютеры, превосходящие многие ранние ЭВМ. Таким образом, многие аспекты архитектуры вычислительных систем необходимо рассматривать в контексте развития вычислительной техники и программного обеспечения.
Договоримся называть компьютером, или вычислительной машиной, устрой­ство, которое может исполнять заданную изменяемую последовательность вы­числительных операций — программу. Таким образом, компьютер содержит как минимум два уровня абстракции — цифровой логический и архитектуры команд.
Непрограммируемые вычислительные устройства назовём калькуляторами или арифмометрами. Калькулятор содержит цифровой логический уровень, но не включает уровня архитектуры команд.
Исторически можно выделить такой вид калькуляторов, как табуляторы, вы­полняющие единообразную обработку больших массивов данных, представленных на перфокартах. Табуляторы можно назвать также промежуточным звеном между калькуляторами и компьютерами.
1.4.1. Развитие вычислительной техники
И с тех пор у нас в округе гении пропали, А без них кусты сирени все перезавяли.
С. А. Калугин. Небритый гений
Вычислительные машины, как правило, разделяют на четыре поколения в соот­ветствии с используемой элементной базой.
1. Электронные лампы.
2. Транзисторы.
3. Интегральные схемы малой и средней плотности.
4. Интегральные схемы большой и сверхбольшой плотности. Это деление достаточно условно. Вычислительные машины разных поколений достаточно долгое время существовали параллельно. Часто различные компоненты
30 Глава 1. Понятие вычислительной системы (ВС)
одного и того же компьютера строились на различных элементных базах. Кроме того, такое деление не отражает развития архитектуры.
В некоторых источниках вводится понятие пятого поколения, но нет единого его определения. Часть источников выделяет пятое поколение не по элементной базе, а по решаемым задачам. Одноимённый японский проект называет ЭВМ пятого поколения искусственный интеллект, направленный на обработку знаний. Также пятым поколением называют компактные персональные ЭВМ. Таненбаум считает пятым поколением встраиваемые системы (микроконтроллеры, системы на одном кристалле) [46], что естественным образом продолжает устоявшееся деление.
Любое из приведённых определений пятого поколения ЭВМ подразумевает, что в настоящее время оно успешно сосуществует с четвёртым. Также многие источники относят все современные компьютеры к четвёртому поколению.
Часто также выделяют нулевое поколение — электромеханические вычисли­тельные машины. По аналогии с этим чисто механические вычислительные машины можно назвать минус первым поколением.
Большинство поколений делится на три периода: вначале выпускается прото­тип, основанный на новой элементной базе (или несколько независимо разработан­ных прототипов). Такие проекты часто остаются неизвестными из-за секретности или стечения обстоятельств. Через какое-то время множество стран и/или корпо­раций одновременно выпускают более совершенные компьютеры (одиночные или серийные). Соответственно, для каждого поколения указывается три даты: выпуск первого устройства, начало массового использования и выход из употребления.
Минус первое поколение (античность–XVIII в.–конец XX в.) — зубчатые ко­лёса и рейки
К этому поколению можно отнести всего два полноценных компьютера — проект Бэббиджа конца
XIX
в., реализованный только в 1985-1991 гг., и Z1 Конрада
Цузе (1938 г.).
При этом, если заменить в определении компьютера «последовательность вычислительных операций» на просто «последовательность операций», как это сделано в некоторых источниках, к минус первому поколению компьютеров также можно отнести цифровые мультимедийные механические устройства, серийно выпускавшиеся в
XVXIX
вв. (шарманки и музыкальные шкатулки), а также механические станки с ЧПУ — первый известный такой станок был разработан в 1802 г. Жозефом Жаккаром.
Цифровые механические калькуляторы существенно более разнообразны. Со­хранились упоминания об античных и вавилонских вычислительных устройствах, предназначенных для моделирования астрономических событий. Были найдены остатки подобного устройства — механизма из Антикитеры, собранного, по раз­ным оценкам, в 140-80 гг. до н. э.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]