Лисья Нора

Оглавление


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

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

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

В целом, процессоры почти что все имеют следующие обязательные компоненты, которые позволяют ему нормально функционировать.

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

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

§ Регистры

Одной из важнейшей составляющей процессора являются регистры. В процессоре 8086/8088 они разделяются на несколько категории: 1) регистры общего назначения, 2) сегментные регистры, 3) и специальные регистры.
ch1-registers.png
Регистров общего назначения всего 8, и они все являются 16-битными. Но существует некоторая особенность. Первые четыре 16-разрядных регистров можно разделить на две части. Например, если взять регистр AX, то он делится на два 8-битных регистра AH и AL.
Очень важно и нужно понять, что и регистр AH и регистр AL – это просто две части регистра AX, что значит, что если мы поменяем регистр AH или AL, то AX поменяется тоже. Математически, такие регистры связаны следующим образом:
AX = 256 * AH + AL
Как мы можем заметить, если мы поменяем регистр AH, например, добавим +1, то в регистру AX добавится 256. Между прочим, не факт, что если мы поменяем регистр AX, то может поменяться AH или AL. Это смотря где будет изменение. Регистр 16 бит просто состоит из двух частей по 8 бит каждая.
Видно что первые регистры имеют букву, от A до D. 16-битный регистр начинается с AX, а потом сразу переходит на CX, DX, BX. Я не случайно расположил в этом порядке, потому что в процессоре они почему-то располагаются именно в таком порядке и это важно учитывать, потому что номер регистра AX – 0, CX – 1, DX – 2, BX – 3. Они определенным образом пронумерованы и это пригодится в будущем при разработке кода, который будет выполнять доступ к регистрам по их номерам.
Еще стоит обратить внимание на то как названы регистры 8 бит, например AH означает A-High (старший), AL означает A-Low (младший), что показывает на то, в какой именно части регистра AX находится 8-битная его компонента.
Теперь стоит рассказать о назначении каждого регистра.
Несмотря на то что регистры имеют определенное назначение, они могут использоваться как угодно. В том числе и те, которые описываются далее.
Сегментные регистры тоже имеют своё назначение, причем, они разделены более специализированно, хоть и могут применяться как угодно.
Регистр флагов представляет из себя особый регистр, доступ к которому осуществляет сам процессор, изменять его состояние можно только косвенно, с помощью определенных инструкции. Флаги ставятся после выполнения инструкции и каждый имеет свое собственное назначения и смысл.