Команды перехода

Как говорилось в начале главы, команды условного перехода — это то, что отличает фон-неймановский процессор от непроцессора или, в крайнем случае, от не фон-неймановского процессора. Большинство современных процессоров имеет обширный набор команд условного перехода по различным арифметическим условиям и их комбинациям.
Арифметические флаги выставляются в соответствии с результатами последней арифметической и логической операции. Типичный набор арифметических флагов — это бит переноса, бит нуля (выставляется, если все биты результата равны нулю), знаковый бит (если равен нулю старший бит результата) и бит переполнения. В процессорах первых поколений нередко использовался обратный подход: процессор имел всего один флаг условия перехода (так называемый ы-признак) и одну команду условного перехода, зато несколько команд сравнения, придававших этому флагу различную семантику.
Набор команд перехода, приведенный в табл. 2.1, несколько шире обычного — команды SBRC/SBRS для процессоров общего назначения нетипичны.
Микроконтроллеры PIC (по-видимому, самая экстравагантная система команд среди современных промышленно выпускаемых процессоров) имеют всего две команды, выполняющие функции команд условного перехода: BTFCS (Bit Test, Skip if Set — проверить бит и, если он установлен, пропустить следующую команду) и BTFCC (Bit Test, Skip if Clear, пропустить следую-шую команду, если бит сброшен). Объектом проверки может служить любой бит любого регистра процессора, в том числе и биты арифметических условий статусного слова. Для реализации условного перехода следом за такой командой нужно разместить команду безусловного перехода. Именно таким образом ассемблеры для этого микроконтроллера реализуют псевдокоманды условных переходов.

Таблица 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