Изучение системы команд Ассемблера. Команды безусловных и условных переходов 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Изучение системы команд Ассемблера. Команды безусловных и условных переходов



Практическое занятие № 13

«Изучение системы команд Ассемблера. Команды безусловных и условных переходов»

 

Цель работы: изучить состав регистра флагов, изучить способы организации ветвящихся циклов с помощью команд условных и безусловных переходов.

 

Образовательные результаты, заявленные в ФГОС:

Студент должен уметь:

производить инсталляцию и настройку программного обеспечения компьютерных систем;

 

знать:

основные компоненты программного обеспечения компьютерных систем.

 

Регистр флагов фиксирует в своих разрядах текущее состояние процессора, результат выполнения операции, текущие режимы управления. Бит устанавливается в 1 при определенных условиях или установка его в 1 изменяет поведение процессора.

CF – флаг переноса. Устанавливается в 1, если результат предыдущей операции не уместился в приемнике и произошел перенос из старшего бита или если требуется заем (при вычитании), иначе устанавливается в 0. Например, после сложения байта FFh и 1, если регистр, в который надо поместить результат, – байт, в него будет записано 00h и флаг CF = 1.

PF – флаг четности. Устанавливается в 1, если младший байт результата предыдущей команды содержит четное число бит, равных 1; устанавливается в 0, если число единичных бит нечетное. Это не то же самое, что делимость на два. Число делится на два без остатка, если его самый младший бит равен нулю, и не делится, если он равен 1.

AF – флаг полупереноса или вспомогательного переноса. Устанавливается в 1, если в результате предыдущей операции произошел перенос (или заем) из третьего бита в четвертый.

ZF – флаг нуля. Устанавливается в 1, если результат предыдущей команды – ноль.

SF – флаг знака. Этот флаг всегда равен старшему биту результата.

TF – флаг ловушки. Этот флаг был предусмотрен для работы отладчиков, не использующих защищенный режим. Установка его в 1 приводит к тому, что после выполнения каждой команды программы управление временно передается отладчику.

IF – флаг прерываний. Установка этого флага в 1 приводит к тому, что процессор перестает обрабатывать прерывания от внешних устройств. Обычно его устанавливают на короткое время для выполнения критических участков кода.

DF – флаг направления. Этот флаг контролирует поведение команд обработки строк – когда он сброшен в 0, строки обрабатываются в сторону увеличения адресов, а когда DF=1 – наоборот.

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

Команды переходов

Команда безусловного перехода JMP address (jump – прыжок) позволяет передать управление на адрес address (осуществить переход на метку) независимо от значений каких-либо флагов. Метка может находиться на любом расстоянии (в байтах) от точки расположения команды JMP и даже в другом сегменте памяти.

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

Всякая команда условного перехода (обозначим её в общем виде Jcc address) выполняется следующим образом: проверяется регистр флагов; если состояние флагов отвечает определённым условиям, то осуществляется переход на адрес address (на указанную в команде метку). В противном случае выполняется следующая по порядку команда.

В использованном выше обозначении под «cc» подразумевается Condition Code – «код условия». В реальных мнемокодах команд (таблица 6.1) при сравнении чисел со знаком используются буквы G (Greater – больше) и L (Less – меньше), без знака – A (Above – выше) и B (Below – ниже). Условие равенства обозначается буквой E (Equal), невыполнение какого-либо условия – буквой N (Not).

Команды условных переходов могут передавать управление лишь на -128…+127 байт от точки своего расположения. При необходимости более дальних переходов приходится организовывать их сочетания с командой JMP.

 

Таблица 13.1 – Команды условных и безусловных переходов

Мнемокод Условие Значение флагов

Для данных со знаком

JL Меньше SF xor OF=1
JNL Не меньше SF xor OF=0
JG Больше (SF xor OF) or ZF=0
JNG Не больше (SF xor OF) or ZF=1

Для данных без знака

JB Меньше (ниже) CF=1
JNB Не меньше (не ниже) CF=0
JA Больше (выше) CF or ZF=0
JNA Не больше (не выше) CF or ZF=1

Прочие

JE или JZ Равно или нуль ZF=1
JNE или JNZ Не равно или не нуль ZF=0
JS По минусу SF=1
JNS По плюсу SF=0
JO По переполнению OF=1
JNO По отсутствию переполнения OF=0
JMP Безусловный переход Не зависит от флагов
JCXZ Переход по нулю в регистре СХ  

 

Примечания:

- термины «выше» и «ниже» применимы для сравнения беззнаковых величин (адресов), термины «больше» и «меньше» используются при учете знака числа;

- слова xor и or обозначают соответствующие логические операции (xor – исключающее или, or – или).

Команды сравнения

Команда CMP (to compare – сравнивать) служит для сравнения двух операндов путём вычитания первого операнда из второго (op2-op1). В отличие от обычного вычитания, полученная разность нигде не сохраняется (значения операндов остаются неизменными); результатом команды являются только значения флагов в регистре флагов. Как правило, сразу за командой CMP в программе ставится какая-нибудь из команд условных переходов, анализирующая эти флаги.

Команда SCAS, SCASB (scan string) используется для так называемого «сканирования» одной строки в поисках нужного элемента (слова или байта). В процессе работы команды осуществляется сравнение элемента строки, расположенного по адресу в ES:DI, со значением в регистре AX (или AL) путём вычитания; результат вычитания не фиксируется, но устанавливаются соответствующие флаги. Как и при выполнении прочих строковых команд, производится автоинкрементирование (либо автодекрементирование) регистра DI.

Команда CMPS, CMPSB (compare strings) осуществляет поэлементное сравнение элементов двух строк (слов или байтов), одна из которых расположена в памяти по адресу в регистрах DS:SI, вторая – по адресу в ES:DI. При выполнении этой команды производится вычитание элемента строки с адресом в SI из элемента строки с адресом в DI; как и в обычной команде CMP, результат вычитания никуда не записывается, но зато устанавливаются соответствующие флаги (наиболее важным в данной ситуации является флаг ZF).

 

Пример программы

Дан массив из десяти слов, содержащих целые числа. Требуется найти максимальное значение в массиве, расположенном по адресу DS:0000h.

MOV SI, 0000h; зададим начальный адрес

LODS          ; первый элемент массива загружается в AX

   MOV BX, AX; копируем это значение в ВХ, считая его

                               максимальным

MOV CX, 9 ; установим счётчик повторений цикла (одно

                              число мы обработали)

BEG:

CMP AX, BX; сравниваем текущее значение с максимальным

JL NO          ; если он меньше, переходим на метку NO

MOV BX, AX; если больше или равен, копируем его в ВХ

NO:

LODS          ; загружаем следующий элемент массива в АХ

LOOP BEG ; переход на начало цикла, пока СХ не равно 0.

 

Задания для практической работы

 

1 Составить таблицу «Регистр флагов» с указанием флага и его назначения.

2 Составить таблицу «Команды переходов» с указанием названия команды, ее мнемокода и значений флагов.

3 Разработать программу на языке Ассемблер для выполнения задачи в соответствии с вариантом.

 

 

 

Таблица 13.2 – Таблица вариантов

Вариант Задача
1 Дан массив из 10 байтов. Найти количество отрицательных чисел. Ответ записать в регистр DX.
2 Дан массив из 5 слов. Найти сумму всех отрицательных чисел. Ответ записать в регистр DX.
3 Дан массив из 8 байт. Сформировать другой массив по адресу ES:0010h, заменив все отрицательные числа нулями.
4 Дан массив из 10 байт. Найти разность максимального и минимального значения. Ответ записать в регистр DX.
5 Дан массив из 9 слов. Найти среднее арифметическое ненулевых элементов. Ответ записать в регистр DX.
6 Дан массив из 6 слов. Найти количество четных элементов. Ответ записать в регистр DX.
7 Дан массив из 10 байт. Сформировать другой массив по адресу ES:0050h, в который нечетные элементы из первого массива переписать без изменений, а четные – увеличить на 1.
8 Дан массив из 15 байт. Определить количество чисел, больших 6. Ответ записать в регистр DX.
9 Дан массив из 10 байт. Подсчитать количество элементов, кратных 3. Ответ записать в регистр DX.
10 Дан массив из 20 байт. Найти среднее арифметическое квадратов четных чисел. Ответ записать в регистр DX.

 

Примечание: массив байтов размещается, начиная с адреса DS:0000h.

Контрольные вопросы

 

1 Что такое регистр флагов? Для чего он используется?

2 Опишите работу команды JMP.

3 Для чего используются команды условных переходов?

4 Как работают команды сравнения? Какие команды к ним относятся?



Поделиться:


Последнее изменение этой страницы: 2020-03-27; просмотров: 232; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.190.160.221 (0.02 с.)