Файл: Могилев А.В. Информатика.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 31.03.2021

Просмотров: 6840

Скачиваний: 51

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 

411 

ский  программист  Питер  Нортон  метко  назвал  эют  способ  словом  «клудж»  (от  английского 
«kludge» - приспособление для временного устранения проблемы). Сегментный метод адресации 
был предложен для первого 16-разрядного МП 8086 для того. чтобы, используя 16-разрядные ре-
гистры, можно было получить 20-разрядный адрес и тем самым расширить максимально возмож-
ный объем ОЗУ с 64 кбайт до 1 Мбайта. Суть метода состоит в том, что адрес ОЗУ вычисляется 
как сумма двух чисел (сегмента и смещения), причем одно из них сдвинуто влево на 4 двоичных 
разряда, т.е. умножено на 16. Пусть, например, сегмент в шестнадцатеричном виде равен АООО, а 
смещение - 1000. Общепринятая запись такого адреса имеет вид АООО: 1000. Итоговый адрес ра-
вен 

    А000()                          
 +   1000 
    А1000 
«Такой способ адресации более 64 кбайт памяти кажется довольно странным, однако он ра-

ботает», - не без некоторой иронии замечает по этому поводу Питер Нортон. 

Добавим, что, помимо всего прочего, при сегментной адресации один и тот же адрес ОЗУ 

может  быть  представлен  несколькими  комбинациями  чисел  (в  самом  деле,  одну  и  ту  же  сумму 
можно получить разными способами) 

Поскольку современные интелловские процессоры, начиная с 80386, стали 32-разрядными, 

их регистров хватает, чтобы адресовать до 4 Гбайт памяти Сегментный способ при этом становит-
ся  излишним,  хотя  и  сохраняется  как  вариант  ради  обеспечения  программной  совместимости  с 
предыдущими моделями. 

Нам осталось рассмотреть еще один очень специфический, но интересный и часто исполь-

зуемый на практике способ адресации данных в ОЗУ. Речь пойдет о работе со стеком. Сам термин 
происходит от английского слова «stack», имеющего множество значений, причем ни одно из них 
не  подходит  достаточно  точно.  Чаще  всего  в  литературе  упоминается  магазин  револьвера,  кото-
рый по очереди обеспечивает доступ к каждому патрону. Даже если не учитывать ненужную «ми-
литаризацию»  терминологии,  такой  перевод  явно  не  подходит  к  современной  реализации  стека. 
Во-первых,  стек  не  является  круговым,  а  во-вторых,  информация  в  стеке  микрокомпьютера  не 
смещается (для точности аналогии пришлось бы признать, что магазин покоится, а вращается ре-
вольвер!). Поэтому возьмем термин «стек» как есть, без перевода, и перейдем к определению. 

Стек -

 это неявный способ адресации, при котором информация записывается и считывает-

ся только последовательным образом с использованием, так называемого, указателя стека. 

Обратимся к примеру. Пусть требуется на время сохранить значения трех целочисленных 

переменных N1, N2 и N3, а затем их все сразу восстановить. Попробуем воспользоваться для этого 
стековой памятью. Прежде всего запомним, что стек всегда имеет единственный вход и выход ин-
формации - для .хранения его адреса и нужен указатель стека. Пусть для определенности он сей-
час содержит адрес 2006 (рис. 4.13, а). Тогда по команде «записать в стек N1» (обратите внимание, 
что в команде не фигурирует явно ни адрес ОЗУ, ни регистр МП!) процессор проделает следую-
щее: 

1) уменьшит указатель стека на 2 (целое число занимает в памяти 2 байта); 
2) запишет N1 по полученному адресу 2004 (рис.

 

4.13, б). 

Аналогично при выполнении команд «записать в стек N2» и «записать в стек N3» значения 

этих переменных попадут в ячейки 2002 и 2000, причем указатель стека станет равным 2000 (рис. 
4.13, в). 

 

Рис. 4.13.

 Пример для изучения принципа работы стека 

 


background image

 

412 

Теперь займемся извлечением информации. Как видно из рис. 4.13, в, указатель сейчас «на-

правлен»  на  значение  переменной  N3,  а  значит  считывать  придется,  начиная  с  него.  Выполним 
команду «прочитать из стека N3». При этом процессор 

1) считает в N3 значение из стека; 
2) увеличит указатель на 2 (рис. 4.13, г).  
Аналогично прочитаем N2 и N1, после чего стек опустеет и вернется к начальному состоя-

нию, изображенному на рис. 4.13, а. 

Примечание.

 Обратим внимание на то, что значение в стеке после считывания, конечно же, 

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

Подводя  итоги  рассмотрения  примера,  обратим  внимание  на  следующее.  Та  информация, 

которая заносится в стек первой, извлекается последней и наоборот. Обычно об организации стека 
говорят: «первым пришел - последним ушел». Удобно представить себе аналогию с детской пира-
мидкой, нижнее кольцо которой невозможно снять до тех пор, пока не будут сняты все остальные. 

Еще раз подчеркнем, что в командах работы со стеком адрес ОЗУ не фигурирует в явном 

виде.  Но  при  этом  молчаливо  предполагается,  что  указатель  стека  уже  задан.  Как  правило,  ини-
циализацию указателя стека компьютер делает сам, но не мешает поинтересоваться, так ли это в 
вашем конкретном случае и достаточно ли памяти под стек имеется при этом. Если указатель сте-
ка определен неправильно, то запись в стек может разрушить полезную информацию в ОЗУ и вы-
звать непредсказуемые последствия. 

Интересно, что со стековым способом организации мы имеем дело в жизни гораздо чаще, 

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

Итак, мы подробно рассмотрели общие принципы записи информации в стек. Остается ска-

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

 
 

3.4. ФОРМАТЫ ДАННЫХ 

 
Почти каждая команда процессора нацелена на обработку данных, местонахождение кото-

рых определяется значениями адресов операндов. Для понимания работы процессора существенно 
представлять, какого рода данные он может обрабатывать. 

Если  в  ходе  исполнения  программы  ее  остановить,  прочитать  содержимое  какой-нибудь 

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

Перечислим некоторые форматы данных, типичные для 16- разрядной ЭВМ. 

8- битовые целые числа без знака.

 Каждое такое число занимает 1 байт и воспринимается 

процессором  как  целое  положительное  число.  Следовательно,  диапазон  представимости  чисел  в 
этом формате от 00000000 до 11111111, т.е. от 0 до FF в шестнадцатеричной системе (от 0 до 255 в 


background image

 

413 

десятичной). 

8- битовые целые числа со знаком.

 В этом случае величина числа задается семью битами, 

а значение старшего бита определяет знак числа (0 - положительное, 1 -отрицательное). Например, 
в этом формате код 01101011 означает число +6В. 

Однако код 11101011 не означает, как можно подумать, число -6В, так как для кодирования 

отрицательных чисел применяется, так называемый, дополнительный код. Он образуется следую-
щим образом: 

• находится восьмиразрядное двоичное представление абсолютной величины числа; 
• найденный код инвертируется, т.е. в нем нули заменяются на единицы и наоборот; 
• к полученному коду арифметически прибавляется единица. 
Например, процесс получения дополнительного кода десятичного числа -75 таков: 

01001011      10110100      10110101 

/

 

Использование дополнительного кода  облегчает организацию арифметических действий  в 

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

Обратная  процедура  -  восстановление  значения  числа  по

 

дополнительному  коду  -

осуществляется по тому же правилу, что и прямая. 

Диапазон представимости чисел в этом формате: от-128 до +127. 

16- битовые целые числа со знаком и без знака.

 Они в точности аналогичны 8-битовым, 

но  код  имеет  вдвое  большую  длину.  Соответственно,  многократно  возрастает  диапазон  предста-
вимости: для чисел без знака от 0000 до FFFF (т.е. от О до 65535 в десятичной системе), для чисел 
со знаком - от -8000 до +7FFF (т.е. в десятичной системе от -32768 до +32767). 

8-  битовые  символы.

  В  этом  формате  двоичный  код  интерпретируется  обрабатывающей 

его командой как код символа. При работе с персональными ЭВМ обычно используется система 
кодирования ASCII, о которой говорилось в главе 1. В этой системе стандартизированы (закрепле-
ны  за  определенными  символами)  коды,  у  которых  значение  старшего  бита  равно  0;  все  прочие 
коды остаются за символами национальных алфавитов и дополнительными специальными симво-
лами. 

Битовые поля.

 В этом формате значащим является не весь 8- или 16- разрядный код в це-

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

Существуют и другие форматы данных - двоично-десятичные числа, строки и т.д. 
 

3.5. ОБРАБОТКА ПРЕРЫВАНИЙ 

 
Важную роль в работе современного МП играют прерывания. Они всегда нарушают естест-

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

События,  вызывающие  прерывания,  можно  разделить  на  две  группы: 

фатальные 

и 

нефа-

тальные.

 На фатальные (неотвратимо наступающие) процессор может реагировать единственным 

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

Основные виды прерываний - 

внутрипроцессорные прерывания

  и 

прерывания от внешних 

устройств.

 Первые связаны с возникновением непреодолимого препятствия при выполнении про-

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


background image

 

414 

принимает меры по обработке внешней нештатной ситуации. 

Гораздо  реже,  но  возможны,  нефатальные  внутрипроцессорные  прерывания,  например, 

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

Прерывания  второй  группы  возникают  по  требованиям  какого-либо  из  многочисленных 

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

 

из

 

стека значения своих регистров и продолжает выполнение прерванной программы. 

Прерывания от внешних устройств подробно рассматриваются в следующем пункте. 
Отметим, что термин «прерывание» часто используется еще в одном значении. Речь идет о, 

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

К  программным  относятся  и  межмашинные  прерывания,  возникающие  в  локальной  сети 

при обмене информацией между компьютерами. 

Запрет  нефатального  прерывания  называется 

маскировкой;

  маскировка  задается  програм-

мистом  или  системной  программой.  Делается  это  либо  с  помощью  установления  вида  битового 
поля в специальном регистре маски прерываний, в котором значения разрядов (0 или 1) связаны 
соответственно с отсутствием или наличием маскировки закрепленного за этим разрядом преры-
вания, либо с аналогичным использованием разрядов регистра состояния процессора. 

После получения сигнала о незамаскированном прерывании процессор делает следующее: 
• запоминает состояние прерванной программы; 
• распознает источник прерывания; 
• вызывает и выполняет специальную системную программу обработки прерываний; 
•  восстанавливает  состояние  прерванной  программы

 

и,  при  возможности,  продолжает  ее 

исполнение. 

Для  распознавания  источника  прерывания  анализируются  некоторые  биты  регистра  со-

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

Назначение  программы  обработки  -  понять  и  в  удобной  для  пользователя  форме  вывести 

(обычно на экран) сообщение о причине прерывания и (иногда) дать рекомендации по возможной 
реакции на эту причину. 

Все это разительно отличается от ситуации с машинами 1-го и 2-го (а отчасти и 3-го) поко-

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

 

3.6. РАБОТА МИКРОПРОЦЕССОРА С ВНЕШНИМИ УСТРОЙСТВАМИ 

 
Выше  было  описано,  как  процессор  обменивается  информацией  с  ее  наиболее  важным  и 

оперативным источником - памятью. Рассмотрим теперь, как МП может принять данные или пе-
редать их внешним устройствам. Способ решения этой задачи в зависимости от конструкции ЭВМ 
(подчеркнем:  не  от  конструкции  МП,  а  от  конструкции  всей  ЭВМ!)  может  быть  одним  из  двух 


background image

 

415 

указанных ниже: 

1) устройства ввода-вывода включаются в общее адресное пространство; 
2) устройства ввода-вывода имеют собственное адресное пространство. 
В  первом  случае  при  обращении  к  определенным  адресам  памяти  вместо  обмена  с  ОЗУ 

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

Во втором случае внешние устройства образуют отдельное адресное пространство, обычно 

значительно меньшее, чем у ОЗУ. Каждая ячейка этого дополнительного адресного пространства 
называется 

портом.

 Каждому внешнему устройству обычно соответствует несколько портов с по-

следовательными  адресами.  Обмен  процессора  с  организованными  подобным  образом  устройст-
вами осуществляется специальными командами ввода-вывода. 

На самом деле, с точки зрения схемной организации оба описанных способа имеют очень 

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

В одном и том же компьютере могут встречаться оба способа адресации устройств ввода-

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

Рассказ о работе с периферийными устройствами был бы неполным без описания того диа-

лога, который ведет с ними МП. Рассмотрим этот диалог на примере простейших устройств ввода-
вывода - например, печатающего устройства. 

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

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

стробом.

 

В  наиболее  простом  случае  обмен  информацией  между  процессором  и  принтером  может 

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

Конечно, реальный диалог современного компьютера с печатающим устройством сложнее. 

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

Обмен  информацией  между  МП  и  устройством  ввода  следует  рассмотреть  отдельно,  так 

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