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



ЗНАЕТЕ ЛИ ВЫ?

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

Поиск

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

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

– 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.

 


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

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

 


Сложение двоичных чисел без знака

Если при сложении результат превышает размерность поля операнда, то результат оказывается неверным. Например: 254+5=259 (11111110+0000101=1 00000011). Для фиксирования ситуации выхода за разрядную сетку результата предназначен флаг переноса cf. Поэтому после операции сложения в программе предполагается включение участков кода, в которых анализируется флаг cf. Это можно сделать с помощью команды условного перехода jc <метка>.

 

В системе команд микропроцессора имеются три команды двоичного сложения:

– INC <операнд>; операция инкремента, то есть увеличение значения операнда на 1.

– ADD <операнд_1><операнд_2>;

Принцип действия:

операнд_1=операнд_1+операнд_2.

В этой команде нельзя использовать переменную одновременно и для опернда_1, и для операнда_2. Команда ADD не различает числа со знаком и без знака.

– ADC <операнд_1><операнд_2>; команда сложения с учётом флага переноса cf.

Принцип действия:

операнд_1=операнд_1+операнд_2+значение_cf.

 

Имеющиеся варианты приёмника и источник:

Операнд_1 Операнд_2 пример
регистр регистр add ecx, edx
регистр память add ecx, dword ptr [104h]/add ecx, [edx]
регистр значение add eax, 102
память значение add dword ptr [401231h], 80
память регистр add dword ptr [401231h], edx

Сложим, например, два 64-битных целых числа: одно число находится в регистрах EDX:EAX, а другое в регистрах ЕВХ:ЕСХ:

Add eax,ecx

Adc edx,ebx

Если при сложении младших двойных слов произошел перенос из старшего разряда (флаг CF=1), то он будет учтен следующей командой ADC.

 

Вычислим сумму 254+17 в регистр ах. При этом известно, что результат сложения выходит за границы операнда.

 

– XADD <операнд_1><операнд_2>; выполняет команду «обменять между собой и сложить».

Выполняет сложение, помещает содержимое операнд_1 в операнд_2, — сумму операндов — в операнд_1. Операнд_2 всегда регистр, операнд_1 может быть регистром и переменной.




Поделиться:


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

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