| Команди переходу
Як говорилося на початку глави, команди умовного переходу — це те, що відрізняє нейманівський для
фону процесор від непроцессора або, в крайньому випадку, від
не нейманівського для фону процесора. Більшість сучасних процесорів
мають обширний набір команд умовного переходу за різними арифметичними
умовами і їх комбінаціями.
Арифметичні прапори виставляються відповідно до результатів останньої арифметичної
і логічної операції. Типовий набір арифметичних прапорів —
це біт перенесення, біт нуля (виставляється, якщо всі біти результату дорівнюють нулю),
знаковий біт (якщо дорівнює нулю старший біт результату) і біт переповнювання. У
процесорах перших поколінь незрідка використовувався зворотний підхід: процесор
мав всього один прапор умови переходу (так звана ы-признак) і
одну команду умовного переходу, зате декілька команд порівняння, що додавали
цьому прапору різну семантику.
Набор команд переходу, приведений в таблиці. 2.1, декілька ширше звичайного
— команди SBRC/SBRS для процесорів загального призначення нетипові.
Мікроконтроллери
PIC (мабуть, найекстравагантніша система команд серед сучасних
процесорів, що промислово випускаються) мають всього дві команди,
що виконують функції команд умовного переходу: BTFCS (Bit Test,
Skip if Set — перевірити біт і, якщо він встановлений, пропустити наступну
команду) і BTFCC (Bit Test, Skip if Clear, пропустити следую-шую команду,
якщо біт скинутий). Об'єктом перевірки може служити будь-який біт будь-якого регістра
процесора, у тому числі і біти арифметичних умов статусного слова.
Для реалізації умовного переходу слідом за такою командою потрібно розмістити
команду безумовного переходу. Саме такий чином асемблери для цього
мікроконтроллера реалізують псевдокоманди умовних переходів.
Таблиця 2.1. Команди умовного переходу мікроконтроллерів
сімейства AVR, цит. по [www.atmel.com]
| |
|
|
| |
Пропустити, якщо біт в регістрі скинутий
|
if (Rr(b)=0) РС = РС + 2 or 3
|
| |
Пропустити, якщо біт в регістрі встановлений
|
if (Rr(b)=1) РС = РС + 2 or 3
|
| |
Пропустити, якщо біт в регістрі В/в скинутий
|
if (I/0(P,b)=0) РС = РС + 2 or 3
|
| |
Пропустити, якщо біт в регістрі В/у встановлений
|
if (I/0(P,b)=l) РС = РС + 2 or 3
|
| |
Перейти, якщо статусний прапор встановлений
|
if (SREG(s) =1) РС = PC+k + 1
|
| |
Перейти, якщо статусний прапор скинутий
|
if (SREG(s) =0) РС = PC+k + 1
|
| |
|
if (Z = 1} РС = РС + до + 1
|
| |
|
if (Z=0) РС = РС + до + 1
|
| |
Перейти, якщо перенесення встановлене
|
if (C = 1) РС = РС + до + 1
|
| |
Перейти, якщо перенесення скинуте
|
if (C = 0) РС = РС + до + 1
|
| |
Перейти, якщо рівно або вище
|
if (C = 0) РС = РС + до + 1
|
| |
|
if (C = 1) РС = РС.+ до + 1
|
| |
|
if (N = 1) РС = РС + до + 1
|
| |
|
if (N = 0) РС = РС + до + 1
|
| |
Перейти, якщо більше або рівно, знакове
|
if (N XOR V= 0) РС = PC+ до + 1
|
| |
Перейти, якщо менше, знакове
|
if (N XOR V= 1) РС = РС + до + 1
|
| |
Перейти, якщо напівбайтове перенесення встановлене
|
if (H = 1) РС = РС + до + 1
|
| |
Перейти, якщо напівбайтове перенесення скинуте
|
if (H = 0) РС = РС + до + 1
|
| |
Перейти, якщо Т-флаг встановлений
|
if (T = 1) РС = РС + до + 1
|
| |
Перейти, якщо Т-флаг скинутий
|
if (T = 0) РС = РС + до + 1
|
| |
Перейти, якщо прапор переповнювання встановлений
|
if (V = 1) РС = РС + до + 1
|
| |
Перейти, якщо прапор переповнювання скинутий
|
if (V = 0) РС = РС + до + 1
|
| |
Перейти, якщо переривання дозволені
|
if (1 = 1) РС = РС + до + 1
|
| |
Перейти, якщо переривання заборонені
|
if (1 = 0) РС = РС + до + 1
|
|