Лабораторная работа №2 Режимы адресации



Дата30.06.2016
өлшемі84.5 Kb.
#167014
түріЛабораторная работа
Лабораторная работа № 2

Режимы адресации


  1. ЦЕЛЬ РАБОТЫ

Целью работы является разработка простой программы преобразования данных для приобретения практических навыков программирования на языке ассемблера и закрепления знаний по режимам адресации.



2. ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

2.1. Команды ассемблера
Программа на языке ассемблера представляет собой последовательность операторов, описывающих выполняемые действия. Оператором (строкой) исходной программы может быть или команда, или псевдооператор (директива) ассемблера.

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

Команда может включать до 4-х полей следующего вида:

[метка:] мнемокод [операнд] [; комментарий]

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

GETCOUNT: MOV CX,DX ;инициализация счетчика, поместить содержимое регистра DX в регистр CX

Пример команды с полем мнемокода:


PUSHF

Эта команда сохраняет в стеке содержимое регистра флагов.

Перечень команд ассемблера, применяемых во всех моделях микропроцессоров Intel приводится в приложении 2.

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

а) двоичной, как последовательность цифр 0 и 1, заканчивающихся буквой В, например, 10111010В;

б) десятичной, в привычной десятичной системе счисления с необязательной буквой D на конце, например, 129D или просто 129;

в) шестнадцатеричной, как последовательность цифр от 0 до 9 и букв от A до F, заканчивающаяся буквой H. Если шестнадцатеричная константа начинается с буквы, то такая константа дополняется первым символом - цифрой от 0 до 9, например, 0E23H (в данном случае первая цифра информирует Ассемблер о том, что E23 число, а не идентификатор или переменная);

г) литералом, в виде строки букв, цифр и других символов, заключенной в кавычки или апострофы.

Мнемокоды могут иметь от 2 до 6 букв, при трансляции мнемокод преобразуется в числовое значение по таблице перекодировки (внутри транслятора). Мнемокоды имеют жесткий формат, предусматривающий 1,2 или отсутствие операндов. Если операндов 2 , они отделяются друг от друга запятой.

Нельзя использовать в качестве меток имена регистров и мнемокоды, кроме того метка должна начинаться с буквы, но может содержать цифры и специальные символы: ?, @/, _, $ и точку, однако точка может быть только первым символом метки.

Важной особенностью машинных команд является то, что они не могут манипулировать одновременно 2-мя операндами, находящимися в оперативной памяти (ОЗУ). Это означает, что в команде только 1 операнд может указывать на ячейку ОЗУ, другой операнд должен быть либо регистром, либо непосредственным значением. По этой причине возможны следующие сочетания операндов в команде:

а) регистр - регистр;

б) регистр - память;

в) память – регистр;

г) регистр - непосредственный операнд;

д) память - непосредственный операнд.

Для команд характерно, что при наличии двух операндов первый из них является приемником, а второй – источником. Результат операции сохраняется по первому адресу, вот почему первый операнд никогда не может быть непосредственным операндом или, иначе говоря, константой.


2.2. Режимы адресации
Смещение, которое вычисляется операционным блоком для доступа к находящемуся в памяти операнду, называется исполнительным адресом операнда. Этот исполнительный адрес показывает, на каком расстоянии (в байтах) от начала сегмента располагается искомый операнд.

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

Различают адресацию операндов:

- непосредственную, которая заключается в указании в команде самого значения операнда, а не его адреса;



  • прямую, предполагающую указание в команде непосредственно исполнительного адреса;

  • косвенную, при которой в команде указывается адрес регистра или ячейки памяти, в которых хранится адрес операнда или его составляющие;

  • ассоциативную (используется в ассоциативных запоминающих устройствах, на ней останавливаться не будем);

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

Непосредственная адресация имеет место, если операнд-источник является константой или переменной, которой присвоено постоянное значение. Например:

MOV AX, 500 загружает значение 500 в РОН AX или

. . . . . . .

K EQU 1024

.. . . . . . . .

MOV CX, K загружает в РОН СХ константу 1024, определенную идентификатором К.

Следует отметить, что непосредственный операнд может быть задан простым выражением, в котором константы или идентификаторы констант связаны арифметическими операциями +, -, * или / (в таких выражениях не должно быть скобок). Например:

MOV AX, 156*10Н/2.

Следует помнить, что диапазон посылаемых чисел (значений непосредственного операнда) определяется вместимостью приемника - если это однобайтовый регистр (AH, AL, BL …), то в него можно посылать беззнаковые числа в диапазоне от 0 до 255, знаковые – от –128 до 127.

Прямая регистровая адресация имеет место в командах, оперирующих с содержимым РОН или сегментных регистров в качестве одного или обеих операндов команды. Например, команда:

MOV DS, AX

копирует содержимое РОН АХ в сегментный регистр DS, при этом содержимое регистра AX не изменяется.

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



Прямая адресация ячеек ОП имеет несколько вариантов:

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

MOV AX, SOURCE

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




0001

SOURCE

ВВ

0002




АА

0003

SOURCE+2



После выполнения вышеуказанной команды пересылки регистр АХ будет содержать АХ=ААВВ.

Примеры прямой обычной адресации вы можете видеть в программе, приведенной в приложении 1.А;


  • прямая с индексированием: =+, причем находится в индексном регистре, например:

  • MOV AX, SOURCE[SI];

  • прямая с базированием: =+, находится в базовом регистре, например:

  • MOV AX, SOURCE[ВХ].

Такая адресация предназначена для доступа к данным с известным смещением относительно некоторого базового адреса, при этом исполнительный адрес получается путем сложения значения сдвига с содержимым регистров BX или BP. Например, таблица TABLE содержит поля фамилии (FAM 20 байт), имени (NAME 15 байт) и адреса (PLACE 50 байт). Тогда командами

MOV ВХ, 20

MOV AL, TABLE[ВХ]

получим в регистре AL первый байт имени.



  • прямая с индексированием и базированием: =++, например:

MOV AX, SOURCE[ВХ+SI].

Возможна и такая форма записи команды:

MOV AX, NUMBER [BP][SI].

Существует 2 варианта косвенной адресации ячеек ОП:



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

MOV AX, [BX].

Исполнительный адрес операнда может находиться в любом из сегментных регистров, кроме регистра стека (в базовом регистре BX, регистре указателя базы BP или индексном регистре SI или DI). Косвенный регистровый операнд заключается в квадратные скобки, что означает ”в качестве адреса брать содержимое того адреса, на который указывает заключенный в квадратные скобки регистр”. Чтобы адрес-смещение переменной мог оказаться в РОН, используется команда пересылки следующего вида:

MOV BX, offset SOURCE.

Функции этой команды заключаются в том, что смещение (offset) ячейки памяти с именем SOURCE помещается в РОН ВХ. Естественно, в программе эта команда должна предшествовать команде пересылки с косвенной адресацией.

Т.к. содержимое регистра легко изменить в ходе выполнения программы, данный способ адресации позволяет динамически назначить адрес операнда для некоторой машинной команды. Это свойство применяется для организации циклических вычислений и для работы со структурами данных типа таблиц и массивов;


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

MOV AX, [BX+SII].

Смешанная непосредственная адресация ячеек памяти имеет несколько вариантов:



  • непосредственная обычная:

MOV AX, offset pole.

Здесь в качестве непосредственного операнда берется смещение адреса переменной pole;

- непосредственная с индексированием, когда в качестве исполнительного адреса операнда берется сумма значений индексного регистра и непосредственного смещения:

MOV AX, [SI+const],

причем смещение, обозначенное const, может быть задано числом, идентификатором константы, смещением адреса переменной (offset), или их комбинацией в виде простого выражения;


  • непосредственная с базированием, в которой, в отличие от предыдущей адресации, фигурирует базовый, а не индексный регистр:

MOV AX, [BX+const].

Форма записи смещения относительно базы может быть любой из 3-ех нижеприведенных:

MOV AX, [BX]+4 ,

MOV AX, 4[BX] ,

MOV AX, [BX+4].

Это примечание относится и к форме записи команд с индексированием (предыдущий вид адресации);



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

MOV AX, pole[BX+SI+const].

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

MOV AX, [BX+2+DI],

MOV AX, [DI+BX+2],

MOV AX, [BX+2][DI],

MOV AX, [BX+2+DI].


3. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ
1. Изучить приведенный теоретический материал к лабораторной работе.

2. Используя прямую (первый вариант) и косвенную (второй вариант) адресацию, написать программы на ассемблере, выполняющие алгоритмы преобразований из п. 5 (по указанию преподавателя).



Примечания к кодированию программ:

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

  • для варианта косвенной адресации зашлите адреса начала массивов в базовый и индексный регистры, например командами:

MOV BX, OFFSET SOURCE и

MOV DI, OFFSET DEST,

и далее используйте регистры BX и DI для адресации элементов массивов.

3. Оттранслировать программу в объектный код.

4. Провести отладку программы и проверить получаемые результаты.


  1. СОДЕРЖАНИЕ ОТЧЕТА

Отчет должен включать:



  • титульный лист;

  • описание цели работы;

  • описание задания на лабораторную работу;

  • - словесные пояснения к алгоритму решения задачи и схему программы (обращаю Ваше внимание на то, что схема программы одна, а реализаций этой схемы должно быть две – с применением прямой и косвенной типов адресации);

  • листинги программ;

  • результаты выполнения программ;

  • выводы.


5. ВАРИАНТЫ ЗАДАНИЙ
1. Задать одномерный массив, состоящий из Х элементов (Х задается преподавателем из диапазона [7..10]). Заполнить массив константами. Переместить заданный массив в другую область памяти, поменяв местами элементы с четными и нечетными номерами (поставив каждый элемент с четным номером на место нечетного элемента и каждый элемент с нечетным номером – на место четного)

а) элементы массива – однобайтовые;

б) элементы массива – двухбайтовые;

2. Задать одномерный массив, состоящий из Х элементов (Х задается преподавателем из диапазона [7..10]). Заполнить массив константами. Переместить в другую область памяти элементы с нечетными номерами

а) элементы массива – однобайтовые;

б) элементы массива – двухбайтовые;

3. Задать одномерный массив, состоящий из Х элементов (Х задается преподавателем из диапазона [7..10]). Заполнить массив константами. Переместить в другую область памяти элементы с четными номерами

а) элементы массива – однобайтовые;

б) элементы массива – двухбайтовые;

4. Задать одномерный массив, состоящий из Х элементов (Х задается преподавателем из диапазона [7..10]). Заполнить массив константами. Создать новый одномерный массив, поместив в него на место элементов с четными номерами элементы заданного массива с нечетными номерами и обнулив элементы нового массива с нечетными номерами

а) элементы массива – однобайтовые;

б) элементы массива – двухбайтовые;

5. Задать одномерный массив, состоящий из Х элементов (Х задается преподавателем из диапазона [7..10]). Заполнить массив константами. Создать новый одномерный массив, поместив в него на место элементов с нечетными номерами элементы заданного массива с нечетными номерами и заполнив элементы нового массива с четными номерами максимальными значениями констант

а) элементы массива – однобайтовые;

б) элементы массива – двухбайтовые.
6. КОНТРОЛЬНЫЕ ВОПРОСЫ
1. Каков синтаксис команд ассемблера?

2. Какие группы директив Вы знаете? Какие из директив обязательны в программе на ассемблере?

3. Что такое исполнительный адрес и как он используется при определении физического адреса операнда?

4. В чем заключается различие прямых и косвенных режимов адресации?



5. Как различить в командах ассемблера прямые и косвенные режимы адресации?

6. Какие режимы адресации Вы знаете?

Достарыңызбен бөлісу:




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет