Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
вопросы по экзамену(Асемблер).doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
350.72 Кб
Скачать

34 Вопрос

LOOP

(LOOP control by register cx)

Управление циклом по cx

 

Схема команды: 

loop метка 

Назначение: организация цикла со счетчиком в регистре cx.

Синтаксис Алгоритм работы:

выполнить декремент содержимого регистра ecx/cx;

анализ регистра ecx/cx:

если ecx/cx=0, передать управление следующей за loop команде;

если ecx/cx=1, передать управление команде, метка которой указана в качестве операнда loop.

Применение: Команду loop применяют для организации цикла со счетчиком. Количество повторений цикла задается значением в регистре ecx/cx перед входом в последовательность команд, составляющих тело цикла

35 Вопрос

Описание инициализации массивов в программе.

Массив в программе на языке ассемблер может создаваться одним из нескольких способов

1. перечисление элементов массива в поле операндов одной из директив описания данных

При перечислении элементы разделяются запятыми

Пример:

;массив из 5 элементов : размер каждого элемента 4 байта

Mas dd 1,2,3,4,5

Используя оператор повторения dup

Например

; массив из 5 элементов размер каждого 2 байта

Mas dw 5 dup (0)

Доступ к элементам массива

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

В языке ассемблер индексы массивов обычные адреса. Нумерация элементов массива в ассемблере начинается с нуля. В общем случае для получения адреса элемента необходимо начальный адрес массива сложить с произведением индекса (номер элемента 1) этого элемента на размер элемента массива

База+(индекс*размер элемента)

40 Вопрос

Обработка массива производится в сегменте кода, где определяется, что некоторую область памяти необходимо трактовать как двумерный массив. При этом расположение элементов двумерного массива памяти может быть как по строкам, так и по столбцам. Если последовательность однократных элементов памяти трактуется как двумерный массив расположенный по строкам, то адрес элемента (i,j) вычисляется по формуле

База + количество элементов в строке * размер элемента * i+j

Где i=0….n-1

J=0….m-1

37 Вопрос

Обработка строк

Для работы со строками, или цепочками символов или чисел (т.е. попросту говоря, с массивами произвольных данных) в МП предусмотрен ряд специальных команд:

movs - пересылка строки; cmps - сравнение двух строк; seas - поиск в строке заданного элемента; lods - загрузка аккумулятора (регистров AL или АХ) из строки; stos - запись элемента строки из аккумулятора (регистров АХ или AL).

Эти команды очень удобны, однако их использование сопряжено с некоторыми трудностями, так как процессор, выполняя эти команды, неявным образом использует ряд своих регистров. Только если все эти регистры настроены должным образом, команды будут выполняться правильно. В результате включение в программу предложения с командой, например, movs, требует иной раз 6-7 дополнительных предложений, в которых осуществляется подготовка условий для правильного выполнения этой команды. Хотя команды обработки строк, как правило, включаются в программу без явного указания операндов, однако каждая команда, в действительности, использует два операнда. Для команд seas и stos операндом-источником служит аккумулятор, а операнд-приемник находится в памяти. Для команды lods, наоборот, операнд-источник находится в памяти, а приемником служит аккумулятор. Наконец, для команд movs и cmps оба операнда, и источник, и приемник, находятся в памяти. Все рассматриваемые команды, выполняя различные действия, подчиняются одинаковым правилам, перечисленным ниже. Операнды, находящиеся в памяти, всегда адресуются единообразно: операнд-источник через регистры DS:SI, а операнд-приемник через регистры ES:DI. При однократном выполнении команды обрабатывают только один элемент, а для обработки строки команды должны предваряться одним из префиксов повторения. В процессе обработки строки регистры SI и DI автоматически смещаются по строке вперед (если флаг DF = 0) или назад (если флаг DF = 1), обеспечивая адресацию последующих элементов. Каждая команда имеет модификации для работы с байтами или словами (например, movsb и movsw). Таким образом, для правильного выполнения команд обработки строк необходимо (в общем случае) предварительно настроить регистры DS:SI и ES:DI, установить или сбросить флаг DF, занести в СХ длину обрабатываемой строки, а для команд seas и stos еще поместить операнд-источник в регистр АХ (или AL при работе с байтами). Однако сама операция, после всей этой настройки, осуществляется одной командой, которая обычно даже не содержит операндов, хотя может иметь префикс повторения. Стоит подчеркнуть, что строки, обрабатываемые рассматриваемыми командами, могут находиться в любом месте памяти: в полях данных программы, в системных областях данных, в ПЗУ, в видеобуфере. Например, с помощью команды movs можно скопировать массив данных из одной массивной переменной в другую, а можно переслать страницу текста на экран терминала. Рассмотрим несколько примеров использования команд обработки строк, ограничившись лишь теми фрагментами программ, которые имеют отношение к рассматриваемому вопросу.