Как говорилось в начале главы, команды условного перехода — это то,
что отличает фон-неймановский процессор от непроцессора или, в крайнем
случае, от не фон-неймановского процессора. Большинство современных процессоров
имеет обширный набор команд условного перехода по различным арифметическим
условиям и их комбинациям.
Арифметические флаги выставляются в соответствии с результатами последней
арифметической и логической операции. Типичный набор арифметических флагов
— это бит переноса, бит нуля (выставляется, если все биты результата равны
нулю), знаковый бит (если равен нулю старший бит результата) и бит переполнения.
В процессорах первых поколений нередко использовался обратный подход:
процессор имел всего один флаг условия перехода (так называемый ы-признак)
и одну команду условного перехода, зато несколько команд сравнения, придававших
этому флагу различную семантику.
Набор команд перехода, приведенный в табл. 2.1, несколько шире обычного
— команды SBRC/SBRS для процессоров общего назначения нетипичны.
Микроконтроллеры PIC (по-видимому, самая экстравагантная система команд
среди современных промышленно выпускаемых процессоров) имеют всего две
Таблица 2.1. Команды условного перехода микроконтроллеров семейства AVR, цит. по [www.atmel.com]
Команда
|
Описание
|
Условие перехода
|
SBRC Rr, b
|
Пропустить, если бит в регистре сброшен
|
if (Rr(b)=0) PC = PC + 2 or 3
|
SBRS Rr, b
|
Пропустить, если бит в регистре установлен
|
if (Rr(b)=1) PC = PC + 2 or 3
|
SBIC P, b
|
Пропустить, если бит в регистре В/В сброшен
|
if (I/0(P,b)=0) PC = PC + 2 or 3
|
SBIS P, b
|
Пропустить, если бит в регистре В/В установлен
|
if (I/0(P,b)=l) PC = PC + 2 or 3
|
BRBS s, k
|
Перейти, если статусный флаг установлен
|
if (SREG(s) =1) PC = PC+k + 1
|
BRBC s, k
|
Перейти, если статусный флаг сброшен
|
if (SREG(s) =0) PC = PC+k + 1
|
BREQ k
|
Перейти, если равно
|
if (Z = 1} PC = PC + k + 1
|
BRNE k
|
Перейти, если не равно
|
if (Z=0) PC = PC + k + 1
|
BRCS k
|
Перейти, если перенос установлен
|
if (C = 1) PC = PC + k + 1
|
BRCC k
|
Перейти, если перенос сброшен
|
if (C = 0) PC = PC + k + 1
|
BRSH k
|
Перейти, если равно или выше
|
if (C = 0) PC = PC + k + 1
|
BRLO k
|
Перейти, если ниже
|
if (C = 1) PC = PC.+ k + 1
|
BRMI k
|
Перейти, если минус
|
if (N = 1) PC = PC + k + 1
|
BRPL k
|
Перейти, если плюс
|
if (N = 0) PC = PC + k + 1
|
BRGE k
|
Перейти, если больше или равно, знаковое
|
if (N XOR V= 0) PC = PC+ k + 1
|
BRLT k
|
Перейти, если меньше, знаковое
|
if (N XOR V= 1) PC = PC + k + 1
|
BRHS k
|
Перейти, если полубайтовый перенос установлен
|
if (H = 1) PC = PC + k + 1
|
BRHC k
|
Перейти, если полубайтовый перенос сброшен
|
if (H = 0) PC = PC + k + 1
|
BRTS k
|
Перейти, если Т-флаг установлен
|
if (T = 1) PC = PC + k + 1
|
BRTC k
|
Перейти, если Т-флаг сброшен
|
if (T = 0) PC = PC + k + 1
|
BRVS k
|
Перейти, если флаг переполнения установлен
|
if (V = 1) PC = PC + k + 1
|
BRVC k
|
Перейти, если флаг переполнения сброшен
|
if (V = 0) PC = PC + k + 1
|
BRIE k
|
Перейти, если прерывания разрешены
|
if (1 = 1) PC = PC + k + 1
|
BRID k
|
Перейти, если прерывания запрещены
|
if (1 = 0) PC = PC + k + 1
|