BRANCH

Материал из ПМК вики
Перейти к навигации Перейти к поиску

BRANCH (переход, ветвление) — фортовское слово Каллисто. Продолжить интерпретацию от значения следующего скомпилированного адреса.

BRANCH         ( -- )                          Ветвление. Безусловный переход в шитом коде.

Сразу после оператора BRANCH должен быть скомпилирован адрес ветвления. Слово BRANCH переустанавливает указатель интерпретации по адресу, скомпилированному вслед за данным токеном BRANCH.

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

Ввод слова BRANCH

В режиме ЛАТ последовательно нажмите клавиши  В/О   ×   ШГ←   4   С/П   ПП 

История

Слово BRANCH слишком низкоуровневое, чтобы его включали в современные стандарты Форта. Однако оно держалось в них до 1994 года.

BRANCH в предыдущем стандарте Forth-83 (англ.)

     BRANCH       --                            C,83
          When used in the form:  COMPILE BRANCH  an unconditional
          branch operation is compiled.  A branch address must be
          compiled immediately following this compilation address.
          The branch address is typically generated by following
          BRANCH with <RESOLVE or >MARK .

BRANCH в fig-FORTH Release 1 glossary, май 1979 (англ.)

BRANCH                                       C2,L0
       The run-time proceedure to unconditionally branch. An in-line offset
       is added to the interpretive pointer IP to branch ahead or back.
       BRANCH is compiled by ELSE, AGAIN, REPEAT.

Реализация

В Каллисто 1.0 словарная статья BRANCH содержит два токена, осуществляющие безусловные переходы как в области данных, так и в памяти программ:

 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

Реализации в SP-Forth 4.20

: TC-BRANCH, ( ADDR -> ) \ скомпилировать инструкцию ADDR JMP
  ?SET SetOP SetJP E9 C,
  DP @ CELL+ - ,    DP @ TO LAST-HERE
;
: BRANCH, ( ADDR -> ) \ скомпилировать инструкцию ADDR JMP
  ?SET SetOP SetJP E9 C,
  DUP IF DP @ CELL+ - THEN ,    DP @ TO LAST-HERE
;

Советская реализация

У Баранова-Ноздрунова приводится следующее высокоуровневое определение слова BRANCH (стр. 54):

 : BRANCH   ( ---> )    R>  @  >R  ;

Для повышения скорости исполнения в Каллисто BRANCH реализован, как примитив.

В ФОРТ-ЕС слово BRANCH также было примитивом. Вот его описание и определение:

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,

В FORTH ИТЭФ слово BRANCH тоже было примитивом:

             HEAD    206Q,'BRANC',310Q,BRAN               ; BRANCH
   CNT:      ADD   SI,  [SI]
             NEXT

colorForth (cf2019.nasm 2019 Sep 14)

jump:
    pop edx
    add edx, _TOS_
    lea edx, [ edx + ( _TOS_ * 4 ) + 0x05 ]
    add edx, [ edx - 0x04 ]
    _DROP_
    jmp edx

Ссылки


  У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их.


  Это заготовка статьи. Вы можете помочь проекту, дополнив её.