Лекция № 4. Условные переходы. Арифметиченские команды. BCD числа. 


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



ЗНАЕТЕ ЛИ ВЫ?

Лекция № 4. Условные переходы. Арифметиченские команды. BCD числа.



Микропроцессор имеет 18 команд условного перехода, позволяющие проверить:

– отношение между операндами со знаком (больше-меньше);

– отношение между операндами без знака (выше-ниже);

– состояние арифметических флагов zf,sf, cf, of, pf.

Команды условного перехода имеют одинаковый синтаксис:

Jcc метка_перехода

 

Межсегментной передачи управления в условных переходах не допускается (максимальный переход равен размеру сегмента).

Источниками условия для перехода могут быть:

– любая команда, изменяющая состояние арифметических флагов;

– команда сравнения cmp;

– состояние регистра ecx/cx.

Команда cmp выполняет вычитание операторов и устанавливает флаги, не записывает результат вычитания на место первого операнда.

Cmp операнд_1, операнд_2

 

Значения аббревиатур в названии команды jcc:

 

 

Пример 7: сравним очередной элемент массива с 5:

 


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


Cmp x, y

Опкод Значение(переход,если...) Условие
JA Jump if above (X > Y) CF=0 & ZF=0
JAE Jump if above or equal (X >= Y) CF=0
JB Jump if below (X < Y) CF=1
JBE Jump if below or equal (X < Y) CF=1 or ZF=1
JC Jump if carry (cf=1) CF=1
JCXZ Jump if CX=0 регистр CX=0
JE (то же, что и JZ) Jump if equal (X = Y) ZF=1
JG Jump if greater (signed) (X > Y) ZF=0 & SF=OF
JGE Jump if greater or equal (signed) (X >= Y) SF=OF
JL Jump if less (signed) (X < Y) SF!= OF
JLE Jump if less or equal (signed) (X <= Y) ZF=1 or SF!=OF
JMP Безусловный переход -
JNA Jump if not above (X <= Y) CF=1 or ZF=1
JNAE Jump if not above or equal (X < Y) CF=1
JNB Jump if not below (X >= Y) CF=0
JNBE Jump if not below or equal (X > Y) CF=1 & ZF=0
JNC Jump if not carry (cf=0) CF=0
JNE Jump if not equal (X!= Y) ZF=0
JNG Jump if not greater (signed) (X <= Y) ZF=1 or SF!=OF
JNGE Jump if not greater or equal (signed) (X < Y) SF!=OF
JNL Jump if not less (signed) (X >= Y) SF=OF
JNLE Jump if not less or equal (signed) (X > Y) ZF=0 & SF=OF
JNO Jump if not overflow (signed) (of=0) OF=0
JNP Jump if no parity (pf=0) PF=0
JNS Jump if not signed (signed) (sf=0) SF=0
JNZ Jump if not zero (X!= Y) ZF=0
JO Jump if overflow (signed) (of=1) OF=1
JP Jump if parity (pf=1) PF=1
JP Jump if parity (pf=1) PF=1
JPE Jump if parity even PF=1
JPO Jump if parity odd PF=0
JS Jump if signed (signed) SF=1
JZ Jump if zero (X = Y) ZF=1

 

 


Пример 8: надо преобразовать строчные буквы в прописные. Строчным буквам в таблице ASCII символов соответствует диапазон 61h-7ah, прописным – 41h-5ah. Для выполнения преобразования между строчными и прописными буквами достаточно инвертировать 5 бит.

Например:

а – 01100001 z – 01111010

А – 01000001 Z – 01011010

 

Таблица ASCII кодов.

                      A B C D E F
  ... ...     @ P ' Р А Р а ... ... ... р Ё
  ... ... !   A Q a Q Б С б ... ... ... с ё
  ... ... "   B R b R В Т в ... ... ... т Є
  ... ... #   C S c S Г У г ... ... ... у є
  ... ... $   D T d T Д Ф д ... ... ... ф Ї
  ... ... %   E U e U Е Х е ... ... ... х ї
  ... ... &   F V f V Ж Ц ж ... ... ... ц Ў
  ... ... '   G W g W З Ч з ... ... ... ч ў
  ... ... (   H X h X И Ш и ... ... ... ш °
  ... ... )   I Y i Y Й Щ й ... ... ... щ
A ... ... * : J Z j Z К Ъ к ... ... ... ъ ·
B ... ... + ; K [ k { Л Ы л ... ... ... ы
C ... ... , < L \ l | М Ь м ... ... ... ь
D ... ... - = M ] m } Н Э н ... ... ... э ¤
E ... ... . > N ^ n ~ О Ю о ... ... ... ю
F ... ... / ? O _ o ¤ П Я п ... ... ... я  

 

 


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

Регистр есх/сх выполняет роль счётчика в командах управления циклами и при работе с цепочками символов.

Синтаксис этой команды таков:

– Jcxz метка_перехода (Jump if is zero) – прыжок, если сх ноль;

– jecxz метка_перехода (Jump equal ecx zero) – переход, если есх ноль.

 

В отличие от других команд условной передачи управления, команды Jcxz/ jecxz могут адресовать только короткие переходы – на -128 байт или на +127 байт от следующей за ней командой.

 


Организация циклов

В системе команд микропроцессора существует три команды для работы с циклами. Данные команды:

1) loop метка_перехода – повторить цикл. Работа команды заключается в выполнении следующих действий:

а) декремента регистра есх/сх;

б) сравнение регистра есх/сх с нулём;

если (есх/сх)>0, то управление передаётся на метку перехода;

если (есх/сх)=0, то управление передаётся на следующую после loop команду;

 

2) loope/loopz метка_перехода – повторить цикл пока сх=0 или zf=0. Команды loope и loopz – абсолютные синонимы. Работа команд заключается в выполнении следующих действий:

а) декремента регистра есх/сх;

б) сравнение регистра есх/сх с нулём;

в) анализа состояния флага нуля zf;

если (есх/сх)>0, и zf=1, управление передаётся на метку перехода;

если (есх/сх)=0, или zf=0, управление передаётся на следующую после loop команду;

 

3) loopne/loopnz метка_перехода – повторить цикл пока сх<>0 или zf=1. Команды loope и loopz – абсолютные синонимы. Работа команд заключается в выполнении следующих действий:

а) декремента регистра есх/сх;

б) сравнение регистра есх/сх с нулём;

в) анализа состояния флага нуля zf;

если (есх/сх)>0, и zf=0, управление передаётся на метку перехода;

если (есх/сх)=0, или zf=1, управление передаётся на следующую после loop команду;

 

Команды loop loope/loopz и loopne/loopnz реализуют только короткие переходы (от -128 до _127 байтов). Для работы с длинными циклами необходимо использовать команду jmp.

 


При работе с вложенными циклами возникает проблема сохранения значения счётчика внешнего цикла есх/сх на время выполнения внутреннего цикла. Для этого можно использовать регистры, ячейки памяти или стек.

Пример программы, содержащей три цикла вложенных один в другой.

 



Поделиться:


Последнее изменение этой страницы: 2016-09-13; просмотров: 529; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

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