§ Упрощенная схема компьютера
Любой компьютер состоит из нескольких важных блоков. Это системный блок, монитор, клавиатура, мышь, принтер и прочая периферия. Все эти вещи сложны сами по себе, но изучать будем только то, что касается именно основного блока, сердца компьютера — это процессор. Но процессор не живет сам по себе, для него, как минимум, нужна связь с внешним миром, он должен получать информацию, преобразовывать его в другую информацию и выдавать ее обратно, поэтому процессор и называют процессором, так как он выполняет какой-то процесс над данными.Процессор должен быть подключен к памяти, а также к внешнему миру, например, к клавиатуре, мыши, жесткому диску, видеоадаптеру. Конечно, он не подключается напрямик к этим устройствам, взаимодействие с ними происходит через контроллеры — это тоже процессоры, которые позволяют взаимодействовать с внешними устройствами.
Теперь я приведу одну очень упрощенную схему, которую увидел в одной книжке, взятой из библиотеки, когда мне было 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. Для указания сегмента, где находится стек.
Приведу пример. Допустим, нам надо указать на ячейку памяти, которая равна
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, освобождая место для программ.