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


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



ЗНАЕТЕ ЛИ ВЫ?

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

Поиск

Мнемоническое обозначение некоторых команд условного перехода отражает название флага, с которым они работают, и имеет следующую структуру: первым идёт символ “j” (jump, переход), вторым — либо обозначение флага, либо символ отрицания “n”, после которого стоит название флага.
Такая структура команды отражает ее назначение.
Если символа “n” нет, то проверяется состояние флага, и если он равен 1, производится переход на метку перехода.
Если символ “n” присутствует, то проверяется состояние флага на равенство 0, и в случае успеха производится переход на метку перехода.
Мнемокоды команд, названия флагов и условия переходов приведены в табл. 3.
Эти команды можно использовать после любых команд, изменяющих указанные флаги.


Таблица 3. Команды условного перехода и флаги

Название флага

Номер бита в eflags/flag

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

Значение флага для осуществления перехода

Флаг переноса cf

jc

cf = 1

Флаг четности pf

jp

pf = 1

Флаг нуля zf

jz

zf = 1

Флаг знака sf

js

sf = 1

Флаг переполнения of

jo

of = 1

Флаг переноса cf

jnc

cf = 0

Флаг четности pf

jnp

pf = 0

Флаг нуля zf

jnz

zf = 0

Флаг знака sf

jns

sf = 0

Флаг переполнения of

jno

of = 0

 

 

 

 

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

 


Пример вычисления выражения:

Анализ особенностей задачи.

Возможны две ситуации деления на ноль:

, если . Например, .

, если . Например, .

В то же время ситуация, когда , является допустимой.

Возможны ситуации переполнения.


Пример кода.

__asm{

     mov eсx , a; <eсx>=a

     mov ebx , b; <ebx>=b

     cmp eсx , ebx; сравнение a и b

     jg l_bigger; переход если a>b

     jl l_smaller; переход если a<b

     mov eax , 25;<eax>=25

     jmp exit; переход на конец программы

l_bigger:

     or ebx , ebx; сравнение b и 0

     jz errorZ; ошибка деление на ноль

     mov eax , eсx; <eax>=a

     cdq; подготовка деления <edx:eax> = a

     ; обработка ситуации «частное велико»

     idiv ebx; <eax> = a/b

     sub eax , 4; <eax> = a/b – 4

     jo errorOF

     jmp exit; переход на конец программы

l_smaller:

     or ecx , ecx; сравнение b и 0

     jz error; ошибка деление на ноль

     mov eax , ebx; <eax>=b

     imul ecx; <edx:eax> = b*b

     add eax , -5; добавление в младшую часть

                ; <eax> = b*b – 5

     adc edx , -1; коррекция старшей части

                ; <edx:eax> = b*b – 5

     ; обработка ситуации «частное велико»

     idiv ecx; < eax> = (b*b – 5)/a

     jmp exit

errorZ:  

errorOF: 

exit:    




Поделиться:


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

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