Э. Таненбаум - Архитектура компьютера (1127755), страница 192
Текст из файла (страница 192)
ЕХ!Т =1 ! 1 ЮIН!ТЕ =4 ! 2 Зтоопт =! ! з .ВЕСТ .ТЕХТ ! 4 е!еп: Ск,бе-пи РОЗН СХ ! 7 РОЗИ Ьи !з РОЗН ЗТОООТ ! 9 РОЗН ЧЧЯ!ТЕ !10 ВЧЗ !11 АОО ЗР,В !12 ЗОВ СХ,АХ !13 РОЗН СХ ! 14 РОЗН ЕХ!Т ! 1В зуз !1В .ВЕСТ .ОАТА !17 Ьке !1В .АЗСП "Незо ЧГоййп" ! 19 бе: .ВЧТЕ 0 !го Ьи + О = ОООО: 49 Вв Вс Вс В! 2О 97 ж Няне ЧГег!б 28929 Процессор 8088 757 Окно, находящееся под верхним левым окном, определяет содержимое стека вызова подпрограмм, который в данном случае пуст. Ниже размещаются собственные команды трассера. Окно, расположенное справа от этих двух окон, предназначено для входных и выходных сообщений, а также сообщений об ошибках. В самом нижнем окне выводится содержимое части памяти. Подробно обо всех этих окнах мы поговорим позже, а на данный момент важно получить общее представление о том, какие сведения трассер позволяет увидеть пользователю: исходный текст программы, содержимое регистров машины, информацию о состоянии исполняемой программы.
При запуске каждой последующей команды содержимое окна интерпретатора обновляется, поэтому программист может разобраться в процессе настолько подробно, насколько он захочет. Процессор 8088 Любой процессор, в том числе и у 8088, обладает своим внутреннем состоянием, под которым понимается та или иная критически важная информация.
Для хранения и обработки этой информации в процессоре предусмотрен особый набор регистров. Наиболее важным из них является регистр РС (Ргойгаш Соппгег— счетчик команд). В нем указывается ячейка памяти (адрес), в которой хранится следующая в порядке выполнения команда. Другое обозначение этого регистра — 1Р (1пзггпсйоп Ро(пгег — указатель команд). Та часть основной памяти, в которой хранится следующая команда в порядке выполнения, называется кодовым сегментом.
Допустимая емкость основной памяти, которую поддерживает процессор 8088, составляет чуть более 1 Мбайт, однако размер кодового сегмента ограничен значением 64 Кбайт. Начало этого сегмента в рамках памяти емкостью 1 Мбайт определяется в регистре С5 (см. рис. В.1). Чтобы активировать новый кодовый сегмент, достаточно изменить значение регистра С5. Помимо кодового сегмента, существует сегмент данных, также занимающий 64 Кбайт и определяющий начало данных. На рис. В.1 начало данных определяется регистром 05, содержание которого можно при необходимости изменить и тем самым получить доступ к данным, находящимся за пределами текущего сегмента.
Потребность в регистрах С5 и 05 обусловлена тем, что разрядность регистров 8088 составляет 16 бит, а, значит, хранить в них 20-разрядные адреса, необходимые для обращения к памяти емкостью 1 Мбайт, невозможно. Вот почему появились кодовый сегмент и сегмент данных. В других регистрах содержатся данные или указатели на данные, размещенные в основной памяти. Ассемблерные программы обращаются к этим регистрам напрямую.
Помимо регистров, процессор содержит другое аппаратное обеспечение, необходимое для работы, но программисту эти компоненты доступны только посредством команд. Цикл процессора Работа процессора 8088 (равно как и всех других вычислительных машин) сводится к выполнению команд в определенной последовательности.
Процесс выполнения отдельной команды делится на несколько этапов: 758 Приложение В. Программирование на языке ассемблера 1. С помощью регистра РС команда выбирается из кодового сегмента памяти. 2. К текущему значению счетчика команд прибавляется единица. 3. Выбранная команда декодируется. 4. Все необходимые для выполнения команды данные выбираются из памяти и (или) регистров процессора. 5.
Команда выполняется. 6. Результаты выполнения команды сохраняются в памяти и (или) регистрах. 7. Начинается процесс выполнения следующей команды (переход к шагу 1). Выполнение команды похоже на выполнение очень маленькой программы. Более того, в некоторых машинах для выполнения команд действительно предусмотрена небольшая программа (так называемая микропрограмма). Микропрограммы в подробностях рассматриваются в главе 4. С точки зрения программиста, пишущего на ассемблере, в процессоре 8088 предусмотрено 14 регистров. Эти регистры выполняют функцию сверхоперативной памяти, с которой работают многочисленные команды; результаты, сохраняемые в них, меняются с очень большой частотой. Все эти регистры изображены на рис.
В.2. Совершенно очевидно сходство между этим рисунком и окном трассера, приведенным на рис. В.1. Сегментные регистры Регистры общего назначения св вх сх 0Х о 18 вт Указатели и индексы Коды условий сс вр вр 18 Флаги состояния О вр Указатель команд рс 01 18 Рис. В.2.
Регистры процессора 8088 Процессор 8088 759 Разрядность регистров процессора 8088 составляет 16 бит. Не существует ни одной пары полностью функционально идентичных регистров. В то же время некоторые из них близки по некоторым своим характеристикам, в связи с чем их подразделяют не несколько групп, что также отражено на рис.
В.2. Эти группы мы сейчас и обсудим. Регистры общего назначения Регистры АХ, 8Х, СХ и ОХ входят в группу регистров общего назначения. Первый регистр в этой группе, АХ, называется регистром-сумматором. Он применяется для накапливания результатов вычислений и часто выступает в роли приемника результатов выполнения различных команд. Хотя каждый регистр способен решать множество разнообразных задач, результаты выполнения некоторых команд (в частности, команд умножения) отправляются в регистр АХ по умолчанию. Второй регистр этой группы, 8Х, называется базовым регистром.
По назначению он во многом аналогичен регистру АХ, но есть и одно существенное отличие. В 8Х можно записать адрес памяти, а затем выполнить команду, операнд которой располагается по атому адресу памяти. Другими словами, 8Х может содержать указатель на область памяти, а АХ вЂ” не может.
Чтобы проиллюстрировать это утверждение, сравним две команды. Первая команда: МОХ ЯХ,ВХ Эта команда копирует содержимое 8Х в АХ. Вторая команда; МОХ АХ ДВХ) Эта команда копирует в АХ содержимое слова памяти, адрес которого содержится в 8Х. В первом примере исходный операнд содержится в регистре 8Х; во втором примере фигурирует указатель на исходный операнд. В обоих примерах, как видите, для команды МОУ заданы оба операнда: исходный (источник) и целевой (приемник). При этом целевой операнд указывается перед исходным.
Следующий регистр общего назначения, СХ, называется регистром-счетчиком. Помимо прочего, он применяется для хранения значений счетчиков при выполнении циклов. Во время обработки команды МООР значение в этом регистре автоматически уменьшается на единицу. Как правило, циклы завершаются в тот момент, когда значение в регистре СХ достигает нуля. Четвертым регистром в группе регистров общего назначения является регистр данных (ОХ).
Совместно с регистром АХ он задействуется при выполнении команд со словами двойной длины (32-разрядными). В этом случае в ОХ сохраняются старшие 16 бит, а в АХ вЂ” младшие 16 бит. Здесь нужно оговориться, что обычно 32-разрядные целые числа называются длинными. Термин двойные чаше применяется по отношению к 64-разрядным значениям с плавающей точкой, но иногда так называют и 32-разрядные целочисленные значения.
В нашем контексте путаницы не возникнет, так как числа с плавающей точкой мы обсуждать не собираемся. Каждый регистр общего назначения можно рассматривать либо как один 16-разрядный регистр, либо как пару 8-разрядных регистров. Таким образом, в процессоре 8088 предусмотрено восемь 8-разрядных регистров, применяемых 760 Приложение В. Программирование на языке ассемблера при выполнении команд с байтами и символами. Регистры, входящие во все остальные группы, нельзя разделить на две 8-разрядные части.
Одни команды задействуют целый регистр (например, АХ), другие — только одну его часть (например, АО или АН). Согласно общему правилу, те команды, которые выполняют арифметические операции, обычно используют целые 16-разрядные регистры, а те, что имеют дело с символами, чаше всего довольствуются 8-разрядными регистрами. Следует иметь в виду, что А~ и АН вЂ” не что иное, как имена двух половин регистра АХ.
При записи в АХ нового 16-разрядного числа в А~ и АН размешаются его нижняя и верхняя половины, соответственно. Взаимодействие регистров АХ, АН и А1. можно проиллюстрировать следующей командой; НОХ АХ,258 Она загружает в регистр АХ десятичное значение 258. После завершения этой команды в байтовом регистре АН оказывается значение 1, а в байтовом регистре А~ — значение 2.
Пусть следом за этой командой следует другая; А888 АН,АГ В этом случае к значению байтового регистра АН прибавляется значение А~ (то есть 2), и результирующее значение становится равным 3. В результате этой операции в регистр АХ записывается новое значение — 770, эквивалентное значению 00000011 00000010 в двоичной системе счисления или значению ОхОЗ Ох02 в шестнадцатеричной системе счисления. Как правило, два регистра по 8 байт взаимозаменяемы. Исключение составляет лишь команда НО~В, при выполнении которой один из операндов всегда сохраняется в регистре А1., который вместе с АН является в этом случае приемником. При выполнении команды 01УВ в паре регистров АН и А~ сохраняется делимое.
Нижний байт регистра-счетчика С~ применяется для хранения числа циклов при выполнении команд обычного и циклического сдвига. Во втором примере из раздела «Примеры» (это пример относится к программе белйейж) представлены некоторые свойства регистров общего назначения. Регистры-указатели Во второй группе регистров содержатся регистры-указатели и индексные регистры. Наиболее важным регистром из этой группы считается указатель стека (5Р).
Стеки играют важную роль в большинстве языков программирования. Стек — это сегмент памяти, в котором хранятся те или иные данные, связанные с контекстом исполняемой программы. Как правило, при вызове процедуры часть стека резервируется для хранения ее локальных переменных, адреса, по которому нужно будет возвратиться по окончании процедуры, и ряда других данных управления.