К. Хамахер, З. Вранешич, С. Заки - Организация ЭВМ - 5-е издание (2003) (1114649), страница 22
Текст из файла (страница 22)
Базовые операции ввода-вывода 91 по-разному, но основная идея состоит в том, что процессор выполняет короткий цикл ожидания и, обнаружив факт установления флага, производит пересылку данных, послед чего флаг снова сбрасывается. То же самое происходит при выводе данных на дисплей: ЖВ1ТЕ7КА1Т ВгапсЬ Го %ИТЕЖА1Т 11 ЗОНТ - 0 Опгрпг (гош В1 го РАТАО(1Т Операция обычно реализуется с помощью двух машинных команд. Цикл ожидания выполняется до тех пор, пока не будет установлен флаг 901)Т, означающий, что дисплей готов к приему символа. Закончив пересылку, оператор ОцгрцГ сбрасывает флаг ЗОПТ.
Предполагается, что в исходном состоянии флаг 51Х сброшен, а флаг ЗО()Т установлен. Такая инициализация обычно выполняется схемами управления устройством в тот момент, когда устройство переходит под управление компьютера, до начала реализации программы. До сих пор мы предполагали, что адреса, используемые процессором для доступа к командам и операндам, всегда указывают места в памяти. Но очень часто в компьютерах применяется такая система адресации, когда некоторые адреса указывают на буферные регистры периферийных устройств, такие как РАТАСЫ н РАТАО(1Т.
Называется эта система адресации вводом-выводом с отображением в памяти (шешогу-шарред шрпГ-оцгрпГ). Таким образом, для получения доступа к регистрам не нужны какие-то особые команды. Данные пересылаются между регистрами и процессором с помощью уже рассмотренных команд Моче, 1оад и Ягоге. Например, содержимое символьного буфера клавиатуры РАТА1Х можно переслать в регистр процессора В1 с помощью такой команды: МочеВуте ПАТА1Х,В1 Аналогичным способом содержимое регистра В.1 можно переслать в регистр РАТАОПТ: МочеВуте В1,ПАТАОПТ Флаги состояния 91Н н ЯОПТ при обращении к регистрам ПАТА1Х и ПАТАОПТ сбрасываются автоматически.
Код операции МочеВуте означает, что операнд имеет размер 1 байт. Он отличается от кода операции Моче, используемого для перемещения операндов длиной в одно слово. Мы установили, что буферы данных, показанные на рис. 2.19, могут адресоваться так, как если бы они располагались в основной памяти компьютера. Точно так же можно было бы поступить и с флагами ЯХ и БОРТ, присвоив им разные адреса.
Но чаще эти флаги включают в состав регистров соппояния устройппва (такой регистр имеется у каждого устройства ввода-вывода). Предположим, что бит Ьз в регистре 1НЗТАТ(15 соответствует флагу ЯХ, а в регистре О11ТЯТАТПЗ вЂ” флагу ЗО(1Т. Следовательно, описанную выше операцию чтения можно выполнить с помощью приведенных ниже команд. 92 Глава 2. Машинные команды и программы КЕАРЖА1Т ТезтВК №3,1ХЯТАТ1)Б ВгапсЬ-О КЕАРЪЪ'А1Т МочеВуге РАТА1Х,К1 А операция записи может быть реализована так: ЖК1ТЕ учА1Т ТезгВК №З,ОПТЯТАТ1)5 ВгапсЬ=О ЖК1ТЕЖА1Т МочеВуте К1,РАТАОПТ Инициализация регистра КО, то есть занесение в него адреса, по которому строка символов будет храниться в памяти Ожидание ввода символа в буфер клавиатуры РАТАПЧ Пересылка символа иэ регистра РАТА1Х в память (эта операция сбрасывает флаг $1Х) Ожидание готовности дисплея Пересылка только что прочитанного символа в буферный регистр дисплея (эта операция сбрасывает флаг 5013Т) Проверка того, является ли только что прочитанный символ символом СК, а также увеличение значения указателя, с тем чтобы он указывал на следующий символ Если считываемый символ не является символом СК, возврат назад и считывание следующего символа Моче №ЕОС,КО ТеэГВН ВгассЬ=О МочеВуте КЕАР №3,1г1БТАТУБ КЕАР РАТА1г),(КО) ЕСНО ТеМВН ВгассЬ=О МочеВуте №З,ОПТБТАТУБ ЕСНО (КО),РАТАОУТ Сотраге №СК,(КО)+ ВгацсЬ№0 КЕАР Рис.
2.20. Программа, считывающая строку символов и выводящая вв на экран Команда ТезтВК проверяет состояние одного бита (позиция которого определяется первым операндом) во втором операнде. Если значение этого бита равно О, значит, условие команды ВгапсЬ истинно и она выполняет переход на начало цикла ожидания. Когда устройство будет готово (значение проверяемого бита окажется равным 1) данные будут прочитаны из входного буфера или записаны в таковой.
В программе, представленной на рис. 2.20, зти две операции предназначены для чтения введенной с клавиатуры строки символов и вывода ее на экран. Символы поочередно считываются по мере ввода и сохраняются в области данных в памяти, а затем выводятся на экран. Программа завершает свою работу после того, как ею будет прочитан, сохранен и выведен на экран символ возврата каретки СК. Первый байт области памяти, где хранится считываемая с клавиатуры строка, имеет адрес 1.ОС. Этот адрес хранится в регистре КО, куда он записывается первой командой программы.
По мере чтения символов значение регистра КО увеличивается на 1, для чего в команде Сошраге используется автоинкрементный способ адресации. 2.8. Стеки и очереди 93 Программно управляемый ввод-вывод требует постоянного участия процессора. Практически все время выполнения рассматриваемой программы тратится на два цикла ожидания — процессор просто ждет нажатия клавиши или готовности дисплея.
Это, конечно же, не очень хорошо — процессор не должен простаивать. Поэтому для выполнения ввода-вывода применяются другие технологии, основанные на использовании прерываний. 2.8. Стеки и очереди Компьютерным программам часто приходится выполнять определенные 1годзадачи с использованием знакомой вам структуры, называемой подпрограммой. Для обмена информацией между главной программой и подпрограммой предназначена специальная структура данных, называемая стеком. В этом разделе рассказывается о стеках и тесно связанной с ними структуре, которая называется очередью.
Обрабатываемые программой данные могут быть организованы множеством способов. Вы уже знакомы с данными, структурированными в виде списков. Теперь мы рассмотрим еще одну важную структуру данных, называемую стеком. Стек — это список элементов данных, обычно слов или байтов, доступ к которым ограничен следующим правилом: элементы этого списка могут добавляться только в его конец и удаляться только из конца. Конец списка называется вершиной стека, а его начало — дном. Такую структуру иногда называют магазином. Представьте себе стопку подносов в столовой.
Клиенты берут подносы сверху, и работники столовой, добавляя чистые подносы, тоже кладут их на верх стопки. Этот механизм хранения хорошо описывается емкой фразой «последним вошел — первым вышел» (1лзг 1п Р1гзт Опц Е1ГО), означаюшей, что элемент данных, помещенный в стек последним, удаляется из него первым. Операцию помещения нового элемента в стек часто называют его проталкиванием (рпзЪ), а операцию извлечения последнего элемента из стека называют его выглалкиванием (рор). Хранящиеся в памяти компьютера данные могут быть организованы в виде стека, так чтобы последовательные элементы располагались друг за другом.
Предположим, что первый элемент хранится по адресу ВОТТОМ, а когда в стек помещаются новые элементы, они располагаются в порядке уменьшения последовательных адресов. Таким образом, стек растет в направлении уменьшения адресов, что является весьма распространенной практикой. На рис. 2.21 показано, как располагается в памяти компьютера стек, элементы которого занимают по одному слову. На дне он содержит числовое значение 43, а на вершине — 28. Для отслеживания адреса вершины стека используется регистр процессора, называемый указоглелем стека (Вгаск Ро1пгег, ЯР). Это может быть один из регистров общего назначения или же регистр, специально предназначенный для этой цели. Если предположить, что память адресуется побайтово и слово имеет длину 32 разряда, операцию проталкивания в стек можно реализовать так: ЯпЪ1гасг Ф4,ЯР Моче ЫЕЖ1ТЕМ,(ЯР) 94 Глава 2.
Машинные команды и программы где команда БиЬггаст вычитает исходный операнд 4 из результирующего операнда, содержащегося в регистре БР, и помещает результат в регистр БР, Эти две команды помещают слово, хранящееся по адресу ХЕ%1ТЕМ, на вершину стека, предварительно уменьшая указатель стека на 4.
Операция выталкивания из стека может быль реализована так: Моче (БР),1ТЕМ Аой №4,5Р Указатель стека Текулшй верхний элемент Стек Нижний элемент ВОТТОМ Рис. 2.2! . Стек слов в памяти Эти две команды перемещают значение, хранившееся на вершине стека, в другое место памяти, по адресу 1ТЕМ, а затем уменьшают указатель стека на 4, чтобы он указывал на тот элемент, который теперь располагается на вершине стека. Результат выполнения каждой из этих операций для стека, показанного на рис.
2.21, приведен на рис. 2.22. Если процессор поддерживает режимы автоинкрементной и автодекрементной адресации, для помещения нового элемента в стек достаточно команды Моче ХЕЪЧ1ТЕМ,-(БР) А выталкивание элемента из стека можно выполнить посредством команды Моче (БР)+,1ТЕМ Когда стек используется программой, для него обычно выделяется фиксированное количество памяти. В этом случае нам нужно проследить за тем, чтобы программа не пыталась помещать новые элементы в стек, достигший своего максимального размера.
Кроме того, она не должна пытаться вытолкнуть элемент из пустого стека, что могло бы произойти в случае логической ошибки. 2.8. Стеки и очереди 95 Стек ХЕ%'1ТЕМ 1ТЕМ Рис. 2.22. Результат выполнения операций со стеком на примере стека, показанного на рис. 2.21: после помещения в стек элемента ЙЕФ)ТЕМ (а); после выталкивания из стека верхнего элемента и помещения его по адресу )ТЕМ (6) Предположим, что стек заполняется начиная с адреса 2000 (ВОТТОМ) до 1500 и далее. Первоначально в регистр, играющий роль указателя стека, загружается значение 2004. Напомним, что перед помещением в стек нового элемента данных из значения БР каждый раз вычитается 4. Поэтому начальное значение 2004 означает, что первый элемент стека будет иметь адрес 2000. Для предотвращения попыток помещения элемента в полный стек или удаления элемента из пустого стека нужно несколько усложнить реализацию операций проталкивания н выталкивания элемента.