Chapter_15 (1110567), страница 5
Текст из файла (страница 5)
Он также знает, что в его распоряжении имеются также такие удобные команды егокомпьютера, как "Подведение баланса", "Проводка счёта" и другие, непонятные неосведомлённым лицам операции. Можно считать, что Петров работает на некоторой виртуальноймашине, снабжённой такими очень удобными для него командами, с помощью которыхбухгалтерская программа и общается с "внешним миром". Ввод данных при этом производится в терминах профессиональной деятельности пользователя-непрограммиста, например, путём заполнения всевозможных форм и бланков.•Уровень прикладного программиста. Программист Петров, который и написал бухгалтерскую программу на языке Паскаль, только улыбнётся наивности бухгалтера Иванова. Уж онто точно знает, что даже для того, чтобы вывести только один, например, символ 'A', надонаписать оператор стандартной процедуры Write('A') .
Для Петрова общение его программы с "внешним миром" заключается в использовании стандартных процедур ввода/вывода, доступных в его языке программирования высокого уровня. Правда, Петровуизвестно, что на самом деле его программа сначала переводится (транслируется) с Паскаляна машинный язык, а лишь потом выполняется на компьютере. Поэтому, зная, что язык ассемблера очень близок к машинному языку, он из любопытства поинтересовался у программиста на Ассемблере Сидорова, что тот напишет в своей программе, чтобы вывестисимвол 'A'. Сидоров, немного подумав, ответил, что обычно для этой цели он пишет предложение Ассемблера outch 'A' . Разница между этими двумя способами вывода символа в Паскале и в Ассемблере показалась Петрову несущественной. Например, он читал отом, что, скажем, в языке С для этой же цели надо вызвать библиотечную функцию1printf("%c",'A'); .•Уровень операционной системы.
Сидоров, однако, знает, что предложение outch 'A'является на самом деле не командой машины, а макрокомандой, на её место Макропроцессор подставит на этапе компиляции макрорасширение, например, такого видаmov dl,'A'mov ah,02hint 21h•1Вот этот, как говорят, системный вызов и будет, с точки зрения Сидорова, выводить символ 'A' на стандартное устройство вывода, которое может быть, в частности, как экраном, так и печатающим устройством или текстовым файлом. Таким образом, общение с"внешним миром" представляется для Сидорова множеством системных вызовов в его программе на Ассемблере с использованием команды языка машины с кодом операции int.Обработка системных вызовов производится операционной системой, поэтому этот уровеньлогично назвать именно так.Уровень языка машины.
Системный программист Антонов (раньше иногда говорили системный аналитик), однако, снисходительно пояснит Сидорову, что его системный вызовЭто очень яркий пример того, как макросредства повышают уровень языка Ассемблера: макрокомандавывода символа в языке низкого уровня оказывается для Петрова по внешнему виду (если отвлечься от деталейсинтаксиса), очень похожа на соответствующие средства языков высокого уровня.11– это просто переход по команде int 21h на служебную процедуру-обработчика прерывания с шестнадцатеричным номером 21h. А уж эта процедура и произведёт на самом деле вывод символа, используя, в частности, специальные команды языка машины для обменас внешними устройствами in и out.
Именно эти машинные команды и будут, с точки зрения Антонова, используя порты ввода/вывода, производить вывод символа с регистра центрального процессора на некоторое периферийное устройство. На этом уровне используются все команды языка машины, включая привилегированные.•Инженер-электронщик. Инженер Попов, внимательно прослушав разговор пользователей,скажет, что всё это неверно. На самом деле центральный процессор выводит символ наэкран или печатающее устройство путём сложной многоступенчатой последовательностидействий с общей шиной, используя специальный протокол работы.
Эти действия включаетв себя такие операции с общей шиной, как запрос, захват, передача данных и освобождениеэтой шины – цикл шины. И только после этого символ, наконец, прибывает с регистра центрального процессора по назначению на печатающее устройство. Таким образом, командыязыка машины in и out просто инициируют циклы шины, посредством чего и производится обмен данными между центральным процессором и периферийными устройствами.Как Вы догадываетесь, нельзя сказать, кто же из этих людей прав, и, как это часто бывает в современной науке, бессмысленно спрашивать, как всё происходит "на самом деле". Каждый из нихправ со своего уровня видения архитектуры компьютера.
И, как мы уже говорили, опускаться на более низкий уровень рассмотрения архитектуры следует только тогда, когда это абсолютно необходимо для дела. В этом смысле точка зрения бухгалтера Иванова для него самого ничем не хуже, чем усистемного программиста Антонова.Разберём теперь простой пример реализации операции ввода/вывода на уровне системного программиста. Оставим в стороне пользователя-непрограммиста (он нам сейчас неинтересен) и рассмотрим, например, операцию перемещения курсора на экране компьютера в позицию с координатами(X,Y).Для прикладного программиста, как Вы знаете, для этой цели надо выполнить, например, оператор стандартный процедуры Турбо-Паскаля GotoXY(X,Y) . Для программиста на Ассемблере позицирование курсора можно выполнить с использованием такого системного вызова:ah,2bl,0dl,Xdh,Y10hmovmovmovmovintКак видим, параметры X и Y для позицирования курсора передаются в регистрах dl и dh.
Системный вызов int 10h может выполнять различные операции с экраном компьютера, в зависимости от своих параметров, передаваемых ему на регистрах. Рассмотрим (в сильно упрощённом виде)тот фрагмент процедуры-обработчика этого системного вызова, который выполняет запрос на позицирование курсора.1Во-первых, нам необходимо понять, а как вообще дисплей (точнее, электронная схема – контроллер дисплея) "знает", куда необходимо в каждый момент времени поставить курсор на экране.Оказывается, что у контроллера дисплея, как, впрочем, и у любого другого периферийного устройства, есть свои регистры.
Нас будут интересовать регистры дисплея с десятичными номерами 14 и 15(обозначим их R14 и R15), каждый из них имеет размер 8 бит, но их совокупность, как это часто бывает в нашей архитектуре, является регистровой парой и может хранить длинное целое число, какпоказано ниже16 битR141R15Этот пример относится только к младшей модели нашего семейства, которые снабжались достаточнопростым видеоконтроллером, управляющим выводом данных на простой VGA дисплей в компьютерах первыхпоколений нашего семейства.
Сейчас, наверное, такие ЭВМ можно найти только в музеях вычислительной техники. Современные компьютеры оснащаются сложными видеоплатами, которые по существу являются специализированными процессорами вывода, программирование операций для таких плат значительно сложнее, иобычно программист эти не занимается.12Далее, дисплей "считает", что его экран имеет не 25 строк и 80 столбцов,1 как думают обычныеприкладные программисты, а 25*80 знакомест, в каждое из которых можно вывести один символ ипоставить курсор.
Знакоместа в первой строке экрана нумеруются не от 1 до 80, как считает, например, программист на Паскале, а от 0 до 79, во второй строке – от 80 до 159 и т.д. Другими словами,все позиции экрана рассматриваются как одномерный массив, пронумерованный, начиная с нуля. Таквот, чтобы курсор переместился в нужную нам позицию (X,Y) в пару регистров <R14,R15> необходимо записать число80*(Y-1)+(X-1)Следовательно, сначала процедуре-обработчику прерывания необходимо вычислить это число,используя параметры X и Y из системного вызова. Освоив язык Ассемблера, мы уже знаем, что этоможно сделать, например, такими командами:movdecmuldecaddadcmoval,80dh; Y-1dh; ax:=80*(Y-1)dl; X-1al,dhah,0; ax:=80*(Y-1)+(X-1)bx,ax; Спасём ax на bxТеперь необходимо переслать содержимое регистров bl и bh соответственно в регистры R15 иR14 нашего дисплея.
Для этого мы будем использовать два порта дисплея (в каждый можно записывать для передачи дисплею операнд размером в байт). Порт с шестнадцатеричным номером 3D4hпозволяет выбрать номер регистра дисплея, в который будет производиться очередная запись данных. Для этого в этот порт необходимо записать номер соответствующего регистра (у нас это десятичные номера 14 и 15).
После выбора номера регистра назначения, запись в выбранный регистрпроизводится посредством посылки байта в "транспортировочный" порт дисплея с номером 3D5h. Витоге получается следующий фрагмент программы:movmovoutincmovoutdecmovoutincmovoutdx,3D4h; Порт выбора регистраal,15dx,al; Выбираем R15dx; Порт записи в регистры 3D5hal,bl; младший байт из bxdx,al; Запись в R15dx; Порт выбора регистраal,14dx,al; Выбираем R14dx; Порт записи в регистрыal,bh; старший байт из bxdx,al; Запись в R14Вот теперь курсор будет установлен в нужное место экрана, и можно возвращаться на команду,следующую за системным вызовом int 10h . Разумеется, наш алгоритм весьма примитивен. Например, после записи в 15-й регистр дисплея и до записи в 14-й регистр курсор прыгнет в непредсказуемое место экрана, так что по-хорошему надо было бы на время работы нашего фрагмента заблокировать для контроллера чтение данных из регистров дисплея.
Это, разумеется, делается записью некоторого значения в определённый управляющий регистр дисплея, для чего понадобятся идругие команды in и out. Кроме того, хорошо бы предварительно убедиться, что дисплей вообщевключён и работает в нужном нам режиме, для чего потребуется, например, считать из определённого регистра дисплея некоторые его флаги состояния.Вот, примерно так и видит общение программы с "внешним миром" системный программист накомпьютере с общей шиной. Надеюсь, что этот простенький и сильно упрощённый фрагмент реали1Мы рассматриваем, естественно, работу дисплея только в стандартном текстовом режиме, когда на экране располагается 25 строк по 80 символов в каждой строке.13зации системного вызова не отобьёт у Вас охоту стать системным программистом и заниматься написанием драйверов внешних устройств ☺.15.2.2. Достоинства и недостатки архитектуры с общей шинойИз рассмотренной схемы связи всех устройств компьютера с помощью общей шины легко увидеть как достоинства, так и недостатки этой архитектуры.
Несомненным достоинством этой архитектуры является её простота и возможность лёгкого подключения к шине новых устройств. Для подключения нового устройства необходимо оборудовать его соответствующими портами, присвоив имсвободные номера, благо этих номеров много (216).
Далее, конечно, системный программист (обычноработающий на заводе-изготовителе данного внешнего устройства), должен написать программудрайвер, которая предоставляется пользователям вместе с устройством. При работе компьютера этотдрайвер будет процедурой-обработчиком соответствующего прерывания.Главный недостаток этой архитектуры тоже очевиден: пока два устройства обмениваются данными, остальные не могут этим заниматься и должны простаивать (говорят, что они пропускают циклы шины). Можно сказать, что компьютер в какие-то периоды времени вынужден соизмерять скорость своей работы со скоростью самого медленного устройства на общей шине.
Этот недостатокдавно осознан конструкторами ЭВМ и с ним пытаются бороться. Например, наряду с главной шиной,соединяющей все устройства, вводят в архитектуру вспомогательные внутренние шины, соединяющие избранные, самые быстрые устройства (например, центральный процессор и оперативнуюпамять). Ясно, однако, что невозможно соединить своими шинами все возможные пары устройств,это просто экономически нецелесообразно, не говоря уже о том, что такую архитектуру очень труднореализовать.Здесь можно ещё упомянуть и о трудностях определения состава оборудования, подключённогок общей шине.
Действительно, как может центральный процессор (точнее, служебная программаоперационной системы) определить, какие устройства подключены в данный момент к общей шине?Практически единственная возможность – это посылать сообщения ко всем возможным портам (а их216) в надежде, что некоторые из них "откликнутся", и можно будет прочитать из них тип и характеристики данного устройства. Те пользователи, которым приходилось устанавливать на свой компьютер операционную систему (например, Windows), могли заметить, что, когда дело доходило до определения состава подключённого к компьютеру оборудования, программа установки надолго "задумывалась".