Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
| '''BRANCH''' (переход, ветвление) — фортовское слово [[Каллисто]]. Продолжить интерпретацию от значения следующего скомпилированного адреса. | | '''BRANCH''' — стандартное слово [[Каллисто]]. |
| BRANCH ( -- ) Ветвление. Безусловный переход в шитом коде.
| |
| Сразу после оператора BRANCH должен быть скомпилирован адрес ветвления. Слово BRANCH переустанавливает указатель интерпретации по адресу, скомпилированному вслед за данным [[CFA|токеном]] BRANCH.
| |
|
| |
|
| Низкоуровневое слово BRANCH не является аналогом оператора GOTO, хотя имеет схожее назначение. Обычно BRANCH не используется напрямую при разработке приложений, а только вызывается из слов вроде [[ELSE]], [[AGAIN]] и [[REPEAT]]. Слово BRANCH может потребоваться для реализации собственных структур управления, например отсутствующего в [[Каллисто]] оператора CASE.
| | Безусловный переход в шитом коде. |
|
| |
|
| == Ввод слова BRANCH ==
| |
| В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша В/О|{{Чёрная клавиша|В/О}}]] [[Клавиша ×|{{Серая клавиша|×}}]] {{ШГ←}} [[Клавиша 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: |
Строка 12: |
| BRANCH with <RESOLVE or >MARK . | | 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 содержит два [[CFA|токена]], осуществляющие безусловные переходы как в [[Память двоичных данных|области данных]], так и в [[Память программ|памяти программ]]:
| |
| <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 реализован, как [[примитив]].
| |
|
| |
| В ФОРТ-ЕС слово 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|>MARK]] и [[⟩RESOLVE|>RESOLVE]], [[⟨MARK|<MARK]] и [[⟨RESOLVE|<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 на английской Википедии] ''(англ.)'' |
| * См. также команды ПМК [[БП]] и [[Р БП]] | | * См. также команды ПМК [[БП]] и [[Р БП]] |
|
| |
|
| |
|
| {{нет иллюстраций}} | | {{нет иллюстраций}} |
| {{заготовка}} | | {{заготовка}} |
| [[Категория:Слова Каллисто]] | | [[Категория:Слова Каллисто]] |
| [[Категория:Примитивы]]
| |
| [[Категория:Реализация структур управления Каллисто]] | | [[Категория:Реализация структур управления Каллисто]] |