Краткие теоретические и учебно-методические материалы по теме практической работы




Регистр флагов фиксирует в своих разрядах текущее состояние процессора, результат выполнения операции, текущие режимы управления. Бит устанавливается в 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.

 

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

Мнемокод Условие Значение флагов
     
Для данных со знаком
JL Меньше SF xor OF=1
JNL Не меньше SF xor OF=0
Окончание таблицы 8.1
     
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.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-03-31 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: