BRANCH: различия между версиями
AtH (обсуждение | вклад) |
AtH (обсуждение | вклад) |
||
(не показано 19 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
'''BRANCH''' (переход, ветвление) — | '''BRANCH''' (переход, ветвление) — фортовское слово [[Каллисто]]. Продолжить интерпретацию от значения следующего скомпилированного адреса. | ||
BRANCH ( -- ) Ветвление. Безусловный переход в шитом коде. | BRANCH ( -- ) Ветвление. Безусловный переход в шитом коде. | ||
Сразу после оператора BRANCH должен быть скомпилирован адрес ветвления. Слово BRANCH переустанавливает указатель интерпретации по адресу, скомпилированному вслед за | Сразу после оператора BRANCH должен быть скомпилирован адрес ветвления. Слово BRANCH переустанавливает указатель интерпретации по адресу, скомпилированному вслед за данным [[CFA|токеном]] BRANCH. | ||
Низкоуровневое слово BRANCH не является аналогом оператора GOTO, хотя имеет схожее назначение. Обычно BRANCH не используется при | Низкоуровневое слово BRANCH не является аналогом оператора GOTO, хотя имеет схожее назначение. Обычно BRANCH не используется напрямую при разработке приложений, а только вызывается из слов вроде [[ELSE]], [[AGAIN]] и [[REPEAT]]. Слово BRANCH может потребоваться для реализации собственных структур управления, например отсутствующего в [[Каллисто]] оператора CASE. | ||
== Ввод слова BRANCH == | == Ввод слова 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 | ||
Строка 16: | Строка 19: | ||
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 | ||
Строка 22: | Строка 25: | ||
BRANCH is compiled by ELSE, AGAIN, REPEAT. | BRANCH is compiled by ELSE, AGAIN, REPEAT. | ||
== Реализация BRANCH == | == Реализация == | ||
У Баранова-Ноздрунова приводится следующее высокоуровневое | В [[Каллисто|Каллисто 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 ( ---> ) R> @ >R ; | ||
Для повышения скорости исполнения в [[Каллисто]] BRANCH реализован, как [[примитив]]. | Для повышения скорости исполнения в [[Каллисто]] BRANCH реализован, как [[примитив]]. | ||
В ФОРТ-ЕС слово BRANCH также было [[примитив]]ом. Вот его описание и определение: | |||
<PRE> | <PRE> | ||
BRANCH К -> ПРОДОЛЖИТЬ ИНТЕРПРЕТАЦИЮ ОТ ЗНАЧЕНИЯ 5 | |||
СЛЕДУЮЩЕГО СКОМПИЛИРОВАННОГО АДРЕСА | |||
BRANCH# M ПРОДОЛЖЕНИЕ ИНТЕРПРЕТАЦИИ ОТ АДРЕСА В 5 | |||
СЛЕДУЮНЕМ ПОЛУСЛОВЕ | |||
Экран номер 5 | Экран номер 5 | ||
( 09.09.86 BRANCH ?BRANCH (LOOP/ (+LOOP/ ) | ( 09.09.86 BRANCH ?BRANCH (LOOP/ (+LOOP/ ) | ||
Строка 35: | Строка 78: | ||
CODE BRANCH M: ВRANСН# | CODE BRANCH M: ВRANСН# | ||
RI 0 (, RI RFORTH LH, RI RMASK NR, RNEXT BR, | 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> | </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 на английской Википедии] ''(англ.)'' |
Текущая версия от 15:29, 30 июня 2021
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
jump в 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
Ссылки[править]
- Исходный текст слова BRANCH в Каллисто Классик 1.0
- См. слово ?BRANCH
- См. также слова >MARK и >RESOLVE, <MARK и <RESOLVE
- Оператор GOTO и команда перехода на Википедии
- Branch на английской Википедии (англ.)
- См. также команды ПМК БП и Р БП
У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их. |
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |