Режимы адресации памяти и арифметические операции
Цель работы: изучение работы процессора и ПЭВМ при выполнении арифметических операций при использовании различных режимов адресации памяти.
Задачи лабораторной работы
1. Изучить режимы адресации операндов.
2. Изучить функционирование процессора при выполнении арифметических операций.
3. Изучить функционирование процессора при выполнении операций над знаковыми числами.
4. Научиться адресовать данные в различных режимах.
5. Изучить назначение отдельных разрядов регистра признаков (флагов).
6. Освоить методы изменения атрибутов данных.
7. Освоить виды кодов ЭВМ, используемые для хранения и вывода информации.
8. Освоить процедуры вывода информации на экран.
Алгоритм выполнения лабораторной работы
1. Ознакомиться с целью и задачами лабораторной работы.
2. Изучить теоретический материал.
3. Выяснить неясные вопросы у преподавателя.
4. Разработать алгоритм решения задачи по заданию в таблице 3.2.
5. Составить программу решения задачи, применяя заданные режимы адресации.
6. Выполнить программу в отладочном режиме (с помощью Турбо Дебюггера).
7. При выполнении программы отслеживать, по содержимому регистров процессора, результаты выполнения каждой команды, а также контролировать изменение состояния флагов регистра признаков процессора.
8. Результат вычислений программно вывести на экран.
9. Рассчитать вручную, на калькуляторе, значения искомых величин.
10. Сравнить вычисленные вручную и на ЭВМ величины.
11. При правильности решения подготовить отчет о работе.
Теоретическая часть
Базовый цикл работы процессора
При исполнении любой команды процессор циклически выполняет строго определенные действия, называемые базовым циклом работы процессора. Алгоритм базового цикла определен на аппаратном уровне и выполняется процессором вне зависимости от типа команды. В базовый цикл процессора входят следующие действия:
· вычисление адреса команды;
· чтение команды из памяти;
· дешифрация команды (преобразование во внутренний микрокод ;
· модификация содержимого IP;
· вычисление адреса операндов;
· чтение (выборка) операндов из памяти на регистры процессора;
· исполнение операции над выбранными операндами;
· вычисление адреса результата;
· запись результата операции в память или регистры процессора;
· переход в пункт первый.
В результате получается цикл выборки, дешифрации и исполнения команды.
Режимы адресации операндов команд
МП 8086 предоставляет 24 режима адресации операндов. Их можно разделить на 7 основных групп:
· регистровая адресация;
· непосредственная адресация;
· прямая адресация;
· косвенная регистровая адресация;
· адресация по базе;
· прямая адресация с индексированием;
· адресация по базе с индексированием.
Режим адресации в команде указывает место нахождение операнда – источника. В таблице 3.1 приведены форматы и местонахождение операндов для семи режимов адресации.
Микропроцессор выбирает один из режимов адресации по значению поля режима команды.
Ассемблер присваивает то или иное значение полю режима, в зависимости от того, какой вид имеют операнды в исходной программе. Например, если в программе написана команда MOV AX,BX, то ассемблер установит режим регистровой адресации и микропроцессор поймет, что операнды находятся в регистрах AX и ВХ.
Но если в этой команде заключить второй операнд в квадратные скобки MOV AX,[BX], то ассемблер установит режим косвенной регистровой адресации, и микропроцессор поймет, что операнд-источник находится в памяти по адресу, указанному в регистре ВХ.
Подробное описание режимов адресации с примерами и пояснениями приведено ниже.
Регистровая и непосредственная адресация
Из семи режимов адресации самыми быстрыми являются регистровая и непосредственная адресации операндов, поскольку в этом случае операционный блок микропроцессора 8086 извлекает их либо из регистров (при регистровой адресации), либо из конвейера команд (при непосредственной адресации).
Таблица 3.1– Режимы адресации
Режимы адресации | Место расположение адреса операнда | Используемый сегментный регистр | Местонахождение операнда. |
Примеры | |||
Регистровая | Регистр | Не используется | В команде. |
Mov AL,CL | |||
Непосредствен- ная | Данное | Не используется | В команде. |
Mov AX,1287H | |||
Прямая | Сдвиг (смещение) | DS | В памяти. |
Mov AX,TAB | |||
Косвенная регистровая | [DX] [BP] [DI] [SI] | DS SS DS DS | В памяти. |
Mov AX,[DX] Mov CX,[BP] Mov BP,[DI] Mov DX,[SI] | |||
По базе | [BX] + сдвиг [ВР] + сдвиг | DS SS | В памяти. |
Mov AX,[BX]+8 Mov AX,[BP+6] | |||
Прямая с индексирова- нием | [SI] + сдвиг [DI] + сдвиг | DS DS | В памяти. |
Mov AX,TAB+[SI] Mov DX,TAB+[DI] | |||
По базе с индексирова- нием | [BX]+[SI] + сдвиг [BX]+[DI] + сдвиг [BP]+[SI] + сдвиг [BP]+[DI] + сдвиг | DS DS SS SS | В памяти. |
Mov AX,[BX+SI+2] Mov AX,[BX][DI+6] Mov AX,[BP+4][SI] Mov AX,[BP][DI+8] |
В других режимах адресация выполняется более длительное время, потому что интерфейс шины вначале должен вычислить адрес ячейки памяти, извлечь операнд и только после этого передать его операционному блоку.
При регистровой адресации микропроцессор извлекает операнд из регистра (или загружает его в регистр). Например, команда MOV АХ,СХ копирует 16-битовое содержимое счетчика СХ в регистр аккумулятор АХ. Содержимое регистра СХ после операции не изменяется.
В данном примере микропроцессор 8088 использует регистровую адресацию для извлечения операнда-источника из регистра СХ и загрузки его в регистр-приемник АХ.
Непосредственная адресация позволяет указывать в качестве операнда-источника 8-или 16-битовое значение константы. Эта константа находится в команде (куда она помещается ассемблером), но не в регистре и не в ячейке памяти. Например, команда MOV СХ,500 загружает десятичное число 500 в регистр СХ, а команда MOV CL,-З0 загружает десятичное число минус 30 в регистр CL.
Непосредственный операнд также может быть идентификатором, определенным оператором EQU, поэтому в командах допустима следующая форма оператора:
К EQU 1O24; Присвоить константе 1024 идентификатор К и
MOV СX,К; загрузить эту константу регистр СХ.
Чтобы избежать ошибок, необходимо учитывать, что допустимые значения для 8-битовых чисел со знаком ограничены диапазоном от - 128 (З0Н) до +127 (7FH), 16-битовых чисел со знаком диапазоном от -32768 (8000Н) до +32767 (7FFFH). Максимальное значение 8-битовых чисел без знака равно 255 (0FFH), а 16-битовое равно 65535 (0FFFFH).
Прямая адресация памяти
Операнд находится в основной памяти. Когда операционному блоку требуется прочитать или записать операнд, находящийся в памяти, он передает значение смещения адреса блоку преобразования адресов. Последний добавляет это смещение к содержимому регистра сегмента (предварительно умноженному на 10h, то есть дополненному четырьмя нулями) и тем самым получает 20-битовый физический адрес, который и используется для доступа к операнду.
Смещение, которое вычисляется операционным блоком для доступа к находящемуся в памяти операнду, называется исполнительным адресом операнда. Исполнительный адрес показывает, на каком расстоянии (в байтах) располагается операнд от начала того сегмента, в котором он находится. Будучи 16-битовым числом без знака, исполнительный адрес позволяет получить доступ к операндам, находящимся выше начала сегмента на расстоянии до 65536 (или 64К) байтов.
Обычно прямая адресация применяется, если операндом служит метка или идентификатор некоторых данных.
Например, команда MOV AX,TABL загружает содержимое ячейки памяти по имени TABL в регистр АХ.
Здесь ассемблер сам заменяет метку TABL на соответствующий адрес. Если перед меткой не указан сегментный регистр, то процессор по умолчанию устанавливает сегментный регистр DS. В случае, когда данные находятся в других сегментах, необходимо явно указать имя требуемого сегмента. Например:
MOV AX,TABL; ячейка TABL находится в сегменте данных DS,
MOV AX,ES:TABL; ячейка TABL в дополнительном сегменте ES.
Косвенная регистровая адресация
При косвенной регистровой адресации исполнительный адрес операнда может находиться в базовом регистре ВХ, регистре указателя базы ВР или индексных регистрах (SI или DI). Косвенные регистровые операнды надо заключать в квадратные скобки, чтобы отличить их от регистровых операндов.
Например, команда MOV АХ,[ВХ] загружает в регистр АХ содержимое ячейки памяти, адресуемой значением регистра ВХ.
Для пересылки смещения адреса в регистр ВХ применяют два способа.
Первый способ – используют команду LEA. Например, LEA АХ,TAB. Эта команда пересылает адрес ячейки TAB в регистр АХ.
Второй способ – применяют директиву OFFSET (смещение) к адресу ячейки памяти. Например, для загрузки слова из ячейки TAB в регистр АХ можно воспользоваться последовательностью команд:
MOV ВX,Offset TABL; занести смещение ячейки TABL в ВХ,
MOV АХ,[ВХ]; затем переслать в АХ содержимое ячейки памяти, адрес которой находится в ВХ.
Адресация по базе
При адресации по базе ассемблер вычисляет исполнительный адрес, складывая значения сдвига ячейки относительно начала сегмента, с содержимым регистров ВХ, ВР, SI, DI.
Регистр ВХ удобно использовать при доступе к структурированным записям данных, расположенным в разных областях памяти. В этом случае базовый адрес записи помещается в базовый регистр ВХ, и доступ к ее отдельным элементам осуществляется по их сдвигу относительно базы, а для доступа к разным записям одной и той же структуры достаточно соответствующим образом изменить содержимое базового регистра.
Ассемблер позволяет указывать адресуемые по базе операнды различными способами:
MOV AX,[BX] + 4
MOV AX,[BX + 4]
MOV AX,4 [BP]
Этим методом организовывается доступ к одномерным массивам. Смещение соответствует адресу начала массива байтов, а цифра – индексу элемента массива, который надо считать. Необходимо учитывать, что если в роли базового регистра используется ВР, то операнд находится в сегменте стека.
Прямая адресация с индексированием
При прямой адресации с индексированием исполнительный адрес вычисляется как сумма значений сдвига и содержимого индексных регистров (DI или SI).
Этот тип адресации удобен для доступа к элементам таблицы. В этом случае сдвиг указывает на начало таблицы, а индексный регистр на номер элемента в таблице.
Например, если TAB – таблица байтов, то последовательность команд:
MOV DI,2;
MOV AL,TAB[DI]; загрузит третий элемент таблицы в регистр AL.
Адресация по базе с индексированием
При адресации по базе с индексированием исполнительный адрес вычисляется как сумма значений базового регистра, индексного регистра и, возможно, сдвига. Так как в этом режиме адресации складывается два отдельных смещения, то он удобен при адресации двумерных массивов, когда базовый регистр содержит начальный адрес массива, а значения сдвига и индексного регистра суть смещения по строке и столбцу. Примеры команд:
MOV AX,[BX+SI+2]; В ВХ содержится начальный адрес таблицы;
MOV AX,[BX]+[SI]+2]; В SI может находиться номер строки таблицы;
MOV AX,[BX+2]+[SI×М]+2; М-это коэффициент масштабирования;
MOV AX,[BX]+[SI×М]+2]; 2 указывает на смещение по строке таблицы;
MOV AX, TAB [BX+2]+[SI]; Здесь 2 увеличивает базовый адрес на 2.
Из примеров команд видно что, операнды можно заключать в скобки в любом порядке, а сдвиг можно сочетать с любым из регистров, или идентификатором данных.
В регистр АХ помещается слово из ячейки памяти со смещением, равным сумме чисел, содержащихся в TAB, ВХ, SI, и числа 2.