Я думаю, что это отвечает на ваш вопрос: например, в серии Microchip PIC18F у вас есть команда bra
(ветвь) и команда goto
. Они фактически одинаковы, но разница в том, что команда bra
может перемещаться только в местоположение от -1024 до +1023 слов из своего местоположения и использует только одно слово программной памяти. Команда goto
может перепрыгнуть в любом месте в памяти программ, но она требует двух слов памяти программ, чтобы разрешить прыжок в любом месте.
Если вы неправильно попытаетесь разветвляться на метку слишком далеко, компилятор выдаст вам ошибку.
Эти дополнительные слова могут иметь значение, если, конечно, у вас есть, скажем, 2К слов памяти программ.
bra
и goto
сами по себе являются безусловными прыжками; однако есть несколько команд условного перехода, таких как bc
(переход, если переносить), bz
(переход, если ноль), bnz
(переход, если не ноль) и т. д., которые все проверяют регистры состояния из последней (арифметическая) операция, и выполнять ветвление только в том случае, если указанное условие было истинным.
Если вам нужно условное goto
, то у вас будет что-то вроде
DELAY
nop
nop
decfsnz DelayCount
goto DONE_WITH_DELAY
bra DELAY
Где мы выполняем два бездействия, чтобы «поспать» на мгновение; уменьшаем «переменную» с именем DelayCount
, и если DelayCount
равен нулю, то мы безоговорочно переходим к коду, помеченному DONE_WITH_DELAY
; если он не равен нулю, мы возвращаемся к метке DELAY
и делаем это снова. (decfsnz
означает «Уменьшение f
, пропустите, если не ноль)