Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
24
Добавлен:
20.06.2014
Размер:
1.08 Mб
Скачать

Контрольные задания

  1. Выделить команды, при выполнении которых процессор осуществляет передачу информации.

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

  3. Выделить команды, при выполнении которых процессор выдает только адреса памяти команд.

  4. Выделить команды, при выполнении которых процессор выдает не только адреса памяти команд, но и памяти данных и устройств ввода-вывода.

  5. Выделить команды, при выполнении которых процессор выдает адреса памяти данных.

  6. Выделить команды, при выполнении которых процессор выдает адреса устройств ввода-вывода.

  7. Найти команды, при выполнении которых процессор выполняет определенное количество циклов шины.

  8. Найти команды, при выполнении которых процессор выполняет определенный тип цикла шины.

  9. Для указанных команд определить количество и типы циклов шины.

Лабораторная работа №3. Регистры и система команд процессора. Способы адресации. Влияние команд на регистр флагов

Цель работы и рассматриваемые вопросы

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

Рассматриваемые вопросы:

  1. Характеристики и классификация регистров процессора.

  2. Виды адресов.

  3. Флаги, их типы и изменение в процессе выполнения программы.

  4. Дополнительный код, знаковые и беззнаковые числа, особенности изменения флагов переноса и переполнения при выполнении арифметических команд.

  5. Характеристики команд.

  6. Группы команд процессора.

  7. Формат команды.

  8. Способы адресации.

  9. Влияние команд на флаги.

Теоретическая информация

Архитектура процессора i8086

Состав регистров процессора i8086

Процессор i8086 включает четырнадцать 16-разрядных программно-доступных регистров, которые можно разделить на четыре группы:

  • регистры общего назначения (AX, CX, DX, BX, SP, BP, SI, DI — 8 шт.);

  • сегментные регистры (ES, CS, SS, DS — 4 шт.);

  • указатель команд (IP);

  • регистр флагов (Flags).

Регистры общего назначения процессора i8086

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

  1. AX — accumulator (аккумулятор). Специализация — умножение, деление, ввод-вывод слов.

  2. CX — counter (счетчик). Операции с цепочками, циклы.

  3. DX — data (данные). Умножение и деление слов, косвенный ввод-вывод.

  4. BX — base (база). Источник базового адреса.

Буква X в названиях этих регистров — от слова eXtended (расширенный). Это традиционное использование буквы X в различных названиях. В процессорах i8080 и i8085 были 8-битные регистры A, B, C и D, а здесь они расширены до 16 бит.

Эти четыре регистра можно выделить как отдельную подгруппу в группе регистров общего назначения. Ее особенность в том, что каждый из этих регистров состоит из двух частей, старшего и младшего байтов, обращаться к которым можно отдельно по именам: AH, AL, BH, BL, CH, CL, DH, DL.

Оставшиеся четыре регистра также выделяются в отдельную подгруппу указательных и индексных регистров:

  1. SI — source index (индекс источника), используется в командах работы со строками (массивами).

  2. DI — destination index (индекс приемника), также используется в операциях со строками.

  3. BP — base pointer (указатель базы), используется для доступа к внутренним элементам стека при передаче параметров подпрограмме через стек.

  4. SP — stack pointer (указатель стека), предоставляет доступ к верхушке стека.

Данные регистры хранят внутрисегментные адреса (смещения). По умолчанию регистр SI сегментируется по DS, DI — по ES; BP и SP — по SS.

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

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

Стек

Стек — это область памяти, предназначенная для хранения временной информации: адресов возврата из подпрограмм, параметров, переданных подпрограмме, локальных данных подпрограммы и т. п.

В x86 стек реализуется в виде отдельного сегмента, на начало которого указывает регистр сегмента стека SS. На последнюю заполненную ячейку стека (верхушку стека) указывает регистр SP. Если в стек на данный момент ничего не помещалось, то SP, соответственно, указывает на неопределенные данные, не имеющие значения для программы.

Для работы со стеком предназначены специальные команды:

  • PUSH, помещение в стек;

  • POP, извлечение из стека.

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

Минимальный размер операнда, помещаемого в стек — слово. При помещении операнда в стек указатель стека декрементируется и затем по данному адресу записывается операнд. При этом, по старшему адресу оказывается старший байт операнда, а по младшему — младший, т.е., little endian order касается и стека. Извлечение из стека происходит в обратном порядке — операнд извлекается из верхушки стека, а затем указатель стека инкрементируется. Понятно, что величина декремента и инкремента указателя стека равна размеру операнда. Следует также отметить, что в общем случае в зависимости от ширины шины данных помещение-извлечение из стека может происходить не за один цикл шины.

Сегментные регистры и указатель команд процессора i8086

Другая важная особенность архитектуры i8086 состоит в том, что адресное пространство процессора является дискретным, сегментированным, т. е. разделенным на сегменты, 64-килобайтные области памяти. Размер физического адреса процессора i8086 составляет 20 бит. Размер сегментного регистра — 16 бит. Сегментные регистры хранят начальный (базовый) адрес сегмента, деленный на 16. В i8086 четыре сегментных регистра:

  • кода (регистр CS, Code Segment);

  • данных (регистр DS, Data Segment);

  • стека (регистр SS, Stack Segment);

  • дополнительного сегмента (регистр ES, Extra Segment).

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

  • разделение команд, глобальных и локальных данных в памяти по различным сегментам;

  • уменьшение размера программы (в командах содержатся не 20-битные физические адреса, а 16-битные);

  • отсутствие необходимости иметь 20-разрядные регистры для хранения и выдачи адресов.

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

Регистр IP (Instruction Pointer, указатель команды), как уже неоднократно говорилось, содержит смещение следующего байта команды от начала текущего сегмента кода, который будет выбирать процессор.

Логический и физический адреса

Из-за наличия сегментации в процессоре i8086 существует понятие логического адреса. Логический адрес — это пара 16-битных чисел сегмент:смещение (база:смещение). Например, логический адрес очередного байта команды представляет собой значение пары CS:IP.

База определяет адрес начала сегмента. Смещение называется также эффективным или исполнительным адресом. Оно может формироваться достаточно сложным образом с использованием различных способов адресации.

Адрес, который процессор выдает по шине адреса, называется физическим. Его размер у i8086 равен двадцати битам. Поэтому база сегмента в логическом адресе i8086 не может быть адресом начала сегмента. Адрес начала сегмента — это база, умноженная на 16 (сдвинутая влево на один шестнадцатеричный или четыре двоичных разряда). Таким образом, адрес начала сегмента всегда кратен шестнадцати. Благодаря этому выделяется такая единица памяти, как параграф. Параграф — область памяти размером в 16 байт, начинающаяся с адреса, кратного шестнадцати. Поэтому начало сегмента соответствует границе параграфа.

Пример.

Логический адрес: 10B2:2D08

Физический адрес:

Соответствие между физическими и логическими адресами не является взаимнооднозначным. Одному значению физического адреса может соответствовать множество значений логического адреса. Кроме того, существует множество значений логического адреса, которое дает значение физического адреса, превышающее максимально допустимое для i8086 — FFFFFh. В таких случаях по шине адреса выдаются значения 0-19 битов получившегося адреса. Например, логическому адресу FFFFh:0010h будет соответствовать физический адрес 00000h.

У процессора i80286 и последующих разрядность физической шины адреса больше двадцати бит. При работе в реальном режиме используются младшие двадцать адресных линий, A0-A19, остальные адресные линии блокируются. Однако есть возможность снять блокировку с адресной линии A20. При этом в реальном режиме появляется еще один сегмент памяти, лежащий выше границы первого мегабайта. Этот сегмент называется областью верхней памяти (High Memory Area, HMA). Ему соответствует диапазон логических адресов от FFFFh:0010h до FFFFh:FFFFh. Размер HMA составляет 64 килобайта минус 16 байт. Операционная система MS-DOS может использовать область верхней памяти, располагая там свое ядро. Для этого необходимо подключить драйвер HIMEM.SYS и поместить в файл CONFIG.SYS строку:

DOS=HIGH

Регистр флагов процессора i8086

Регистр флагов (Flags) i8086 содержит два типа флагов:

  1. Управляющие флаги.

  2. Признаки результата арифметических и логических команд.

К управляющим относятся следующие флаги:

  1. D (Direction), бит 10 — флаг направления. Определяет порядок сканирования строк (0 — от меньших адресов к большим (регистры DI/SI увеличиваются), 1 — от больших к меньшим (регистры DI/SI уменьшаются)). Устанавливается командой STD, сбрасывается командой CLD.

  2. I (Interrupt), бит 9 — флаг прерывания. Определяет реакцию процессора на запросы внешних прерываний по входу INT (0 — прерывания запрещены, 1 — разрешены). Устанавливается командой STI, сбрасывается командой CLI.

  3. T (Trace), бит 8 — флаг трассировки, переводящий процессор в пошаговый (покомандный) режим работы, в котором процессор генерирует внутреннее прерывание INT1 (исключение #DB) после выполнения каждой команды, обработчик которого может, например, индицировать содержимое регистров процессора.

Результат выполнения арифметических и логических команд характеризуют следующие флаги:

  1. (Overflow), бит 11 — флаг переполнения. Фиксирует выход единички за пределы разрядной сетки знаковых чисел. Его можно трактовать как флаг переноса при операциях со знаковыми числами.

  2. S (Sign), бит 7 — флаг знака. Повторяет старший бит результата, который для отрицательных чисел всегда равен единице.

  3. Z (Zero), бит 6 — флаг нуля. Равен единице, если результат равен нулю, и нулю в противном случае.

  4. AC (Auxiliary Carry), бит 4 — флаг дополнительного переноса. Фиксирует перенос из младшей тетрады в старшую или заем из старшей тетрады в младшую. Необходим при выполнении арифметических операций с числами в двоично-десятичном коде.

  5. P (Parity), бит 2 — флаг паритета (четности). Равен единице, если число единичек в младшем байте результата четное, и нулю в противном случае.

  6. C (Carry), бит 0 — флаг переноса. Фиксирует перенос из старшего бита результата или заем в старший бит результата при выполнении арифметических команд. Является также приемником сдвигаемого бита (старшего или младшего) или источником для освобождающегося бита в командах сдвига. Также значение флага переноса можно изменять с помощью команд STC, CLC, CMC.

Кроме того, для работы с регистром флагов в системе команд процессора имеются специальные команды: SAHF — размещения AH в младшем байте регистра флагов, LAHF — загрузки AH из младшего байта регистра флагов, PUSHF, PUSHFD — помещения регистра флагов в стек, POPF, POPFD — извлечения регистра флагов из стека.

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

Дополнительный код, знаковые и беззнаковые числа, флаги переноса и переполнения

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

Так как материальные носители информации в компьютерных системах, регистры или ячейки памяти, имеют ограниченный размер, то сложение и вычитание производится по так называемому модулю 2k, где k — размер регистров, в которых содержатся операнды (величина разрядной сетки):

Здесь C — флаг переноса.

По сути дела, единичка, выходящая при сложении за пределы разрядной сетки, оказывается во флаге переноса. Потеря этой единички в регистре соответствует вычитанию 2k. При вычитании единичка в этом флаге свидетельствует о заеме в старший разряд уменьшаемого, что соответствует прибавлению 2k. Поскольку процессор вычитает числа по алгоритму сложения, то заем — это инвертированный перенос. То есть, команда вычитания, работающая по алгоритму сложения, записывает во флаг переноса значение, полученное инвертированием реального переноса из старшего разряда. Так команды сложения числа 3 с числом (-8) и вычитания из числа 3 числа 8 дают один и тот же результат, что совершенно естественно, однако их влияние на регистр флагов различается. Команда сложения дает C=0, а команда вычитания — C=1.

Для знаковых целых в дополнительном коде старший разряд имеет смысл знака числа. Оставшиеся разряды — это модуль (мантисса, цифровая часть). Их число на единицу меньше общего числа разрядов, т. е. равняется k-1, однако все равно арифметические операции над ними осуществляются по модулю 2k (используются те же команды, те же алгоритмы). При этом старшие цифры, представляющие собой знаки, складываются, как “нормальные” цифры. Фактически знаковые числа складываются как беззнаковые. Только исходные данные и результаты интерпретируются как знаковые. Однако, выигрывая в одном, мы проигрываем в другом. Использование тех же алгоритмов имеет следующий побочный эффект. Рассмотрим сложение знаковых чисел +127 и +2 при условии, что k=8. Складывая их как беззнаковые, получим 129. Интерпретируя 129 как число со знаком, получим -127. А это является неправильным результатом. 129 не умещается в семи разрядах, отведенных под модуль. Получилось, что модуль “залез” в знаковый разряд. Истинный знак при этом был потерян. Если бы был реализован отдельный алгоритм для знаковых чисел, то сложение и вычитание в нем осуществлялось бы по модулю 2k-1. “Накрывание” знака мантиссой не происходило бы, однако пришлось бы отдельно оперировать со знаками. Чтобы этого не делать, придумали флаг O, флаг переполнения (имеется ввиду переполнение мантиссы), который фиксирует эту ситуацию. Переполнение мантиссы происходит при сложении чисел одного знака или, что то же самое, при вычитании чисел с разными знаками, например (+127)-(-2), когда настоящая сумма оказывается вне диапазона представимых знаковых чисел.

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

Соседние файлы в папке Задания к лабораторным