EXIT: различия между версиями

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


== Реализация ==
== Реализация ==
<pre>
1768 ;#EXIT
1769 ; EXIT            ( −− )                              Закончить исполнение текущего определения.
1770 LEXIT:          .DB    4
1771                .TEXT  "EXIT"
1772                .DW    LRPSTO
1773 EXIT:          .DW    RETURN                  ; При использовании EXIT внутри FOR .. NEXT нужно предварительно выполнить UNLOOP
2470 SETRIDAT:
2471                M6                              ; RI := RX
2472 SETDAT:        .NUMT RPUSHRID
2473                MC                              ; RC := RPUSHRID        ;∗∗ Следующий вызов −− из памяти данных
2474                .NUM NEXTD
2475                M9                              ; R9 := NEXTD          ;∗∗
2476 NEXTD:                                          ; NEXT для шитого кода из памяти данных.
2477                KRM6 RME ∗ KRM6 + M7            ; W := MEMW[RI++] считать шитый код
2478                1 EE 4 −  FX>=0 NEXTPP          ; Слово из памяти программ?
2479 NEXTDD:        M7 M5 KRM7 RME ∗ KRM5 +        ; Считать MEMW[W], это должно быть CFA очередного слова в шитом коде
2480                M8 KGOTO8                      ; передать управление на адрес, записанный в CFA
2481 ;
2482 RETURN:                                        ; Обработчик EXIT
2483                RM2 1 − M5 3 + M2
2484                KRM5 RME ∗ KRM5 +
2485                PPM 9042                        ; Регистр, увы, мучаем в любом случае
2486                10001 −
2487                FX<0 SETRIDAT
2488                GOTO SETPRG
2489 ;
2490 CALL:                                          ;∗∗ CALL, когда управление передаётся в память программ
2491                KGSBC                          ; RPUSH RI ; RX := W, адрес поля кода нового слова
2492                2 +                            ; Теперь RX указывает на его тело
2493 SETRIPRG:
2494                PPM 9042                        ; R9042 := RX
2495 SETPRG:        .NUMT RPUSHRIP
2496                MC                              ; RC := RPUSHRIP        ;∗∗ Следующий вызов −− из памяти программ
2497                .NUM NEXTP
2498                M9                              ; R9 := NEXTP          ;∗∗
2499 NEXTP:                                          ; NEXT для шитого кода из памяти программ.
2500                PPRM 9044 RME ∗ PPRM 9044 +
2501 DOEXECRX:      M7                              ; W := MEMW[RI++] считать шитый код
2502                1 EE 4 − FX<0 NEXTDD            ; Слово из области двоичных данных?
2503 NEXTPP:        RM7 KPRGM RME ∗ RM7 1 + KPRGM + ; Считать MEMW[W], это должно быть CFA очередного слова в шитом коде
2504                M8 KGOTO8                      ; передать управление на адрес, записанный в CFA
</pre>
=== Советская реализация ===
Слово EXIT в ФОРТ-ЕС было [[примитив]]ом. Вот его описание и определение:
Слово EXIT в ФОРТ-ЕС было [[примитив]]ом. Вот его описание и определение:
<PRE>
<PRE>

Версия от 13:55, 9 ноября 2017

EXIT (выход) — стандартное слово Каллисто.

EXIT           ( −− )                               Закончить исполнение текущего определения.

Закончить исполнение текущего определения. Это слово часто используется, но его имя в исходном тексте приложений встречается нечасто. Причина в том, что слово ; автоматически компилирует EXIT в конце каждого определения.

Слово FOR кладёт на стек возвратов свою служебную информацию, поэтому для возврата из слова изнутри цикла FOR перед EXIT нужно употреблять слово UNLOOP, по одному на каждый из вложенных циклов FOR.

Ввод слова EXIT

В режиме ЛАТ последовательно нажмите четыре клавиши  ИП   0   7   2 

EXIT в стандарте ANS Forth

 6.1.1380   EXIT                                                            CORE
        Интерпретация: Семантика интерпретации для этого слова не определена.

        Выполнение: ( -- ) ( R: nest-sys -- )
            Возвращает управление на вызывающее определение, определенное nest-
            sys. Перед выполнением EXIT в пределах do-loop, программа должна 
            удалить параметры управления циклом, выполняя UNLOOP.

        См.: 3.2.3.3 Стек возвратов, 6.1.2380 UNLOOP.

 A.6.1.1380   EXIT
 Типичное использование:
        : X ... test IF ... EXIT THEN ... ;

История

Слово EXIT является одним из самых древних и устоявшихся в Форте. Оно появилось в 1966 году, когда Чак Мур, будучи гуру MCP на 5500, работал в Realtime Systems, Inc (RSI).

С начала стандартизации Форта в 1979 году слово EXIT входит во все стандарты языка Форт, включая черновик Форта-2012.

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

     EXIT         --                            C,79
          Compiled within a colon definition such that when executed,
          that colon definition returns control to the definition that
          passed control to it by returning control to the return
          point on the top of the return stack.  An error condition
          exists if the top of the return stack does not contain a
          valid return point.  May not be used within a do-loop.  See:
          ;  "stack, return"  "9.3 Return Stack"

EXIT в стандарте Forth-79 (англ.)

EXIT                                         C,117
    When compiled within a colon-definition,  terminate  execution
    of that definition,  at that point.   May not be used within a
    DO...LOOP.

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

;S                                            P,L0
       Stop interpretation of a screen.
       ;S is also the run-time word compiled at the end of a
       colon-definition which returns execution to the calling proceedure.

Реализация

1768 ;#EXIT
1769 ; EXIT             ( −− )                               Закончить исполнение текущего определения.
1770 LEXIT:          .DB     4
1771                 .TEXT   "EXIT"
1772                 .DW     LRPSTO
1773 EXIT:           .DW     RETURN                  ; При использовании EXIT внутри FOR .. NEXT нужно предварительно выполнить UNLOOP
…
2470 SETRIDAT:
2471                 M6                              ; RI := RX
2472 SETDAT:         .NUMT RPUSHRID
2473                 MC                              ; RC := RPUSHRID        ;∗∗ Следующий вызов −− из памяти данных
2474                 .NUM NEXTD
2475                 M9                              ; R9 := NEXTD           ;∗∗
2476 NEXTD:                                          ; NEXT для шитого кода из памяти данных.
2477                 KRM6 RME ∗ KRM6 + M7            ; W := MEMW[RI++] считать шитый код
2478                 1 EE 4 −  FX>=0 NEXTPP          ; Слово из памяти программ?
2479 NEXTDD:         M7 M5 KRM7 RME ∗ KRM5 +         ; Считать MEMW[W], это должно быть CFA очередного слова в шитом коде
2480                 M8 KGOTO8                       ; передать управление на адрес, записанный в CFA
2481 ;
2482 RETURN:                                         ; Обработчик EXIT
2483                 RM2 1 − M5 3 + M2
2484                 KRM5 RME ∗ KRM5 +
2485                 PPM 9042                        ; Регистр, увы, мучаем в любом случае
2486                 10001 −
2487                 FX<0 SETRIDAT
2488                 GOTO SETPRG
2489 ;
2490 CALL:                                           ;∗∗ CALL, когда управление передаётся в память программ
2491                 KGSBC                           ; RPUSH RI ; RX := W, адрес поля кода нового слова
2492                 2 +                             ; Теперь RX указывает на его тело
2493 SETRIPRG:
2494                 PPM 9042                        ; R9042 := RX
2495 SETPRG:         .NUMT RPUSHRIP
2496                 MC                              ; RC := RPUSHRIP        ;∗∗ Следующий вызов −− из памяти программ
2497                 .NUM NEXTP
2498                 M9                              ; R9 := NEXTP           ;∗∗
2499 NEXTP:                                          ; NEXT для шитого кода из памяти программ.
2500                 PPRM 9044 RME ∗ PPRM 9044 +
2501 DOEXECRX:       M7                              ; W := MEMW[RI++] считать шитый код
2502                 1 EE 4 − FX<0 NEXTDD            ; Слово из области двоичных данных?
2503 NEXTPP:         RM7 KPRGM RME ∗ RM7 1 + KPRGM + ; Считать MEMW[W], это должно быть CFA очередного слова в шитом коде
2504                 M8 KGOTO8                       ; передать управление на адрес, записанный в CFA

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

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

EXIT     К -> ЗАКОНЧИТЬ ИСПОЛНЕНИЕ ТЕКУЩЕГО ОПРЕДЕЛЕНИЯ          4
EXIT#    M   ТОЧКА "EXIT" АДРЕСНОГО ИНТЕРПРЕТАТОРА               4
                                 ЗНАЧЕНИИ В СТЕКЕ

                      Экран номер 4
( 09.09.86 ВСПОМОГАТЕЛЬНЫЕ ПОДПРОГРАММЫ: ВОЗВРАТ В РЕГ.14)

CODE EXIT
M: EXIT#  RI RPOP,   RI RMASK NR,  RNEXT BR,   END-CODE

В FORTH ИТЭФ слово EXIT называлось ;S и также было примитивом, вот его определение:

            HEAD     202Q,';',323Q,SEMI                   ; ;S
            MOV  SI, [BP]
            ADD  BP, 2
            NEXT

Ссылки


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


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