Условная передача управления — КиберПедия 

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Условная передача управления

2020-11-19 109
Условная передача управления 0.00 из 5.00 0 оценок
Заказать работу

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

Формат команды:

CMP – сравнение двух аргументов и установка флагов процессора.

CMP R,A

CMP R1,R2

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

Команда выполняет вычитание второго операнда из первого, и при этом изменяются значения флагов CF, ZF, SF и ОF.

Кроме того значения битов регистра флагов изменяются при выполнении команд вычисления значений кодов.

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

Таблица 6.1

Команды условного перехода

Номер команды Команда Бит Описание
1 JZ ZF=1 Получено нулевое значение
2 JNZ ZF=0 Нет нулевого значения
  JO OF=1 Переполнение в результате выполнения команды вычисления значения
4 JN OF=0 Нет переполнения
5 JS SF=1 Результат выполнения команды отрицательное число
6 JNS SF=0 Число положительное
7 JE ZF=1 Сравниваемые коды равны
8 JNE ZF=0 Коды не равны
9 JA CF=0;ZF=0   Один код большего другого, используется при сравнении без знаковых кодов.
10 JB CF=1 Код меньше. Используется при сравнении без знаковых кодов.
11 JL SF<>OF Код меньше
12 JG ZF=0;SF=OF Код больше
13 JLE ZF=1;SF<>OF Код меньше, либо равен
14 JGE SF=OF Код больше, либо равен
15 JC CF=1 Заем единицы при вычислениях
16 JNC CF=0 Нет заёма при вычислениях

        

Пример. Проверка равенства кода в регистре определенному значению.

cmp AX,90

je ok; Да, равно!

Упражнение 6.2. Дано два машинных слова n1 и n2. Требуется определить, в каком из этих машинных слов записан больший положительный код.

Код проверки машинных слов примет вид:

mov eax, dword [n1];Загрузка кода первого слова

cmp ax, [n2]       ;Загрузка кода второго слова

jb lt   ;Второй код больше

ja gt   ;Первый код больше

jmp eqv;Коды равны

lt:

 ;Сообщение – первый вариант   

 mov ecx,mes_max1;n2 > n1

 jmp fin;Завершить работу

gt:

 ;Сообщение – второй вариант

mov ecx,mes_max2;n1 > n2

jmp fin;Завершить работу

eqv:

  Сообщение о равенстве кодов   

mov ecx,mes_eq;n1 = n2

fin:

;Вывод сообщения и выход в ОС

Создайте сегмент данных в котором определите два слова с кодами и три варианта контрольных сообщений с одинаковыми количеством символов. Откомпилируйте программу. Проверьте разные значения кодов.

Сканирование строк

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

Для сканирования байтов строк можно использовать команды CMPSB и SCASB.

Команда CMPSB

Команда используется для сравнения кодов байтов двух строк. Байты строк сравниваются по парно. Формат команды:

ESI – адрес первой строки.

EDI – адрес второй строки.

ECX= n – количество пересылаемых байтов.

Команда вызывается с повторителями REPE ( повторять пока коды байтов равны), REPNE ( повторять пока коды байтов неравны).

Перед сканированием обычно выполняют командой CLD сброс флага направления DF.

Результат сканирования проверяется командами условного перехода. Если команда выполнялась с повторителем REPE и все сканированные байты хранят одинаковый код, то будут выполнены команда условного перехода JE или JZ (ZF=1).

Если команда выполняется с повторителем REPNE, и будет найдена пара байтов с одинаковым кодом, то выставляется флаг ZF = 1 и можно также использовать команды условного перехода JE или JZ.

Результат сканирования можно проверять с помощью команд JNE, JNZ (ZF = 0).

Сравнение происходит путем вычитания кодов второго операнда строки из первого.

Упражнение 6.3. Требуется написать программу для поиска одинакового  байта у двух строк mes1 = “ABCDEFG” и mes2 = “012D567”. Если строки содержат общий байт, программа выводит контрольное сообщение.

Код сравнения строк примет вид:

mov esi,mes1;Адрес первой строки

mov edi,mes2;Адрес второй строки

mov ecx,n;Число сравниваемых байтов

cld;Флаг направления DF = 0

repne cmpsb;Сравнивать байты пока не равны

je ok;Есть общий байт ZF = 1?

jmp fin;Нет — конец работы

ok:;Да — вывести контрольное сообщение

mov eax,4

mov ebx,1

mov ecx,ok_mes;Контрольное сообщение

mov edx,l_ok;Число байтов сообщения

int 0x80

;Завершение работы программы

fin:;Завершение работы

mov eax,1

mov ebx,0

int 0x80

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

Команда SC ASB

Команда позволяет отыскать байт, код которого записан в регистр EAX или AL в строке, адрес которой записан в регистр EDI. В регистр ECX записывается количество байтов, которые нужно просканировать в тестируемой строке.

Команда вызывается с повторителями REP и REPNE. Правила проверки результата сканирования аналогичные для команды CMPSB.

Упражнение 6.4. Поиск символа в строке байтов. Дана строка mes1 и контрольный байт - символ sym. Требуется определить наличие байта в строке и ввести сообщение о его наличии.

Код поиска символов в строке примет вид:

mov edi,mes1;Адрес тестируемой строки

mov eax, dword [sym];Искомый символ

mov ecx,n;Число сканируемых символов строки

repne scasb;Искать символ

jne err_ex;Символа нет ZF = 0! 

mov eax,4;Символ есть ZF = 1!

mov ebx,1;Вывести контрольное сообщение

mov ecx,ok_mes;Контрольное сообщение

mov edx,l_ok;Число байтов сообщения

int 0x80

;Завершение работы программы

err_ex:

mov eax,1

xor ebx,ebx

int 0x80

Задайте в сегменте данных контрольную строку и символ. Составьте контрольное сообщение. Откомпилируйте программу и проверьте различные варианты ее работы.

Команда STOSB

Данная команда используется для занесения байта, который записан в регистр AL в строку по адресу, который хранится в регистре EDI. Команда может выполняться с повторителем REP, число вызовов команды должно быть записано в регистр ECX.

Упражнение 6.5. В сегменте данных задан символ и строка.

sym db 'A'

msg db 'Hello World!',0xA

Требуется заменить первые пять символов строки на заданный символ. Команды, необходимые для выполнения замены примут вид:

 mov al,[sym];Запись кода символа

 mov edi,msg;Адрес строки

 mov ecx,5;Число повторов команды

 cld;DF = 0

 rep stosb;Записать символ в строку

При использовании команды следует учитывать значение флага DF. Если DF = 0, то каждое выполнение команды увеличивает значение адреса в регистре EDI. При DF = 1 это значение уменьшается.

Выведите исходную строку и результат преобразования строки.

Команда LODSB

Данная команда позволяет загружать символ в регистр AL из строки. Выбираемый символ из строки адресуется регистром ESI. Правило приращения адреса в регистре ESI, зависит от состояния флага DF.

Упражнение 6.6. В сегменте данных программы задана строка. Требуется вывести ее посимвольно на экран терминала. Каждый символ выводится на отдельной строке.

Для решения это задачи следует в сегмент данных добавить буфер buf из двух байтов. В первый байт этого буфера будет записываться извлеченный из строки символ. А второй байт оставим без изменения. Он будет хранить код LF для перемещения курсора в окне терминала на следующую строку.

Содержание сегмента кода примет вид:

mov esi,msg      ;Адрес исходной строки

mov ecx,msg_size;Число байтов в исходной строке

dec ecx     ;Коррекция числа байтов

cld         ;DF = 0

mov ebx,buf;EBX > адрес буфера

go:

lodsb             ;Символ в AL

mov [ebx],byte al;Символ в буфер

mov eax,4;Вызов write

push ebx  ;Сохранить адрес строки

mov ebx,1;Вывод на консоль

push ecx  ;Сохранить число шагов

mov ecx,buf;Адрес буфера с символом

mov edx,n   ;Число символов в буфере

int 0x80    ;Вывести символ

pop ecx     ;Восстановить число шагов

pop ebx     ;Восстановить адрес

mov ebx,buf;Адрес буфера

loop go

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

Составьте сегмент данных с кодами необходимыми для работы программы. Перед выводом символов выведите исходную строку на экран.

Откомпилируйте программу и проверьте результат ее работы.


Поделиться с друзьями:

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

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

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

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.026 с.