§ Упрощенная схема компьютера

Любой компьютер состоит из нескольких важных блоков. Это системный блок, монитор, клавиатура, мышь, принтер и прочая периферия. Все эти вещи сложны сами по себе, но изучать будем только то, что касается именно основного блока, сердца компьютера — это процессор. Но процессор не живет сам по себе, для него, как минимум, нужна связь с внешним миром, он должен получать информацию, преобразовывать его в другую информацию и выдавать ее обратно, поэтому процессор и называют процессором, так как он выполняет какой-то процесс над данными.
Процессор должен быть подключен к памяти, а также к внешнему миру, например, к клавиатуре, мыши, жесткому диску, видеоадаптеру. Конечно, он не подключается напрямик к этим устройствам, взаимодействие с ними происходит через контроллеры — это тоже процессоры, которые позволяют взаимодействовать с внешними устройствами.
Теперь я приведу одну очень упрощенную схему, которую увидел в одной книжке, взятой из библиотеки, когда мне было 10 лет.

Самое главное, конечно, это наличие доступа к памяти. Память содержит в себе код, который надо выполнить, и данные, над которыми надо совершить операции. Существуют два вида архитектур — либо это гарвардская, когда код и данные хранятся отдельно, и фон-неймановская, когда и код, и данные находятся в одной памяти. Это значит, что данные могут стать кодом, и наоборот, что очень удобно для того чтобы загружать программы и исполнять их. Так как это является огромным преимуществом, то все процессоры общего назначения используют только фон-неймановскую модель, иначе бы ни одно приложение не удалось бы запустить и невозможно было бы сделать многозадачную среду.

§ Состав процессора

В целом, процессоры почти что все имеют следующие обязательные компоненты, которые позволяют ему нормально функционировать.
  • Устройство управления, модуль, без которого невозможно выполнение ни одной команды. Он, на основе кода операции, выполняет отсылку сигналов в правильном порядке по другим компонентам процессора;
  • Регистровый файл (набор регистров). Это сверхоперативная память, временные данные для работы процессора, разновидность оперативной памяти. Регистры крайне важны для того чтобы хранить временные результаты, быстро оперируя ими и не обращаясь к гораздо более медленной памяти. На самом деле, регистры можно убрать из процессора, но тогда необходимо обеспечить быстрый доступ к общей памяти. В процессоре AVR примерно так и сделано, где 32 первых байт памяти зарезервированы под регистры (то есть это и память, и регистры);
  • Арифметическое-логическое устройство. Я бы назвал это именно ядром компьютера, потому что при его помощи как раз и производятся все возможные вычисления и расчеты. Процессор без этого модуля возможен, но работать он будет плохо, медленно, используя только лишь оперативную память для вычислений;
  • Счетчик PC, программный счетчик, еще один важный регистр, который умеет делать 2 вещи — либо прибавлять +1, либо обновлять на какое-то заданное значение. Этот регистр указывает на адрес в памяти, откуда в данный момент происходит считывание данных или кода. Без этого регистра невозможно вообще выполнение никакого кода, потому что он является указателем на участок программного кода, который в данный момент исполняется.

§ Адресация памяти

Стоит отдельно рассказать о методах адресации памяти в процессоре. Дело в том, что сам по себе процессор является 16-битным, что значит то, что он может адресовать только 2^16 = 65536 байт. В ранних, 8 битных процессорах наподобие Z80, проблема расширения памяти решалась тем, что где-то в памяти подменялся "банк", то есть, мы все еще оставались в пределах 64Кб, но при этом приходилось писать в порт каждый раз номер банка памяти, чтобы заменить отображение участка памяти на другое.
В 8086 такого нет. Здесь проблему решили введением сегментных регистров. Это специальные регистры, их в процессоре всего лишь 4 штуки, и называются они как ES, CS, DS и SS. Каждый сегментный регистр имеет свое назначение.
  • ES — Extended. Сегментный регистр общего назначения, но, в то же время, используется в строковых инструкциях.
  • DS — Data. Общего назначения, используется для адресации данных.
  • CS — Code. Только для указания сегмента кода.
  • SS — Stack. Для указания сегмента, где находится стек.
Каждый сегментный регистр имеет разрядность, аналогично другим регистрам, 16 бит. Но, тут есть одна важная деталь. Она заключается в том, что если мы указываем в сегментном регистре значение 1, то по итогу мы получим смещение +16.
Приведу пример. Допустим, нам надо указать на ячейку памяти, которая равна 9FA1. Как можно заметить, эта ячейка памяти находится в пределах 16 битного значения, так что, чтобы вычислить адрес, можно указать сегмент, равный нулю: 0000:9FA1. Однако, есть и другой способ. Зная то, что 1 сегмент = 10h смещения в адресе, тот то же самый адрес можно указать, например, так:
0900:0FA1
Что будет тоже равно 9FA1h, но — почему? Все просто! Мы 0900h умножим на 10h, получаем 9000h и добавляем 0FA1, получая итоговый адрес 9FA1h!
Таким способом можно формировать указатель памяти совершенно любой комбинации, используя формулу вычисления сегментного регистра и смещения:
ADDRESS = 10h x SEGMENT + OFFSET
Если взять максимальные значения сегмента и смещения, то получим максимальный адрес FFFFh x 10h + FFFFh = 10FFEFh, что равняется 1Мб плюс 64кб (минус 16 байт). Для 8086 больше чем 1 Мб адресовать было нельзя, и потому как только там делался "проворот", то указатель памяти начинался сначала. Для 286 процессора можно было записать что-то сверх 1 Мб памяти, и эта область памяти назвали HMA (High Memory Area). Туда очень удачно влезала резидентная часть DOS, освобождая место для программ.

§ Регистры