s
Sesiya.ru

3. Архитектура ЭВМ. Центральный процессор и память

Информация о работе

Тема
3. Архитектура ЭВМ. Центральный процессор и память
Тип Лекции
Предмет Информатика
Количество страниц 13
Язык работы Русский язык
Дата загрузки 2014-11-23 10:54:46
Размер файла 36.13 кб
Количество скачиваний 12
Скидка 15%

Поможем подготовить работу любой сложности

Заполнение заявки не обязывает Вас к заказу


Скачать файл с работой

Помогла работа? Поделись ссылкой

3. Архитектура ЭВМ. Центральный процессор и память.

3.1. Что означает термин "архитектура" применительно к ЭВМ?

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

3.2. Архитектура фон Неймана.
В середине сороковых годов выдающийся математик Джон фон Нейман обобщил опыт первых конструкций ЭВМ и сформулировал принципы их построения.
1) ЭВМ включает в себя основные блоки: арифметико-логическое устройство (АЛУ), устройство управления (УУ), запоминающее устройство (ЗУ), устройства ввода вывода;
2) Программа и данные хранятся в одной памяти, ячейки памяти последовательно пронумерованы: 0, 1, 2 и т.д., т.е. имеют адреса;
3) АЛУ и УУ объединяют в центральный процессор (ЦП). ЦП считывает из ЗУ команды и выполняет их. В ЦП имеется счетчик команд, в котором хранится адрес ячейки памяти с кодом очередной команды.
Практически все ЭВМ имеют фон-неймановскую архитектуру.

3.3. История микропроцессоров фирмы Intel.
Первый микропроцессор 4004 был изготовлен фирмой Intel в 1971 году. Он был четырехразрядным. Спустя три года были выпущены 8-разрядные процессоры 8008 и 8080. Последний представлял очень удачную для своего времени модель.
В 1978 году был выпущен 16-разрядный процессор 8086, ставший базовым для последующего развития процессоров фирмы. Программы, написанные для этого процессора, без изменений могут быть выполнены на старших моделях, то есть имеет место совместимость процессоров снизу вверх. Процессор 8086 мог адресоваться к 1 мегабайту памяти
В 1982 году появились процессоры 80186 и 80286. Второй процессор мог работать в так называемом защищённом режиме и адресоваться к 16 мегабайтам памяти. 286-ой процессор получил широкое распространение в персональных компьютерах.
По-настоящему переломным оказался 1985 год. Intel выпустила процессор 80386. Процессор 32-разрядный, т.е. двойное слово может быть обработано за одно обращение. Архитектура процессора позволила строить на его базе многозадачные операционные системы.
Параллельно с центральными процессорами фирма Intel выпускала математические сопроцессоры, т.е. вспомогательные процессоры для выполнения операций над числами с плавающей точкой: 8087, 80287, 80387. В 1989 году фирма представила процессор 80486, где процессор и сопроцессор были объединены на одном кристалле. В 1993 году появился процессор впервые названный не номером 80586, а собственным именем — Pentium, а позже появилась модели Pentium II, Pentium III, Pentium 4. Следует заметить, что с точки зрения программиста эти процессоры почти одинаковы, хотя, конечно, сильно различаются по быстродействию. Существенно, что программы, написанные для 8086, без изменений будут выполняться на Pentium. Благодаря такой совместимости пользователи могут использовать созданное ранее программное обеспечение. Но поддержка совместимости обходится дорого — это ведет к снижению эффективности новых моделей процессоров.
Т.к. в семействе процессоров 80x86 процессор 8086 является базовым, то необходимо начинать изучение архитектуры именно с него.

3.4. Общая шина
ЭВМ включает в себя центральный процессор, память, устройства ввода/вывода. Обычно в популярных книжках приводят такую картинку: к ЦП непосредственно подсоединены различные устройства: дисплей, клавиатура, дисковод, принтер и т.д.
Получается, что непосредственно к процессору подсоединяются разнообразные устройства, причем количество этих устройств может увеличиваться (графопостроитель, сканер и т.д.). Но такую схему невозможно реализовать, так как у микросхемы процессора недостаточно для этого выводов.
Решение следующее: все эти устройства, включая процессор, подсоединяются к набору проводников — общей шине (рис. 3.1.).

общая шина

процессор память клавиатура ...

рис. 3.1.

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

3.5. Память (memory, storage, core)
Память ЭВМ подразделяется на основную и внешнюю. К основной памяти процессор обращается непосредственно. Содержимое внешней памяти нужно сначала передать в основную память, чтобы процессор мог с этим содержимым работать. Пример внешней памяти: накопитель на магнитных дисках. Внешняя память используется для длительного хранения информации.
Основная память в свою очередь делится на два класса: ОЗУ (RAM) и ПЗУ (ROM).
ОЗУ — оперативное запоминающее устройство. Процессор может осуществлять с ОЗУ только две операции: чтение и запись. Это означает, что нельзя, например, увеличить содержимое какой либо ячейки памяти на единицу непосредственно. Нет, процессор должен прочитать содержимое этой ячейки памяти в свой внутренний регистр, увеличить содержимое регистра на единицу, а результат записать обратно в память.
Англоязычную аббревиатуру RAM — Random Access Memory — иногда неверно переводят как "память со случайным доступом". Это сбивает с толку начинающих — что означает "случайность доступа"? Правильный перевод: "память с произвольным доступом", т.е. к любой ячейке памяти можно обратиться независимо от других ячеек (в отличие, например от накопителя на магнитной ленте — там нужно прочитать содержимое ленты до нужной позиции; и чем дальше от начала ленты находится нужная запись, тем дольше длится операция доступа). Иногда для ОЗУ используют другое сокращение: ЗУПВ — запоминающее устройство с произвольной выборкой.
ПЗУ — постоянное запоминающее устройство — память "только для чтения" (ROM — Read-Only Memory). Информация записывается в нее только один раз при изготовлении, но может прочитываться многократно. В эту память завод-изготовитель записывает программы для работы с периферийными устройствами компьютера (эти программы составляют так называемую БСВВ —базовую систему ввода-вывода (BIOS — Basic Input/Output System). Имеется также программируемое ПЗУ — сокращенно ППЗУ. Записанную в нем информацию можно стирать и заново записывать с помощью специального устройства: программатора ПЗУ.

3.6. Адресное пространство
Каждая ячейка памяти (слово или байт) имеет так называемый физический, или машинный адрес — номер, однозначно эту ячейку определяющий. Наименьшая адресуемая единица памяти — байт.
Введем единицы измерения для объемов памяти:
1 К = 1 Килобайт = 210 байт = 1024 байт;
1 М = 1 Мегабайт = 220 байт = 1024 К = 1048576 байт;
1 Г = 1 Гигабайт = 230 байт = 1024 М;
1 Т = 1 Терабайт = 240 байт = 1024 Г.
Использование приставки "Кило" не совсем корректно, ведь в системе физических единиц измерения "кило" означает множитель 1000. Ее выбрали из-за близости чисел 1024 и 1000.
Пусть n — число линий в шине адреса. Адресное пространство — упорядоченное множество машинных адресов от 0 до 2n –1. Подчеркнем различие терминов "объем адресного пространства" и "объем памяти". Реальная физическая память может занимать часть адресного пространства. Иногда адресное пространство сравнивают с книжным шкафом, частично заполненным книгами и полками.
В машинах на базе процессора 8086 n = 20 (т.е. имеется 20 адресных линий: A0 – A19). Тогда объем адресного пространства: 220 = 1 Мбайт.
Задача. Какой объем адресного пространства у процессора 80286 и 80386SX с 24 адресными линиями; у процессора 80386DX с 32 адресными линиями?
Рассмотрим структуру адресного пространства для процессоров 8086 более подробно (рис. 3.2.).

адрес содержимое
00000 A1 байт A1
00001 E7 слово C3E7
00002 C3 (по нечетному адресу)
00003 12 байт 12
00004 24 слово 3D24
00005 3D (по четному адресу)
… …
FFFFE 7A
FFFFF 44
рис. 3.2.

Для записи адресов применяется только 16-ричная система счисления. Пять шестнадцатеричных цифр соответствует 20 двоичным цифрам, т.е. двадцати адресным линиям A0 – A19.
Будем использовать форму записи: (адрес) = содержимое. Поэтому (00000)b = A1, (00001)b = E7, (00000)w = E7A1. Индекс b означает, что в скобках адрес байта, а w — адрес слова. В дальнейшем эти индексы мы будем опускать, так как размер ячейки очевиден из количества использованных для записи содержимого 16-ричных цифр. Отметим еще один характерный момент: в слове с нулевым адресом хранится именно E7A1, а не A1E7! Морс, один из создателей семейства 80x86, заметил, что память с таким порядком размещения информации в словах можно назвать памятью с "перевернутыми словами" [Морс, Алберт]. Часто такую архитектуру называют «остроконечной» (little-endian). Термин позаимствован из книги Дж. Свифта «Путешествия Гулливера» (В Лилипутии враждовали секты «остроконечников» и «тупоконечников», не сумевших найти общего мнения по вопросу: с какого конца следует разбивать яйцо).
Запомним правило:
Менее значимые величины хранятся по младшим адресам,
Более значимые величины хранятся по старшим адресам.
Можно дать более лаконичную формулировку:
Более значимое хранится по большему адресу
В нашем примере E7 соответствует более "весомым" разрядам (ясно, что E700 > 00A1).
Правило, заключенное в рамочку, неоднократно пригодиться нам в дальнейшем в самых различных ситуациях.
Вызывает опасение то, что слово и байт могут иметь одинаковый адрес. Не вызовет ли это в дальнейшем путаницы? Такая опасность действительно есть и, как мы увидим в дальнейшем, в командах будут присутствовать явные или неявные указания на размер ячейки памяти, с которой работает команда.
Слова можно размещать и по четным и по нечетным адресам в памяти (во многих других машинах это запрещено, например, в PDP-11 обращение к слову по нечетному адресу вызывает прерывание работы программы). Вообще говоря, возможность размещать слова по нечетному адресу приводит к более плотной упаковке информации в памяти. Но если слово расположено по нечетному адресу, то для его считывания требуется вдвое больше времени (сначала считывается один байт слова, потом другой). Если обрабатывается большой массив слов, то временная задержка может быть существенной. Речь идет, конечно, о процессоре 8086 с 16-разрядной шиной данных. Для 8088 с 8-разрядной шиной данных считывание в любом случае происходит побайтно.
В интегрированной среде Borland C++ имеется возможность установить выравнивание данных по четным адресам: Options → Project → 16-bit Compiler → Processor → Data alignment. Здесь имеется выбор между выравниванием по байтам и выравниванием по словам.
Для 32-разрядной среды выбор еще больше. (Найдите соответствующие опции самостоятельно.)
Вопросам выравнивания данных в памяти мы еще уделим внимание.

3.7. Сегменты.
Мы еще не изучали архитектуру центрального процессора. Поэтому, забегая вперед, отметим, что процессор имеет свою собственную небольшую внутреннюю память. Обращение к этой памяти намного быстрее, чем к ОЗУ. Внутренняя память центрального процессора состоит из 16-разрядных ячеек, называемых регистрами. В то же время физические адреса ячеек памяти 20-разрядные, заведомо в 16 разрядах не умещаются. Возникает вопрос: как хранить в регистрах процессора адреса ячеек памяти?
Даже в пределах семейства 80x86 реализовано несколько разных решений этой задачи. Мы изучим подход, который принят в процессорах 8086/8088. В старших моделях процессоров (начиная с 80286) этот режим работы с памятью называется реальным (он сохранен для совместимости).
Сначала подсчитаем, какой объем памяти можно адресовать с помощью 16-разрядного регистра:
216 = 26 210 = 26 К = 64 К.
Дадим определение: сегмент — блок адресного пространства размером 64 Кбайта, начальный адрес сегмента кратен 16 = 10h (т.е. младшие 4 бита адреса нулевые). Если сегмент пересекает верхнюю границу памяти, то он усекается.
Адрес сегмента хранится в 16-разрядной ячейке без младших четырех битов. После умножения на 10h (это сводится к приписыванию справа одного 16-ричного нуля, или четырех двоичных нулей) получается физический адрес сегмента.
Теперь объясним, как получается физический адрес ячейки памяти (слова или байта). Нужно взять адрес какого-либо сегмента, в котором находится эта ячейка. "Расстояние" от адреса сегмента до ячейки называется смещением (offset). Смещение внутри сегмента также хранится в 16-разрядной ячейке. Оно складывается с физическим адресом сегмента и получается физический адрес ячейки. Эти вычисления автоматически проделывает центральный процессор. Итак,
(физический адрес) = (адрес сегмента)*10h + (смещение),
т.е. address = segment*10h + offset. Адрес записывается так: segment:offset (или короче: seg:off).
Пример. seg = 123A, off = 341B. Вычислим физический адрес:
123Ah * 10h + 341Bh = 123A0h + 341Bh = 157BBh.
Разумеется, такое представление физического адреса неединственно. Например, 157BB = 123A:341B = 1000:57BB = 157B:000B
До сих пор мы рассматривали группы байтов памяти как слова, двойные слова, сегменты. Здесь уместно ввести еще одну единицу: параграф (paragraph) — блок 16 байт, начинающийся с адреса, кратного 16 (10h). Таким образом, начальный адрес сегмента совпадает с адресом некоторого параграфа.
Задача. Сколькими способами можно представить физический (машинный) адрес в виде сегмент:смещение.
Неоднозначное представление адреса в формате сегмент:смещение неудобно. Например, требуются вычисления, чтобы решить, какой из двух адресов старше. Поэтому прибегают к специальной форме представления. Нормализованным адресом seg:off называется адрес, у которого . Например, адрес 157B:000B — нормализованный. Такие адреса легко сравнивать. Реже используется представление (обычно в документации), где seg = k*1000h, 0  k  F. Память как бы разбивается последовательно на блоки по 64 килобайта, и блоки нумеруются по первой цифре сегментной части адреса: 0-й, 1-й, ..., F-й. Например, ячейка памяти с адресом 157BB = 1000:57BB принадлежит 1-ому блоку.
Задача. Нормализовать адрес 12F1:734.

3.8. Распределение памяти в IBM PC.
Итак, процессор 8086/8088 имеет 20 адресных линий (A0 – A19), поэтому адресное пространство составляет 1 Мбайт. В первых моделях IBM PC адресное пространство было задействовано не полностью. Однако уже тогда было принято решение о распределении пространства под ОЗУ и ПЗУ.
Обычная память (Conventional Memory). Первые 10 блоков (0-й, 1-й, ... 9-й) по 64 килобайта (т.е. 640 К) отводятся под ОЗУ. Диапазон адресов 00000–9FFFF. Операционная система распределяет эту память некоторым стандартным образом. Позднее мы познакомимся с этим распределением подробнее. Пока заметим только, что в эту память загружается операционная система, здесь же располагаются прикладные программы и обрабатываемые ими данные.
Верхняя память (Upper Memory Area — UMA). Для нее осталось
1 М – 640 К = 1024 К – 640 К = 384 К.
Сюда входят блоки A, B, ... F. Диапазон адресов A0000 – FFFFF.
Блоки A и B отведены под видеопамять дисплея. Если дисплей (цветной) работает в текстовом режиме, то он использует только 16 Кбайт, начиная с адреса B8000.
Дополнительная (расширенная) память (Extended Memory). Это память, которая превышает 1 М. В современных компьютерах она довольно значительна: 32 М, 64 М и т.д.

3.9. Отладчик Turbo Debugger. Отображение содержимого памяти.
Осуществим вызов Turbo Debugger:
D:>td
На экране появится окно (так называемое "окно CPU") . В верхней строке экрана главное меню:
File View Run Breakpoints Data Options Window Help
Файл Вид Запуск Остановы Данные Опции Окно Справка
Доступ к его пунктам осуществляется нажатием F10. Каждому пункту соответствует выпадающее меню.
В нижней строке экрана подсказки о назначении некоторых "горячих клавиш":
F1-Help F2-Bkpt F3-Mod F4-Here F5-Zoom F6-Next F7-Trace F8-Step F9-Run F10-Menu

С окном CPU нам пока рано знакомиться. Откроем окно, которое предназначено только для просмотра содержимого памяти. Для этого выберем в главном меню View → Dump. Это можно сделать быстро с помощью клавиатуры: сначала нажать Alt+V, затем D (мы нажимаем букву, выделенную в меню красным цветом). Далее нажмите F5, чтобы распахнуть окно во весь экран.
В каждом окне имеется локальное меню (т.е. меню, специфичное именно для этого окна). Оно вызывается нажатием Alt+F10 либо щелчком правой кнопки мыши. Для дампа локальное меню имеет вид (рис. 3.3.).

Goto...
Search...
Next
Change...
Follow

Previous
Display as

Block


Рис. 3.3.
Многоточие рядом с пунктом меню означает, что при выборе этого пункта меню появится диалоговое окно. Значок показывает, что выбор пункта меню повлечет за собой появление нового меню.

Пример. Сведения о BIOS персонального компьютера можно прочитать в памяти, начиная с физического адреса FE000 (начальный адрес ПЗУ). Представим адрес в формате сегмент:смещение fe00:0. Ввод этого адреса надо предварить нулем. Итак, выбираем в локальном меню пункт Goto. При выделении этого пункта меню в нижней части экрана читаем комментарий: Set new address for data display (установить новый адрес для отображения данных). После входа в это пункт появляется диалоговое окно с заголовком Enter address to position to (введите адрес). Вводим 0fe00:0 и нажимаем Enter. Отображается содержимое ПЗУ (например, такое).
FE00:0000 50 68 6F 65 6E 69 … Phoeni…
Окно как бы разделено на три колонки. В левой колонке — адреса в формате сегмент:смещение. В центре — содержимое байтов памяти в 16-ричной форме. В правой колонке — символы, коды которых записаны в байтах.
Пример. Дата создания ROM BIOS в формате месяц/день/год расположена по адресу FFFF5. Имеется в виду не дата изготовления микросхемы, а дата выпуска программного обеспечения, записанного в ROM BIOS.
На этот раз осуществим быстрый доступ к пункту меню, нажимая клавиатурную комбинацию Ctrl+G. (Буква G выделена красным цветом. При нажатии на клавишу Ctrl появляется подсказка в нижней части экрана.) Вводим адрес 0ffff:5.
На экране:
FFFF:0005 30 32 2F 31 30 2F 30 34 … 02/10/04 …
Отображена дата 10 февраля 2004 года. Заметим, что 30 и 32 — это коды цифр ‘0’ и ‘2’.
Пример. Размер доступной для работы оперативной памяти (conventional memory) в килобайтах хранится в слове с адресом 413 (400–4FF — область данных BIOS)
0040:0013 80 02
Слово читается в обратном порядке 0280h. Убедимся в этом, по-другому отобразив содержимое памяти. Выберем в локальном меню пункт Display as (отобразить как). Появляется новое меню. Выбираем в нем пункт Word.
0040:0013 0280
Вычислим десятичное значение 280h. В главном меню Data → Evaluate/Modify. Можно было ввести Ctrl+F4 (это написано в меню). В окне Expression вводим 280 и нажимаем Enter. В окне Result появляется word 640 (280h). Итак, десятичное значение равно 640, что и следовало ожидать.

3.10. Сегментные регистры.
Эти 16-разрядные регистры входят в состав центрального процессора. Уместно рассказать о них здесь.
Сегментный регистр содержит адрес сегмента без младших четырех бит (они всегда равны нулю, поэтому их можно без ущерба отбросить).
В 8086 имеется четыре сегментных регистра. Перечислим их имена:
CS (Code Segment) — программный (кодовый) сегмент,
DS (Data Segment) — сегмент данных,
SS (Stack Segment) — сегмент стека,
ES (Extra Segment) — дополнительный сегмент данных.
Пока заметим, что CS указывает, как правило, на сегмент памяти, содержащий машинные инструкции, DS и ES — на сегменты, содержащие данные, SS — на сегмент, где расположен стек (о стеке отдельный разговор впереди). Оговорка "как правило" существенна. Например, в сегменте, адрес которого в CS, могут содержаться и данные.
Рассмотрим различные варианты расположения сегментов (в зависимости от содержимого сегментных регистров). Они могут не пересекаться, пересекаться, и даже совпадать (как мы узнаем, в программах типа .com все четыре сегментных регистра содержат одинаковые значения). Если сегмент выходит за границы памяти, он усекается.
Пример. Выборка команды. Адрес очередной команды, которую предстоит выполнить, хранится в регистрах CS и IP (IP — Instruction Pointer — указатель команд). В CS хранится сегментная часть адреса, а в IP — смещение (рис. 3.4.).

CS XXXX XXXX XXXX XXXX 0000
+
IP 0000 XXXX XXXX XXXX XXXX

физический адрес XXXX XXXX XXXX XXXX XXXX
Рис. 3.4.

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

3.11. Центральный процессор (ЦП)
Центральный процессор (Central Processor Unit — CPU) — разделен на два относительно независимых блока: шинный интерфейс, или блок сопряжения с магистралью — (Block Interface Unit — BIU) и операционное устройство, или исполнительный блок (Executive Unit — EU). Эти блоки могут работать параллельно.
Когда операционное устройство занято выполнением очередной команды, шинный интерфейс подкачивает в очередь коды следующих команд. Операционное устройство выбирает код команды не из памяти, а из очереди. Это существенно увеличивает быстродействие ЦП.

3.12. Регистры ЦП.
Для программиста важны программно-доступные элементы ЦП. Например, очередь команд программисту недоступна, он лишен возможности непосредственно управлять ее содержимым. Кроме того, в ЦП имеются регистры? недоступные программисту. Поэтому для нас они не представляют интереса.
Как уже отмечалось, во ЦП имеется своя небольшая быстрая память. Ячейки этой памяти носят название регистров. Все они программно доступны. При написании программ следует по возможности хранить промежуточные результаты именно в регистрах, а не в ячейках основной памяти. Тогда быстродействие программы увеличится.
В ЦП 8086 14 регистров. Они делятся на группы.
1) Регистры общего назначения — РОН (General Purpose Registers). Они в свою очередь делятся на две подгруппы.
1.1) HL-регистры. Это четыре 16-разрядных регистра с именами AX, BX, CX, DX. Можно также обращаться по отдельности к старшим и младшим байтам этих регистров. Например, старший байт AX — это регистр AH (High — старший), младший байт — AL (Low — младший). (Именно поэтому эта подгруппа регистров носит название HL — high-low)
15 8 7 0

AX AH AL
BX BH BL
CX CH CL
DX DH DL
Рис. 3.5.

Когда-то в микропроцессоре 8080 имелись 8-разрядные регистры A, B, C, D. В 8086 регистры стали 16-разрядными (eXtended — расширенными). Поэтому их названия приобрели суффикс X. Названия регистров можно расшифровать так:
AX — accumulator — аккумулятор,
BX — base register — регистр базы,
CX — counter register — счетчик,
DX — data registr — регистр данных.
Эти регистры могут единообразно участвовать в различных операциях. Но в ряде команд использование регистров специализировано. Например, для организации циклов используется регистр CX, что и оправдывает его название — "счетчик".
1.2) PI-регистры. Это четыре 16-разрядных регистра с именами SI, DI, SP, BP. Они предназначены для хранения адресов (точнее, смещений), что и оправдывает название подгруппы (PI — Pointer-Index — указательно-индексные). К их старшим и младшим байтам отдельно обращаться нельзя.

15 0
SI
DI
SP
BP
Рис. 3.6.
Названия регистров расшифровываются так:
SI — Source Index — индекс источника,
DI — Destinftion Index — индекс приемника.
SP — Stack Pointer — указатель стека,
BP — Basa Pointer — указатель базы стека
(регистры SP и BP предназначены для работы со стеком).
Как мы увидим, в команде можно будет непосредственно указывать адрес операнда. Но если хранить адрес в регистре, а в команде указывать имя регистра, то длина кода команды сокращается. Кроме того, над содержимым регистров можно выполнять арифметические операции. Допустим, мы записали в SI адрес массива двойных слов. Тогда, чтобы перейти к обработке очередного элемента массива, достаточно увеличить содержимое SI на 4.
2) Сегментные регистры. Они нам уже знакомы.

15 0
CS
DS
SS
ES
Рис. 3.7.
3) Указатель команд — Instruction Pointer (иногда его называют программным счетчиком — Program Counter— PC). Содержит смещение (offset) инструкции, подлежащей выполнению.
15 0
IP
Рис. 3.8.
4) Регистр флагов (Flags).

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF
Рис. 3.9.

Флагами здесь называются отдельные биты. Каждый из них характеризует некоторое состояние или режим. Если бит содержит единицу ("установлен") — значит, состояние или режим, за которые отвечает этот бит имеют место (ДА). Если бит содержит нуль ("сброшен") — НЕТ.
Флаги делятся на три группы: флаги состояния — CF, PF, AF, ZF, SF, OF — отображают некоторые характеристики результата выполнения команды (они устанавливаются или сбрасываются центральным процессором); системные флаги — TF, IF и флаг управления DF — задают режимы работы ЦП и явно устанавливаются специальными командами.
Опишем назначение флагов состояния.
CF — carry flag — флаг переноса. При сложении сюда попадает бит переноса из знакового разряда. CF изменяется и по результатам некоторых других команд.
PF — parity flag — флаг четности. Установлен, если младший байт результата содержит четное число единиц. Используется для тестирования памяти.
AF — auxiliary flag — флаг вспомогательного переноса. Равен значению бита переноса из младшей тетрады в старшую в младшем байте (т.е. перенос из 3-го в 4-й бит). Используется при работе с двоично-десятичными числами, о которых речь пойдет позже.
ZF — zero flag — флаг нуля. Установлен, если результат нулевой; сброшен, если результат ненулевой.
SF — sign flag — флаг знака. Равен знаковому биту результата. Стало быть, установлен если результат отрицательный; сброшен, если неотрицательный.
OF — overflow flag — флаг знакового переполнения. Установлен, если результат арифметической операции над знаковыми операндами лежит вне допустимого диапазона.
Пример. AX = 2345h, BX = 3219h. Вычислим содержимое битов состояния регистра флагов после выполнения операции add ax,bx (к содержимому регистра AX прибавить содержимое BX и поместить результат в AX, т.е. AX = AX + BX).
Ясно, что 2345h + 3219h = 555Eh. Выполним эту же операцию в двоичной системе счисления (рис. 3.10):

0010 0011 0100 0101
+
0011 0010 0001 1001


0101 0101 0101 1110
Рис. 3.10.

CF = 0 (переноса из знакового разряда не было, точнее, перенос нулевой);
PF = 0 (количество единиц в младшем байте равно 5, нечетному числу);
AF = 0 (из третьего в четвертый бит переноса не было);
ZF = 0 (результат ненулевой);
SF = 0 (результат неотрицательный);
OF = 0 (сумма знаковых чисел в допустимом диапазоне).
Упражнение. Проделать то же самое, если AX = 5439h, BX = 456Ah. (Проверить решение вы сможете после изучения возможностей Turbo Debugger.)
Чисто формально перечислим назначение оставшихся трех флагов:
TF — trace flag — флаг трассировки (пошаговое выполнение команд с целью отладки программы),
IF — interrupt flag — флаг разрешения прерывания от внешнего устройства,
DF — direction flag — флаг направления (в каком направлении — от младших адресов к старшим или наоборот — обрабатывают массив данных специальные строковые команды).
Флаг TF используется отладчиками — это очень специальная тема, и разбирать ее мы не будем. Назначение флагов IF и DF детально будет разъяснено существенно позже.

Итак, программно-доступными являются 14 регистров. Однако сегментные регистры, а также IP, SP, регистр флагов содержат информацию, которой программист не может произвольно распоряжаться. Если ассемблерная программа стыкуется с программой, написанной на языке высокого уровня, то, как правило, задействован и регистр BP. Итак, для промежуточного хранения информации у программиста остается всего шесть, в лучшем случае, семь регистров (AX,BX,CX,DX,SI,DI и BP). Поэтому приходится прилагать немало усилий, чтобы снизить количество обращений к памяти.

3.13. Turbo Debugger. Знакомство с окном CPU.
Если вы еще не покинули Turbo Debugger, то нажатием клавиши F6 (Next, переход к следующему окну) вы перейдете в окно CPU. Это окно разбито на панели (рис. 3.11).

код


регистры флаги
данные

стек
Рис.3.11.
Активной является панель кода (в ней находится синяя полоса курсора). Переход из панели в панель по часовой стрелке осуществляется нажатием клавиши Tab, против часовой стрелки — Shift+Tab (активизировать панель также можно щелчком мыши). С каждой панелью связано свое локальное меню, оно вызывается нажатием Alt+F10 или щелчком правой кнопки мыши.
Изучим панели регистров. Перейдите в панель регистров (Tab). Выделите курсором регистр DX, в котором сейчас записан 0 (отладчик заранее очищает регистры общего назанчения). Вызовите локальное меню (Alt+F10). Выделите в нем команду Decrement. В нижней строке экрана появляется подсказка: Decrement the highlighted register (уменьшение выделенного регистра). Если вы нажмете функциональную клавишу F1 (Help), то на экране появится окно с текстом Справки. Это окно закрывается нажатием клавиши Esc. Нажмите Enter. Содержимое DX изменится и станет равным FFFF. Увеличим его на 1. Вспомним, что начальные буквы пунктов локального меню были выделены цветом. Это означает, что, находясь в панели, можно осуществить команду локального меню нажатием комбинации клавиш Ctrl+буква. Нажмем (и не отпускаем) клавишу Ctrl. В нижней строке экрана появляется подсказка: Ctrl: I-Increment D-Decrement и т.д. Не отпуская Ctrl, нажмем клавишу I. Содержимое DX увеличится на 1 и вновь станет равным нулю. В локальном меню после пункта Change (изменить) стоит многоточие. Это означает, что после выбора этого пункта меню появится диалоговое окно. Запишите в CX число 7.
Проверим, правильно ли мы вычислили флаги для результата суммирования слов 2345h и 3219h. Введите эти значения в регистры AX и BX. Перейдите в панель кода и наберите команду add ax,bx. Как только вы введете букву a, как появится диалоговое окно Enter instruction to assemble (введите инструкцию для ассемблирования), в котором вы завершите ввод команды. В панели кода вы увидите:
cs:0100►03C3 add ax,bx
Здесь 03C3 — это код команды add ax,bx. Именно такие числовые коды «понимает» процессор. Команда введена по адресу cs:100, т.е. сегментная часть адреса хранится в CS, а смещение равно 100. Треугольник показывает, что в IP хранится адрес 100. Тем самым команда готова к выполнению.
Нажмем клавишу F7 (trace — трассировка). В AX появится результат сложения 555E. В панели флагов увидим выставленные по результату сложения флаги.
Испытаем теперь следующую пару слагаемых: AX = 5439h, BX = 456Ah. Введите эти числа в регистры. А теперь еще раз выполним команду сложения. Для этого надо поместить в счетчик команд IP значение 100. Можно ввести это значение в панели регистров, но лучше поступить иначе. В панели кода поставим курсор на адрес 100 и выберем в локальном меню команду New CS:IP. В IP окажется нужное значение. Выполните команду F7 и проверьте результат.

© Copyright 2012-2020, Все права защищены.