(NEXT): различия между версиями
Перейти к навигации
Перейти к поиску
AtH (обсуждение | вклад) Нет описания правки |
AtH (обсуждение | вклад) |
||
(не показано 28 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
'''(NEXT)''' — | '''(NEXT)''' — служебное слово [[Каллисто]], лишённое заголовка. Конец цикла со счётчиком в [[Шитый код|шитом коде]]. | ||
(NEXT) ( −− ) Конец цикла со счётчиком в шитом коде (слово без заголовка). | |||
Служебное слово (NEXT) компилируется в [[Шитый код|шитый код]] словом [[NEXT]]. Нет ни малейшей необходимости использовать в приложениях имя (NEXT). Для экономии [[Память программ|памяти программ]] в [[Каллисто|Каллисто 1.0]] слово (NEXT) было лишено заголовка. | |||
Конец цикла со счётчиком в шитом коде. | == Реализация == | ||
На самом деле в исходном тексте [[Каллисто|Каллисто 1.0]] присутствуют два варианта слова (NEXT) — XNEXT и XNEXTD — реализующие циклы в памяти программ и данных. Слово [[NEXT]] компилирует XNEXTD, а XNEXT используется самим [[Каллисто]]. Оба варианта (NEXT) лишены заголовка. | |||
<pre> | |||
672 CNTD: KRM6 RME ∗ KRM6 + M6 KGOTO9 | |||
… | |||
676 CNT: | |||
677 Cx PPM9210 ; Прочесть двухбайтовое значение по номеру X=0 | |||
678 PPM9042 ; RI := MEMW[RI] | |||
679 KGOTO9 ; NEXT | |||
… | |||
701 ;#xNEXT | |||
702 ; (NEXT) ( −− ) Конец цикла со счётчиком в шитом коде (слово без заголовка). | |||
703 ; Заголовок убран, слово (NEXT) используется только словом NEXT | |||
704 ;LXNEXT: .DB 6 | |||
705 ; .TEXT "(NEXT)" | |||
706 ; .DW LXFOR | |||
707 XNEXTD: .DW JXNEXTD ; (NEXT) в памяти данных | |||
708 JXNEXTD: RM2 MA 1 + MB | |||
709 KRMB 1 − FX!=0 XNEQ0D ; Переход если мл.байт был равен 1 | |||
710 FX<0 KMBCNTD | |||
711 KRMA FX!=0 XNEXITD ; Сюда перешли, если после декремента мл.байт < 0 | |||
712 1 − FX>=0 XNEXITD | |||
713 KMA 255 | |||
714 KMBCNTD: KMB PGOTO CNTD | |||
715 XNEQ0D: KRMA FX!=0 XNEXITD ; Переход, если счётчик == 0 | |||
716 Cx | |||
717 GOTO KMBCNTD | |||
718 XNEXITD: KRM6 KRM6 ; Пропустить адрес перехода | |||
719 JUNLOOP: 4 ; Обработчик UNLOOP | |||
720 NLEV: RM2 + M2 ; Убрать из стека возвратов два слова, счётчик и адрес | |||
721 KGOTO9 | |||
722 | |||
723 XNEXT: .DW JXNEXT ; (NEXT) в памяти программ | |||
724 JXNEXT: RM2 MA 1 + MB | |||
725 KRMB 1 − FX!=0 XNEQ0 | |||
726 FX<0 KMBCNT | |||
727 KRMA FX!=0 XNEXIT | |||
728 1 − FX>=0 XNEXIT | |||
729 KMA 255 | |||
730 KMBCNT: KMB PGOTO CNT | |||
731 XNEQ0: KRMA FX!=0 XNEXIT | |||
732 Cx | |||
733 GOTO KMBCNT | |||
734 XNEXIT: PPRM9044 PPRM9044 ; Пропустить адрес перехода | |||
735 GOTO JUNLOOP | |||
</pre> | |||
=== Советская реализация === | |||
Для реализации цикла со счётчиком в ФОРТ-ЕС и FORTH ИТЭФ служили [[примитив]]ы (LOOP) и (+LOOP) | |||
Вот их описания и определения из ФОРТ-ЕС: | |||
<PRE> | |||
(+LOOP) * N-> ТЕСТ НА ЗАВЕРШЕНИЕ ЦИКЛА "DO +LOOP" 5 | |||
С ШАГОМ N | |||
(LOOP) * -> ТЕСТ НА ЗАВЕРШЕНИЕ ЦИКЛА "DO LOOP" 5 | |||
Экран номер 5 | |||
( 09.09.86 BRANCH ?BRANCH (LOOP/ (+LOOP/ ) | |||
CODE BRANCH M: ВRANСН# | |||
RI 0 (, RI RFORTH LH, RI RMASK NR, RNEXT BR, | |||
CODE (LOOP) RW1 1 LA, 1 =F B, | |||
CODE (+LOOP) RW1 POP, | |||
1 =H 0 RFIRST LH, 0 RSECOND SH, 0 RMASK NR, | |||
0 RW1 AR, RW1 RFIRST AH, RW1 RFIRST STH, | |||
0 RMASK CLR, BRANCH# BNH, RRET 6 (, 0 RRET LA, | |||
RI RTWO AR, RNEXT BR, END-CODE | |||
</PRE> | |||
Определения из FORTH ИТЭФ: | |||
<PRE> | |||
CNT: ADD SI, [SI] | |||
NEXT | |||
... | |||
HEAD 206Q,'(LOOP',251Q,XLOOP ; (LOOP) | |||
; Приращение индекса цикла LOOP и может быть ветвление | |||
INC WORD PTR [BP] | |||
LOP: MOV AX, [BP] | |||
CHP AX, 2[BP] | |||
JL CNT | |||
LV: ADD BP, 4 | |||
ADD SI, 2 | |||
NEXT | |||
HEAD 207Q,'(+LOOP',251Q,XPLOO ; (+LOOP) | |||
POP AX | |||
ADD [BP], AX | |||
CMP AX, 0 | |||
JL $LESS | |||
JMP LOP | |||
$LESS: MOV CX, [BP] ; Работа с отрицательными приращениями | |||
CMP [BP]+2, CX | |||
JLE LV | |||
JMP CNT | |||
</PRE> | |||
== Ссылки == | |||
* {{Исходник|xNEXT|(NEXT)}} | |||
* См. слово [[(FOR)]], а также слова [[FOR]] и [[NEXT]] | |||
Строка 7: | Строка 108: | ||
{{заготовка}} | {{заготовка}} | ||
[[Категория:Слова Каллисто]] | [[Категория:Слова Каллисто]] | ||
[[Категория:Примитивы]] | |||
[[Категория:Реализация структур управления Каллисто]] | [[Категория:Реализация структур управления Каллисто]] | ||
[[Категория:Слова, лишённые заголовка]] |
Текущая версия от 23:35, 23 января 2018
(NEXT) — служебное слово Каллисто, лишённое заголовка. Конец цикла со счётчиком в шитом коде.
(NEXT) ( −− ) Конец цикла со счётчиком в шитом коде (слово без заголовка).
Служебное слово (NEXT) компилируется в шитый код словом NEXT. Нет ни малейшей необходимости использовать в приложениях имя (NEXT). Для экономии памяти программ в Каллисто 1.0 слово (NEXT) было лишено заголовка.
Реализация[править]
На самом деле в исходном тексте Каллисто 1.0 присутствуют два варианта слова (NEXT) — XNEXT и XNEXTD — реализующие циклы в памяти программ и данных. Слово NEXT компилирует XNEXTD, а XNEXT используется самим Каллисто. Оба варианта (NEXT) лишены заголовка.
672 CNTD: KRM6 RME ∗ KRM6 + M6 KGOTO9 … 676 CNT: 677 Cx PPM9210 ; Прочесть двухбайтовое значение по номеру X=0 678 PPM9042 ; RI := MEMW[RI] 679 KGOTO9 ; NEXT … 701 ;#xNEXT 702 ; (NEXT) ( −− ) Конец цикла со счётчиком в шитом коде (слово без заголовка). 703 ; Заголовок убран, слово (NEXT) используется только словом NEXT 704 ;LXNEXT: .DB 6 705 ; .TEXT "(NEXT)" 706 ; .DW LXFOR 707 XNEXTD: .DW JXNEXTD ; (NEXT) в памяти данных 708 JXNEXTD: RM2 MA 1 + MB 709 KRMB 1 − FX!=0 XNEQ0D ; Переход если мл.байт был равен 1 710 FX<0 KMBCNTD 711 KRMA FX!=0 XNEXITD ; Сюда перешли, если после декремента мл.байт < 0 712 1 − FX>=0 XNEXITD 713 KMA 255 714 KMBCNTD: KMB PGOTO CNTD 715 XNEQ0D: KRMA FX!=0 XNEXITD ; Переход, если счётчик == 0 716 Cx 717 GOTO KMBCNTD 718 XNEXITD: KRM6 KRM6 ; Пропустить адрес перехода 719 JUNLOOP: 4 ; Обработчик UNLOOP 720 NLEV: RM2 + M2 ; Убрать из стека возвратов два слова, счётчик и адрес 721 KGOTO9 722 723 XNEXT: .DW JXNEXT ; (NEXT) в памяти программ 724 JXNEXT: RM2 MA 1 + MB 725 KRMB 1 − FX!=0 XNEQ0 726 FX<0 KMBCNT 727 KRMA FX!=0 XNEXIT 728 1 − FX>=0 XNEXIT 729 KMA 255 730 KMBCNT: KMB PGOTO CNT 731 XNEQ0: KRMA FX!=0 XNEXIT 732 Cx 733 GOTO KMBCNT 734 XNEXIT: PPRM9044 PPRM9044 ; Пропустить адрес перехода 735 GOTO JUNLOOP
Советская реализация[править]
Для реализации цикла со счётчиком в ФОРТ-ЕС и FORTH ИТЭФ служили примитивы (LOOP) и (+LOOP)
Вот их описания и определения из ФОРТ-ЕС:
(+LOOP) * N-> ТЕСТ НА ЗАВЕРШЕНИЕ ЦИКЛА "DO +LOOP" 5 С ШАГОМ N (LOOP) * -> ТЕСТ НА ЗАВЕРШЕНИЕ ЦИКЛА "DO LOOP" 5 Экран номер 5 ( 09.09.86 BRANCH ?BRANCH (LOOP/ (+LOOP/ ) CODE BRANCH M: ВRANСН# RI 0 (, RI RFORTH LH, RI RMASK NR, RNEXT BR, CODE (LOOP) RW1 1 LA, 1 =F B, CODE (+LOOP) RW1 POP, 1 =H 0 RFIRST LH, 0 RSECOND SH, 0 RMASK NR, 0 RW1 AR, RW1 RFIRST AH, RW1 RFIRST STH, 0 RMASK CLR, BRANCH# BNH, RRET 6 (, 0 RRET LA, RI RTWO AR, RNEXT BR, END-CODE
Определения из FORTH ИТЭФ:
CNT: ADD SI, [SI] NEXT ... HEAD 206Q,'(LOOP',251Q,XLOOP ; (LOOP) ; Приращение индекса цикла LOOP и может быть ветвление INC WORD PTR [BP] LOP: MOV AX, [BP] CHP AX, 2[BP] JL CNT LV: ADD BP, 4 ADD SI, 2 NEXT HEAD 207Q,'(+LOOP',251Q,XPLOO ; (+LOOP) POP AX ADD [BP], AX CMP AX, 0 JL $LESS JMP LOP $LESS: MOV CX, [BP] ; Работа с отрицательными приращениями CMP [BP]+2, CX JLE LV JMP CNT
Ссылки[править]
- Исходный текст слова (NEXT) в Каллисто Классик 1.0
- См. слово (FOR), а также слова FOR и NEXT
У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их. |
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |