1

1. Программно - аппаратное обеспечение для ПЭВМ

В тех случаях, когда требуется понимание основных принципов работы микрокомпьютера, полная реализация всех его возможностей, использование внешних устройств с наибольшей эффективностью— необходимо программирование на уровне машинных языков (кодов).

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

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

1.1. Структурная схема микрокомпьютера

Микрокомпьютер обычно имеет структурную схему, подобную показанной на рис. 1.1.

Рис. 1.1. Структурная схема микрокомпьютера.

При работе такой микроЭВМ обычно выполняются следующие процедуры:

1) Программа или данные вводятся с помощью клавиатуры или из вспомогательного запоминающего устройства (ЗУ) в основную память.

2) Микропроцессор выбирает из основной памяти команды программы в том порядке, в котором их надлежит выполнять, считывает указанные в командах данные, производит над ними заданные действия. «Адрес» на рисунке содержит информацию, указывающую, из какой ячейки основной памяти должна выбираться команда или данные.

3) Микропроцессор пересылает результаты обработки (выходные данные) в основную память или выдает их на устройства вывода — на периферийное ЗУ, на дисплей, на печатающее устройство (принтер) и т. д. В случае размещения данных в основной памяти адрес указывает, куда должны быть помещены данные.

Рассмотрим в качестве примера типичный шестнадцатиразрядный микропроцессор 8086, структурная схема которого показана на рис. 1.2. Та часть микропроцессора, которая принимает участие в реализации команд, составляющих программу, представлена в верхней половине рисунка.

Рис. 1.2 Структурная схема микропроцессора 8086.

Рис. 1.3. Способы адресации в процессоре 8086:
а —адреса байтов; б—• сегментация основной памяти.

В процессоре 8086 основная память разделена на участки по 1 байт (8 бит) каждый (рис. 1.3, а), которые различаются номерами 0, 1, 2, и т. д. соответственно. Это позволяет осуществить, например, выбор команды длиной 1 байт, занимающей участок памяти под номером 5, или выбор данного, имеющего длину байт и занимающего область памяти, включающую участки с номерами 1, 2, 3, 4.

Возможен и другой способ адресации, основной памяти, при котором память разделяется на области, называемые сегментами (рис. 1.3,б). Сегменты будут подробно рассмотрены ниже. При объединении нескольких однобайтных участков памяти в один сегмент и оперировании им как единым целым появляется возможность выделить в памяти область программ и область данных и использовать каждую из них независимо. Оказалось, что оперировать сегментом, например при распределении области программ (сегмент кодов) в постоянной памяти (ROM) или области данных (сегмент данных) в памяти с произвольным доступом (RAM), очень удобно, поскольку сегмент может быть выбран в любом месте основной памяти (могут быть использованы любые «номера участков»), и размер его также может быть любым.

На рис. 1.3 в качестве примера память распределена следующим образом: в 1-м сегменте — область стека (который будет рассмотрен ниже), во 2-м сегменте — область данных, в 3-м сегменте — дополнительная область данных, в 4-м сегменте — область программ (кодов).

Регистры CS, SS, DS, ES указывают, с какого адреса начинается область памяти, занимаемая каждым из перечисленных выше сегментов в основной памяти.

В частности, регистр CS .(сегмент кодов) используется для указания, в каком сегменте находится программа. IP (указатель команд), SP (указатель стека), ВР (указатель базы) представляют собой регистры, указывающие адреса команд и данных в соответствующих сегментах. ЕА означает исполнительный адрес данных (об этом речь будет идти ниже).

Теперь вернемся к рис. 1.2 и рассмотрим его с учетом разбиения основной памяти на сегменты.

1) По содержимому регистров CS и IP (хранящих адрес команды в виде базового адреса сегмента и номера байта в сегменте) определяется местонахождение (адрес) команды, выполняемой на следующем шаге.

2) Вычисленный адрес команды пересылается в основную память.

3) По указанному адресу из основной памяти считывается соответствующая команда и пересылается в процессор. В процессоре 8086 адреса, пересылаемые в память, а также команды и данные, считываемые из памяти, передаются по линиям, физически выполненным в виде единой шины. Поэтому в верхней части рис. 1.2 тракт передачи сигналов в основную память представлен в виде одной шины.

4) Команды, их длина от 1 до 6 байт, пересылаются в процессор, где помещаются в «очередь команд», показанную в левой верхней части рисунка 1.2 ). Команды выполняются в порядке очередности.. В процессоре 8086 передача данных осуществляется 2-байтными словами, последовательно записываемыми в «очередь команд>, После этого процессор формирует команду нужной длины.

5) Если при выполнении команды требуются данные, то адрес их местоположения вычисляется в блоке преобразования адресов (верхняя правая часть рис. 1.2) по информации, содержащейся в адресной части команды, по базовым (начальным) адресам сегментов, содержащимся в регистрах DS, SS, ES, а также по адресам, содержащимся в регистрах SP, ВР, SI, DI.

6) Данные, считанные из основной памяти по указанному адресу, пересылаются в регистр данных или в арифметическо-логическое устройство (нижняя часть рис. 1.2) и обрабатываются в соответствии с командой, адрес которой найден на шаге (2). Результаты обработки данных также в соответствии с командой помещаются в какую-либо область основной памяти или в какой-либо из регистров.

Повторение описанной процедуры составляет выполнение программы. Следует обратить внимание на то, что для вычисления адреса процессору 8086 необходимо знать номер сегмента и обычный адрес (номер байта, называемый также смещением). На практике при указании адреса обычно можно обойтись только смещением, поскольку по умолчанию предполагается, что значение содержимого регистра DS известно, однако можно указать и значение сегмента.

1.2. Регистры микропроцессора

Из упоминавшихся выше элементов, составляющих микропроцессор, набор регистров — это главное, что нужно знать при написании программы.

Регистры, входящие в состав микропроцессора 8086, еще раз представлены на рис. 1.4.

Рис. 1.4. Основные регистры процессора модели 8086.

Регистр IP (указатель команд), указывающий адрес команды, подлежащей выполнению на следующем шаге, устанавливается автоматически средствами микропроцессора и не может изменять свое значение под действием команды, входящей в состав программы, т. е. с точки зрения программы он не существует.

Набор регистров в верхней половине рис. 1.4 предназначается для обработки данных с помощью команд. Эти регистры называются регистрами общего назначения, так как допускают произвольное использование (могут содержать и данные и адреса).

Для четырех регистров SI, DI, BP, SP, имеющих длину 16 разрядов (2 байт) основными операциями являются операции, соответствующие их названиям, но в общем случае они могут использоваться в разных целях, и в частности для хранения 16-разрядных адресов.

Каждый из регистров АХ, ВХ, СХ, DX также имеет длину 16 разрядов. Эти регистры делятся на левую (старшую) и правую (младшую) половину, которые могут быть использованы как соответствующие самостоятельные регистры длиной 8 разрядов. В этом случае регистры получают имена АН, AL, BH, BL, СН, CL, DH, DL.

Буквы А, В, С, D, входящие в эти названия, являются начальными буквами слов «аккумулятор», «база», «счетчик», «данные» соответственно, отражающих их основное назначение, однако эти регистры могут использоваться для совершенно произвольных операций.

Как будет показано ниже, регистру АХ (АН, AL) присущи некоторые функции, не свойственные другим регистрам, и поэтому он является регистром общего назначения с расширенными функциями (аккумулятором).

Название процессора 8086 «шестнадцатиразрядный микропроцессор» связано с тем, что длина его регистров, как видно из рисунка, составляет 16 разрядов, и обмен данными, например с основной памятью, возможен только порциями по 16 разрядов.

В самой нижней части рис. 1.4 показан регистр флажков. Значения его битов устанавливаются в зависимости от результата выполнения команды арифметическо-логическим устройством, например от результата арифметической операции (положительный, отрицательный или равный нулю). Содержимое этого регистра используется для определения дальнейшего порядка выполнения программы.

Остальные регистры, показанные на рис. 1.4, — SS, DS, ES, BS — содержат начальные адреса сегментов. Все эти четыре регистра 16-разрядные, но их содержимое смещено на четыре разряда влево по отношению к другим регистрам. Конкретный смысл этого смещения можно понять из рис. 1.5.

Рис. 1.5. Физический адрес, состоящий из смещения и начального адреса сегмента.

Адрес в основной памяти является адресом байта; адрес байта внутри сегмента называется смещением; начальный адрес сегмента сдвигается на 4 разряда влево, при этом его значение увеличивается в 24 = 16 раз и становится 20-разрядным; сдвиг на 4 разряда влево равносилен присоединению к адресу справа 4 двоичных разрядов 0000.

Столь сложный способ формирования адреса в процессоре 8086 объясняется главным образом тем, что в этом случае объем адресного пространства будет составлять 220 = 210 х 210 = 1024 Кбайт = 1 Мбайт, в то время как при использовании 16-разрядного адреса, объем адресного пространства будет составлять всего лишь 216 = 26 х 210 = 64 х 1024 байт = 64 Кбайт. Таким образом, желателен адрес, имеющий полную длину 20 разрядов; он получается путем сдвига начального адреса сегмента влево на 4 разряда и добавления части адреса, называемой смещением. Это имеет следующий смысл.

1) Минимальный размер сегмента составляет 16 байт, максимальный размер составляет 64 Кбайт.

2) Размер сегмента (с учетом 1)) может быть любым, но его начальный адрес должен быть целым числом, кратным 16. Например, адрес 50 можно рассматривать просто как адрес 50, но можно и как 50 = 3 х16 + 2, поэтому можно сказать, что это байт номер 2 в сегменте 3.

3) Любой сегмент можно помещать в любое место основной памяти — свойство перемещаемости (об этом речь будет идти ниже).

Следует еще раз подчеркнуть важную роль, которую играет понятие сегмента при написании программ для процессора 8086. При отведении и для программы, и для данных объема памяти не более 64 Кбайт, т. е. в случае, когда речь идет об одном сегменте, проблемы не возникает, но, если программа или данные содержат более 64 Кбайт, они распространятся на два сегмента, и потребуется переход от одного сегмента к другому с помощью команды, входящей в программу. В первом случае содержимое регистров сегментов DS, SS, ES на рис. 1.5 может быть установлено один раз в начале программы, а во втором случае его придется изменять в процессе работы. Смещение адреса в любом случае определяется содержимым какого-либо из регистров ВР, SP, SI, DI, AX, BX, CX, DX или адресной частью команды. Возможность устанавливать регистры DS, SS, ES программным способом означает, что благодаря изменению их содержимого можно размещать данные (их сегменты) в любом месте основной памяти (свойство перемещаемости). Для сегмента CS изменение его содержимого с помощью программы не допускается только в одном случае — при указании местоположения самой программы, однако и в этом случае нет ничего невозможного в том, чтобы сделать программу перемещаемой.

1.3. Интерфейс операционной системы

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

Однако для выполнения таких работ, как написание программы, ввод ее в ЭВМ, проверка правильности работы, исправление ошибок, недостаточно одних только аппаратных средств, показанных на рис. 1.1, необходимы и средства программного обеспечения. В ЭВМ с простой системой команд, таких как первые четырех- или восьмиразрядные микрокомпьютеры, программу, написанную на языке ассемблера, можно было реализовать, глядя в таблицу команд и вводя их в микрокомпьютер вручную с помощью клавиатуры после пересчета их кодов в шестнадцатеричные числа (также выполнявшегося человеком). Но для 16-разрядных микрокомпьютеров, таких, например, как 8086, из-за значительного усложнения системы команд подобные ручные операции практически невозможны, а если даже предположить, что они возможны, то эффективность работы на микрокомпьютере при использовании ручных операций будет невысокой.

Пользователи стремятся использовать компьютер эффективно, поэтому разработчики постепенно пришли к тому, что и персональные компьютеры стали снабжать пакетом стандартных программ, называемым ОС (операционной системой). С точки зрения пользователя структурная схема персонального компьютера, оснащенного ОС, вместо показанной на рис. 1.1 примет вид, показанный на рис. 1.6. На рис. 1.6 микрокомпьютеру, представленному на рис. 1.1, соответствует ОС, с помощью которой реализуются не только системные программы, такие как редактор текста, ассемблер, редактор связей (компоновщик), отладчик, называемые средствами разработки программного обеспечения, но и управление прикладными программами. При наличии ОС в качестве языка программирования кроме языка ассемблера можно использовать и такие как Фортран, Паскаль, Си, С++, и др. - называемые языками высокого уровня.

Рис. 1 6 Микрокомпьютер с точки зрения программного обеспечения.

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

При использовании интерфейса ОС для управления вводом-выводом возникают трудности, связанные с тем, что программисту становятся неясными подробности управления вводом-выводом, но, с другой стороны, при этом пропадает необходимость в затратах труда программиста на составление подробной программы управления устройством ввода - вывода и появляются преимущества, связанные с возможностью унификации составленных программ. На рис. 1.6 необходимо обратить внимание на то, что между ОС и устройствами ввода-вывода находится область (использующая часть основной памяти), называемая буфером, предназначенная для временного хранения данных. Мы часто используем в программе такие команды, как «считать с магнитного диска связанные данные», «записать данные на диск», но, когда мы отдаем такую команду, на самом деле вводимые или выводимые с помощью программы данные находятся в буфере, а обмен данными между диском и буфером очень часто осуществляется аппаратными средствами.

Типичными ОС, используемыми в микрокомпьютере 8086, наиболее широко применяемыми в современных персональных компьютерах, посредством которых осуществляется разработка программного обеспечения, являются ОС типа MS-DOS, UNIX, Linux, WINDOWS и др. Ниже рассматривается наиболее часто применяемая ОС типа MS-DOS, а в качестве примера интерфейса для управления стандартными устройствами ввода-вывода — стандартный интерфейс (вызов функций) ОС типа MS-DOS