
- •36 Вопрос
- •15 Вопрос
- •9Вопрос
- •5 Вопрос
- •8 Вопрос
- •9 Вопрос
- •10Вопрос
- •14 Вопрос
- •15 Вопрос
- •16Вопрос
- •22 Вопрос
- •12 Вопрос
- •13 Вопрос
- •15 Вопрос
- •16 Вопрос
- •17 Вопрос
- •1 Вопрос
- •19 Вопрос
- •52 Вопрос
- •21 Вопрос
- •30 Вопрос
- •21 Вопрос
- •25 Вопрос
- •22 Вопрос
- •23 Вопрос
- •24 Вопрос
- •25 Вопрос
- •26 Вопрос
- •27 Вопрос
- •32 Вопрос
- •29 Вопрос
- •30 Вопрос
- •35 Вопрос
- •37 Вопрос
- •34 Вопрос
- •35 Вопрос
- •40 Вопрос
- •37 Вопрос
- •46 Вопрос
- •50Вопрос
- •42Вопрос
- •43 Вопрос
- •44 Вопрос
- •44 Вопрос
- •42 Вопрос
- •54 Вопрос
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 можно скопировать массив данных из одной массивной переменной в другую, а можно переслать страницу текста на экран терминала. Рассмотрим несколько примеров использования команд обработки строк, ограничившись лишь теми фрагментами программ, которые имеют отношение к рассматриваемому вопросу.