Редактирование: BRANCH

Перейти к навигации Перейти к поиску
Внимание: Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы войдёте или создадите учётную запись, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.

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

Текущая версия Ваш текст
Строка 1: Строка 1:
'''BRANCH''' (переход, ветвление) — фортовское слово [[Каллисто]]. Продолжить интерпретацию от значения следующего скомпилированного адреса.
'''BRANCH''' (переход, ветвление) — стандартное слово [[Каллисто]]. Продолжить интерпретацию от значения следующего скомпилированного адреса.
  BRANCH        ( -- )                          Ветвление. Безусловный переход в шитом коде.
  BRANCH        ( -- )                          Ветвление. Безусловный переход в шитом коде.
Сразу после оператора BRANCH должен быть скомпилирован адрес ветвления. Слово BRANCH переустанавливает указатель интерпретации по адресу, скомпилированному вслед за данным [[CFA|токеном]] BRANCH.
Слово BRANCH переустанавливает указатель интерпретации по адресу, скомпилированному вслед за данной ссылкой на [[xt]] BRANCH.


Низкоуровневое слово BRANCH не является аналогом оператора GOTO, хотя имеет схожее назначение. Обычно BRANCH не используется напрямую при разработке приложений, а только вызывается из слов вроде [[ELSE]], [[AGAIN]] и [[REPEAT]]. Слово BRANCH может потребоваться для реализации собственных структур управления, например отсутствующего в [[Каллисто]] оператора CASE.
Низкоуровневое слово BRANCH не является аналогом оператора GOTO. Обычно BRANCH не используется при составлении программ, а только в словах вроде [[ELSE]] и [[REPEAT]]. Адрес ветвления должен быть скомпилирован сразу после оператора BRANCH


== Ввод слова BRANCH ==
== Ввод слова BRANCH ==
В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша В/О|{{Чёрная клавиша|В/О}}]] [[Клавиша ×|{{Серая клавиша|×}}]] {{ШГ←}} [[Клавиша 4|{{Серая клавиша|4}}]] [[Клавиша С/П|{{Чёрная клавиша|С/П}}]] [[Клавиша ПП|{{Чёрная клавиша|ПП}}]]
В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша В/О|{{Чёрная клавиша|В/О}}]] [[Клавиша ×|{{Серая клавиша|×}}]] [[Клавиша ШГ влево|{{Чёрная клавиша|ШГ←}}]] [[Клавиша 4|{{Серая клавиша|4}}]] [[Клавиша С/П|{{Чёрная клавиша|С/П}}]] [[Клавиша ПП|{{Чёрная клавиша|ПП}}]]


== История ==
== BRANCH в предыдущем стандарте Forth-83 (англ.) ==
Слово BRANCH слишком низкоуровневое, чтобы его включали в современные стандарты Форта. Однако оно держалось в них до 1994 года.
 
=== BRANCH в предыдущем стандарте Forth-83 (англ.) ===
       BRANCH      --                            C,83
       BRANCH      --                            C,83
           When used in the form:  COMPILE BRANCH  an unconditional
           When used in the form:  COMPILE BRANCH  an unconditional
Строка 19: Строка 16:
           BRANCH with <RESOLVE or >MARK .
           BRANCH with <RESOLVE or >MARK .


=== BRANCH в fig-FORTH Release 1 glossary, май 1979 (англ.) ===
== BRANCH в fig-FORTH Release 1 glossary, май 1979 (англ.) ==
  BRANCH                                      C2,L0
  BRANCH                                      C2,L0
         The run-time proceedure to unconditionally branch. An in-line offset
         The run-time proceedure to unconditionally branch. An in-line offset
Строка 25: Строка 22:
         BRANCH is compiled by ELSE, AGAIN, REPEAT.
         BRANCH is compiled by ELSE, AGAIN, REPEAT.


== Реализация ==
== Реализация BRANCH ==
В [[Каллисто|Каллисто 1.0]] словарная статья BRANCH содержит два [[CFA|токена]], осуществляющие безусловные переходы как в [[Память двоичных данных|области данных]], так и в [[Память программ|памяти программ]]:
У Баранова-Ноздрунова приводится следующее описание слова BRANCH (стр. 54):
<pre>
664 ;#BRANCH
665 ; BRANCH          ( −− )                              Ветвление. Безусловный переход в шитом коде.
666 ; Служебное слово для реализации структур управления −− таких, как ELSE BEGIN
667 LBRAN:          .DB    6
668                .TEXT  "BRANCH"
669                .DW    LZBRAN
670 BRAND:          .DW    CNTD                    ; Безусловный переход для памяти данных
671 POPCNTD:        RM3 1 + M3
672 CNTD:          KRM6 RME ∗ KRM6 + M6  KGOTO9
673
674 BRAN:          .DW    CNT                    ; Безусловный переход для памяти программ
675 POPCNT:        RM3 1 + M3
676 CNT:
677                Cx PPM9210                      ; Прочесть двухбайтовое значение по номеру X=0
678                PPM9042                        ; RI := MEMW[RI]
679                KGOTO9                          ; NEXT
</pre>
 
=== Реализации в SP-Forth 4.20 ===
<pre>
: TC-BRANCH, ( ADDR -> ) \ скомпилировать инструкцию ADDR JMP
  ?SET SetOP SetJP E9 C,
  DP @ CELL+ - ,    DP @ TO LAST-HERE
;
</pre>
<pre>
: BRANCH, ( ADDR -> ) \ скомпилировать инструкцию ADDR JMP
  ?SET SetOP SetJP E9 C,
  DUP IF DP @ CELL+ - THEN ,    DP @ TO LAST-HERE
;
</pre>
 
=== Советская реализация ===
У Баранова-Ноздрунова приводится следующее высокоуровневое определение слова BRANCH (стр. 54):
   : BRANCH  ( ---> )    R>  @  >R  ;
   : BRANCH  ( ---> )    R>  @  >R  ;
Для повышения скорости исполнения в [[Каллисто]] BRANCH реализован, как [[примитив]].
В ФОРТ-ЕС слово BRANCH также было [[примитив]]ом. Вот его описание и определение:
<PRE>
BRANCH  К -> ПРОДОЛЖИТЬ ИНТЕРПРЕТАЦИЮ ОТ ЗНАЧЕНИЯ              5
          СЛЕДУЮЩЕГО СКОМПИЛИРОВАННОГО АДРЕСА
BRANCH# M ПРОДОЛЖЕНИЕ ИНТЕРПРЕТАЦИИ ОТ АДРЕСА В                5
          СЛЕДУЮНЕМ ПОЛУСЛОВЕ
                      Экран номер 5
( 09.09.86  BRANCH  ?BRANCH  (LOOP/  (+LOOP/ )
CODE  BRANCH  M: ВRANСН#
RI 0 (, RI RFORTH LH,    RI RMASK  NR,      RNEXT BR,
</PRE>
В FORTH ИТЭФ слово BRANCH тоже было [[примитив]]ом:
<PRE>
            HEAD    206Q,'BRANC',310Q,BRAN              ; BRANCH
  CNT:      ADD  SI,  [SI]
            NEXT
</PRE>
=== jump в colorForth (cf2019.nasm 2019 Sep 14) ===
<PRE>
jump:
    pop edx
    add edx, _TOS_
    lea edx, [ edx + ( _TOS_ * 4 ) + 0x05 ]
    add edx, [ edx - 0x04 ]
    _DROP_
    jmp edx
</PRE>


== Ссылки ==
== Ссылки ==
* {{Исходник|BRANCH|BRANCH}}
* См. слово [[?BRANCH]]
* См. также слова [[⟩MARK|&gt;MARK]] и [[⟩RESOLVE|&gt;RESOLVE]], [[⟨MARK|&lt;MARK]] и [[⟨RESOLVE|&lt;RESOLVE]]
* [http://ru.wikipedia.org/wiki/Goto Оператор GOTO] и [https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%B0 команда перехода] на Википедии
* [http://ru.wikipedia.org/wiki/Goto Оператор GOTO] и [https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%B0 команда перехода] на Википедии
* [https://en.wikipedia.org/wiki/Branch_%28computer_science%29 Branch на английской Википедии] ''(англ.)''
* [https://en.wikipedia.org/wiki/Branch_%28computer_science%29 Branch на английской Википедии] ''(англ.)''
Строка 109: Строка 35:
{{заготовка}}
{{заготовка}}
[[Категория:Слова Каллисто]]
[[Категория:Слова Каллисто]]
[[Категория:Примитивы]]
[[Категория:Реализация структур управления Каллисто]]
[[Категория:Реализация структур управления Каллисто]]
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Pmkwiki:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

В целях защиты вики от автоматического спама в правках просим вас решить следующую каптчу:

Отменить Справка по редактированию (в новом окне)