Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...
Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...
Топ:
Особенности труда и отдыха в условиях низких температур: К работам при низких температурах на открытом воздухе и в не отапливаемых помещениях допускаются лица не моложе 18 лет, прошедшие...
Техника безопасности при работе на пароконвектомате: К обслуживанию пароконвектомата допускаются лица, прошедшие технический минимум по эксплуатации оборудования...
Интересное:
Национальное богатство страны и его составляющие: для оценки элементов национального богатства используются...
Отражение на счетах бухгалтерского учета процесса приобретения: Процесс заготовления представляет систему экономических событий, включающих приобретение организацией у поставщиков сырья...
Средства для ингаляционного наркоза: Наркоз наступает в результате вдыхания (ингаляции) средств, которое осуществляют или с помощью маски...
Дисциплины:
2020-11-19 | 110 |
5.00
из
|
Заказать работу |
|
|
Условная передача управления выполняется в зависимости от состояния битов регистра 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. В который предварительно нужно записать адрес нужного байта.
Составьте сегмент данных с кодами необходимыми для работы программы. Перед выводом символов выведите исходную строку на экран.
Откомпилируйте программу и проверьте результат ее работы.
|
|
Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...
Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...
Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...
Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!