- •Лабораторная работа № 1
- •1. Цель и задача работы
- •2.1. Архитектура компьютера
- •2.2. Описание частей программы на языке ассемблера
- •2.3. Процедуры формирования исполняемой программы
- •3. Методика выполнения работы
- •4. Порядок выполнения работы
- •Контрольные вопросы
- •Лабораторная работа № 2 режимы адресации
- •1. Цель и задача работы
- •2. Основные теоретические сведения
- •3. Методика выполнения работы
- •4. Порядок выполнения работы
- •Контрольные вопросы
- •Варианты заданий
- •Лабораторная работа № 3 программирование ветвлений
- •1. Цель и задача работы
- •2. Основные теоретические сведения
- •2.1. Команды условного перехода
- •2.2. Команда безусловного перехода
- •3. Методика выполнения работы
- •4. Порядок выполнения работы
- •Контрольные вопросы
- •Варианты заданий
- •Лабораторная работа № 4 команды цикла и их использование в программах обработки
- •1. Цель и задача работы
- •2. Основные теоретические сведения
- •2.1. Арифметические операции над целыми числами
- •2.2. Организация циклов
- •3. Методика выполнения работы
- •4. Порядок выполнения работы
- •Контрольные вопросы
- •Варианты заданий
- •Лабораторная работа № 5 команды ввода-вывода на экран дисплея и их использование в программах обработки
- •1. Цель и задача работы
- •2. Основные теоретические сведения
- •2.1. Метод подъема
- •2.2. Команды прерывания
- •3. Методика выполнения работы
- •4. Порядок выполнения работы
- •Контрольные вопросы
- •Варианты заданий
- •Приложение в
1. Цель и задача работы
Целью работы является освоение режимов адресации структурных данных и закрепление навыков трансляции, компоновки и отладки программ.
Задача работы – разработка простой линейной программы.
2. Основные теоретические сведения
Смещение, которое вычисляется операционным блоком для доступа к находящемуся в памяти операнду, называется исполнительным адресом операнда. Этот исполнительный адрес показывает, на каком расстоянии (в байтах) от начала сегмента располагается искомый операнд.
В зависимости от используемого режима адресации получение исполнительного адреса может заключаться только в извлечении его как составной части исполняемой команды, а могут потребоваться дополнительные операции сложения составной части команды с содержимым других регистров.
Различают адресацию операндов:
- непосредственную, которая заключается в указании в команде самого значения операнда, а не его адреса;
прямую, предполагающую указание в команде непосредственно исполнительного адреса;
косвенную, при которой в команде указывается адрес регистра или ячейки памяти, в которых хранится адрес операнда или его составляющие;
неявную, когда адреса операндов в команде не указываются, а подразумеваются кодом операции.
Непосредственная адресация имеет место, если операнд-источник является константой или переменной, которой присвоено постоянное значение. Например:
MOV AX, 500 загружается значение 500 в РОН AX.
Следует отметить, что непосредственный операнд может быть задан простым выражением, в котором константы или идентификаторы констант связаны арифметическими операциями +, -, * или / (в таких выражениях не должно быть скобок). Например:
MOV AX, 156*10Н/2.
Следует помнить, что диапазон посылаемых чисел (значений непосредственного операнда) определяется вместимостью приемника - если это однобайтовый регистр (AH, AL, BL …), то в него можно посылать беззнаковые числа в диапазоне от 0 до 255, знаковые – от –128 до 127.
Регистровая адресация имеет место в командах, оперирующих с содержимым РОН или сегментных регистров в качестве одного или обеих операндов команды. Например, команда:
MOV DS, AX
копирует содержимое РОН АХ в сегментный регистр DS, при этом содержимое регистра AX не изменяется.
Обратите внимание! При использовании этого вида адресации в программах необходимо следить, чтобы разрядности обеих регистров были одинаковы.
Прямая адресация ячеек ОП имеет несколько вариантов:
прямая обычная характеризуется тем, что смещение является составной частью команды и не требует при формировании исполнительного адреса дополнительных регистров, иными словами. Обычно применяется, если операндом служит помеченная переменная, например:
MOV AX, SOURCE
загружает слово из ячейки памяти в регистр. При этом в памяти старший байт следует за младшим, а не предшествует ему. Это обусловлено тем, что в памяти ЭВМ старшая часть располагается в ячейках памяти со старшими адресами. Поэтому схема приведенной команды будет следующей:
Таблица 1
-
Смещение
Имя переменной
Значение
0000
SOURCE
ВВ
0001
АА
0002
SOURCE+2
После выполнения вышеуказанной команды пересылки регистр АХ будет содержать АХ=ААВВ;
прямая с индексированием использует арифметические операции для вычисления адреса. Покажем ее использование на примере следующих векторов (одномерных массивов):
BYTE_TBL DB 12,15,-54,-19,20
WORD_TBL DW -456, 50, 21, 654,-176,5,41.
Положим, требуется получить в РОН пятый байт из BYTE_TBL и второе слово из WORD_TBL. Такой результат можно получить выполнением команд:
MOV DL, BYTE_TBL[4]
MOV AX, WORD _TBL[4]
По первой из приведенных команд в DL попадет значение 20, по второй в AX будет перенесено значение 50.
Следует запомнить, что счет позиции элемента начинается с 1, а смещение считается с нуля, т.к. оно определяется относительно начала вектора!
Аналогичный результат получим, если выполним следующую последовательность команд:
MOV SI, 4
MOV DL, BYTE_TBL[SI]
MOV AX, WORD _TBL[SI].
Последний вариант записи команд является более универсальным, поскольку позволяет, например, осуществлять последовательную обработку элементов вектора путем наращивания значений в индексном регистре SI. Такая адресация операндов из оперативной памяти называется индексной, поскольку часть адреса операнда (смещение) находится в индексном регистре;
прямая с базированием отличается от индексной тем, что смещение операнда относительно начала структуры данных находится в базовом регистре ВХ:
MOV BX, 4
MOV DL, BYTE_TBL[ВХ];
прямая с индексированием и базированием использует базовый и индексный регистры для указания смещения, которое получается как сумма значений в обеих регистрах:
MOV SI, 4
MOV BX, 4
MOV AX, WORD _TBL [ВХ][SI].
Последняя команда будет пересылать в регистр АX значение из ячейки памяти с адресом WORD _TBL+4+4= WORD _TBL+8 (это пятое слово со значением –176). Возможна и такая форма записи команды: MOV AX, WORD _TBL [ВХ+SI].
Косвенная или непрямая адресация означает, что в команде указан регистр, в котором находится адрес операнда. Иными словами, подлежащее обработке значение можно получить после двух обращений: сначала из регистра извлекается адрес ячейки оперативной памяти, а затем по этому адресу извлекается сам операнд. Для такой адресации используются регистры BX, BP, SI, DI, указанные в квадратных скобках, что означает ”в качестве адреса брать содержимое того адреса, на который указывает заключенный в квадратные скобки регистр”.
Существует 2 варианта косвенной адресации ячеек ОП:
косвенная обычная, когда исполнительных адрес находится в регистре, например:
MOV BX, offset BYTE_TBL
MOV AH, [BX].
По этим командам в регистр AH будет занесено значение 12 (элемент вектора BYTE_TBL со смещением 0 относительно начала вектора).
Чтобы адрес-смещение переменной мог оказаться в регистре, используется команда пересылки вида
MOV <регистр> offset <имя переменной>
(между знаками <> должны быть вставлены конкретные значения).
Т.к. содержимое регистра легко изменить в ходе выполнения программы, данный способ адресации позволяет динамически назначить адрес операнда для некоторой машинной команды. Это свойство применяется для организации циклических вычислений и для работы со структурами данных типа таблиц и массивов;
косвенная с индексированием: от предыдущей отличается тем, что исполнительный адрес берется в виде суммы адресов, находящихся в базовом и индексном регистрах:
MOV AН, [BX+SI].
Адресация с базированием и индексированием очень полезна при работе с двумерными массивами и таблицами. В ней исполнительный адрес вычисляется как сумма значений базового регистра, индексного регистра и (возможно) сдвига, который указывается как непосредственное значение. В случае двумерного массива базовый адрес может содержать начальный адрес массива, а значения сдвига и индексного регистра могут содержать смещения по строке и столбцу. Допустимыми форматами команд являются следующие записи:
MOV AН, [BX+2+DI],
MOV AН, [DI+BX+2],
MOV AН, [BX+2][DI],
MOV AН, [BX+2+DI].
