2DUP: различия между версиями
AtH (обсуждение | вклад) Нет описания правки |
AtH (обсуждение | вклад) |
||
(не показано 35 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
'''2DUP''' (два-дублировать) — стандартное слово [[Каллисто]]. Продублировать пару [[Десятичное число|чисел]] в [[Стек данных|стеке]]. | '''2DUP''' (два-дублировать, читается «два-дуп») — стандартное слово [[Каллисто]]. Продублировать пару [[Десятичное число|чисел]] в [[Стек данных|стеке]]. | ||
2DUP ( | 2DUP ( y x -- y x y x ) Дублировать пару чисел. | ||
[[Файл:CallistoMAXMIN2DUP.png|thumb|right|264px|Пример работы слова 2DUP]] | |||
Дублирует верхнюю пару [[Ячейка (Каллисто)|ячеек]] y x в [[Стек данных|стеке]]. | |||
== Ввод слова 2DUP == | |||
В [[Режим NUM|режиме NUM]] последовательно нажмите клавиши [[Клавиша 2|{{Серая клавиша|2}}]] [[Клавиша Р-ГРД-Г|{{Чёрная клавиша|Р-ГРД-Г}}]] [[Клавиша K|{{Синяя клавиша|K}}]] [[Клавиша 3|{{Серая клавиша|3}}]] [[Клавиша 6|{{Серая клавиша|6}}]] | |||
Для возврата в [[режим NUM]] нажмите [[Клавиша P|синюю клавишу {{Синяя клавиша|P}}]]. | |||
== 2DUP в стандарте ANS Forth == | == 2DUP в стандарте ANS Forth == | ||
Строка 9: | Строка 14: | ||
Дублирует пару-ячеек x1 x2. | Дублирует пару-ячеек x1 x2. | ||
== 2DUP в предыдущем стандарте Forth-83 (англ.) == | == История == | ||
2DUP — устоявшееся слово в Форте, название и поведение которого не менялось с 1979 года. | |||
В [[Каллисто]] редко возникает необходимость в числовых парах. Слово 2DUP присутствует для жонглирования стеком, но используется реже, чем в классическом Форте. | |||
=== 2DUP в предыдущем стандарте Forth-83 (англ.) === | |||
2DUP 32b -- 32b 32b 79 "two-dupe" | 2DUP 32b -- 32b 32b 79 "two-dupe" | ||
Duplicate 32b. | Duplicate 32b. | ||
== 2DUP в стандарте Forth-79 (англ.) == | === 2DUP в стандарте Forth-79 (англ.) === | ||
2DUP d -- d d "two-dupe" | 2DUP d -- d d "two-dupe" | ||
Duplicate the top double number on the stack. | Duplicate the top double number on the stack. | ||
== | == Реализация == | ||
В [[Каллисто]] 2DUP | В [[Каллисто|Каллисто 1.0]] для экономии [[Память программ|памяти программ]] редко используемое слово 2DUP реализовано через [[примитив]] [[OVER]]: | ||
: 2DUP | <pre> | ||
1919 ;#TwoDUP | |||
1920 ; 2DUP ( y x −− y x y x ) Дублировать пару чисел. | |||
1921 LDUP2: .DB 4 | |||
1922 .TEXT "2DUP" ; ( dd −− dd dd ) | |||
1923 .DW LQDUP | |||
1924 DUP2: .DW CALL, OVER,OVER, EXIT ; Дублировать верхнюю пару элементов стека. | |||
</pre> | |||
Красиво это можно записать так: | |||
: 2DUP ( dd -- dd dd) OVER OVER ; | |||
Реализация из SP-Forth 4.20: | |||
<pre> | |||
CODE 2DUP ( x1 x2 -- x1 x2 x1 x2 ) \ 94 | |||
\ Продублировать пару ячеек x1 x2. | |||
MOV EDX, [EBP] | |||
MOV -4 [EBP], EAX | |||
MOV -8 [EBP], EDX | |||
LEA EBP, -8 [EBP] | |||
RET | |||
END-CODE | |||
</pre> | |||
=== Советская реализация === | |||
В ФОРТ-ЕС слово 2DUP так и было определено, с целью лёгкой переносимости ядра: | |||
<PRE> | |||
2DUP WD->WD,WD ПРОДУБЛИРОВАТЬ ДВОЙНОЕ ЗНАЧЕНИЕ 12 | |||
Экран номер 12 | |||
( 31.03.86 ROLL PICK 2DUP 2DROP 2SWAP 2OVER 2ROT ) | |||
: 2DUP ( WD->WD,WD) OVER OVER ; | |||
</PRE> | |||
В FORTH ИТЭФ слово 2DUP было [[примитив]]ом, вот его определение: | |||
<PRE> | |||
HEAD 204Q,'2DU',320Q,DUP2 ; 2DUP | |||
POP AX | |||
POP CX | |||
PUSH CX | |||
PUSH AX | |||
PUSH CX | |||
PUSH AX | |||
NEXT | |||
</PRE> | |||
== Ссылки == | == Ссылки == | ||
* См. слова [[↑ | * {{Исходник|TwoDUP|2DUP}} | ||
* [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.0380 | * См. слова [[Слово ↑|↑]], [[2DROP]], [[2SWAP]] | ||
* [http:// | * Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.0380 2DUP (two-dupe)] в стандарте ANS Forth ''(англ.)'' | ||
* Слово [http://forth-standard.org/standard/core/TwoDUP 2DUP (two-dupe)] в черновике Forth 200x ''(англ.)'' | |||
* [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH\02.WYPOLNENIE%20ARIFMETITESKIH%20OPERAZIJ ВЫПОЛНЕНИЕ АРИФМЕТИЧЕСКИХ ОПЕРАЦИЙ] в книге [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH Л.Броуди «Начальный курс программирования на языке Форт»] | |||
* [http://www.forth.com/starting-forth/sf2/sf2.html How to Get Results] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)'' | |||
{{заготовка}} | {{заготовка}} | ||
[[Категория:Слова Каллисто]] | [[Категория:Слова Каллисто]] | ||
[[Категория:Стековые манипуляции Каллисто]] | [[Категория:Стековые манипуляции Каллисто]] | ||
[[Категория: | [[Категория:Стандартные слова]] | ||
[[Категория:1994 CORE]] | |||
[[Категория:2012 CORE]] |
Текущая версия от 16:35, 10 ноября 2017
2DUP (два-дублировать, читается «два-дуп») — стандартное слово Каллисто. Продублировать пару чисел в стеке.
2DUP ( y x -- y x y x ) Дублировать пару чисел.
Дублирует верхнюю пару ячеек y x в стеке.
Ввод слова 2DUP[править]
В режиме NUM последовательно нажмите клавиши 2 Р-ГРД-Г K 3 6
Для возврата в режим NUM нажмите синюю клавишу P .
2DUP в стандарте ANS Forth[править]
6.1.0380 2DUP "two-dupe" CORE ( x1 x2 -- x1 x2 x1 x2 ) Дублирует пару-ячеек x1 x2.
История[править]
2DUP — устоявшееся слово в Форте, название и поведение которого не менялось с 1979 года.
В Каллисто редко возникает необходимость в числовых парах. Слово 2DUP присутствует для жонглирования стеком, но используется реже, чем в классическом Форте.
2DUP в предыдущем стандарте Forth-83 (англ.)[править]
2DUP 32b -- 32b 32b 79 "two-dupe" Duplicate 32b.
2DUP в стандарте Forth-79 (англ.)[править]
2DUP d -- d d "two-dupe" Duplicate the top double number on the stack.
Реализация[править]
В Каллисто 1.0 для экономии памяти программ редко используемое слово 2DUP реализовано через примитив OVER:
1919 ;#TwoDUP 1920 ; 2DUP ( y x −− y x y x ) Дублировать пару чисел. 1921 LDUP2: .DB 4 1922 .TEXT "2DUP" ; ( dd −− dd dd ) 1923 .DW LQDUP 1924 DUP2: .DW CALL, OVER,OVER, EXIT ; Дублировать верхнюю пару элементов стека.
Красиво это можно записать так:
: 2DUP ( dd -- dd dd) OVER OVER ;
Реализация из SP-Forth 4.20:
CODE 2DUP ( x1 x2 -- x1 x2 x1 x2 ) \ 94 \ Продублировать пару ячеек x1 x2. MOV EDX, [EBP] MOV -4 [EBP], EAX MOV -8 [EBP], EDX LEA EBP, -8 [EBP] RET END-CODE
Советская реализация[править]
В ФОРТ-ЕС слово 2DUP так и было определено, с целью лёгкой переносимости ядра:
2DUP WD->WD,WD ПРОДУБЛИРОВАТЬ ДВОЙНОЕ ЗНАЧЕНИЕ 12 Экран номер 12 ( 31.03.86 ROLL PICK 2DUP 2DROP 2SWAP 2OVER 2ROT ) : 2DUP ( WD->WD,WD) OVER OVER ;
В FORTH ИТЭФ слово 2DUP было примитивом, вот его определение:
HEAD 204Q,'2DU',320Q,DUP2 ; 2DUP POP AX POP CX PUSH CX PUSH AX PUSH CX PUSH AX NEXT
Ссылки[править]
- Исходный текст слова 2DUP в Каллисто Классик 1.0
- См. слова ↑, 2DROP, 2SWAP
- Слово 2DUP (two-dupe) в стандарте ANS Forth (англ.)
- Слово 2DUP (two-dupe) в черновике Forth 200x (англ.)
- ВЫПОЛНЕНИЕ АРИФМЕТИЧЕСКИХ ОПЕРАЦИЙ в книге Л.Броуди «Начальный курс программирования на языке Форт»
- How to Get Results в книге Leo Brodie Starting Forth (англ.)
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |