PersCom — Компьютерная Энциклопедия Компьютерная Энциклопедия

Процессор

Проверка условий, флаги и набор команд ветвления

Сравнение в ЭВМ используется для организации последующего ветвления алгоритма (условного перехода в программе) в зависимости от результата сравнения. Сравнение можно производить по условиям:

  • а) равно / неравно;
  • б) больше / меньше.

Условие а) всегда осмысленно и формально означает, что все биты сравниваемых операндов одинаковы. Семантика условия б) понятна для данных, которые неким образом упорядочены, таких, как числа или символы алфавита. Для такого вида данных, как битовые поля, не всегда понятно, что такое "больше / меньше".

Сравнение в процессоре происходит по одной из двух схем:

  1. Сравнение операнда с нулем (его можно произвести специальной командой “проверка”: в системе команд х86 — команда test a, b).
  2. Сравнение двух операндов между собой (вычитанием и последующим сравнением результата с нулем)

Для сравнения двух чисел можно использовать команды вычитания. Кроме того, обычно в системе команд есть специальные команды для сравнения. В i*86 это команда cmp a,b — она делает вычитание a — b, по результату операции модифицируются все 4 основных флага — cf, of, zf, sf, после чего результат вычитания теряется, а операнды сохраняются неизменными.

Для сравнения с нулем есть специальные команды "проверить операнд" (в i*86 — команда test a, b), а, кроме того, — флаги zf и sf могут устанавливаться при выполнении других команд (таких, как загрузки и пересылки).

После выполнения команды, осуществляющей сравнение (и переустанавливающей флаги), надо осуществить ветвление. Для этого в процессоре обычно существует большая группа команд условного ветвления, которое происходит (или нет) в зависимости от состояний тех или иных флагов. В группе команд ветвления можно выделить три подгруппы (Таблица 1, Таблица 2, Таблица 3).

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

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