CMOVE〉: различия между версиями
Перейти к навигации
Перейти к поиску
AtH (обсуждение | вклад) (→Ссылки) |
AtH (обсуждение | вклад) |
||
(не показано 10 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
'''CMOVE>''' — стандартное слово [[Каллисто]]. | |||
CMOVE> ( a1 a2 u −− ) Копировать u байтов из a1 в a2, начиная с больших адресов. | |||
[[Файл:cmoveup.gif|thumb|right|150px|Использование cmove> ( addr1 addr2 u -- ).<br>Картинка из книги Лео Броди «Starting FORTH»]] | [[Файл:cmoveup.gif|thumb|right|150px|Использование cmove> ( addr1 addr2 u -- ).<br>Картинка из книги Лео Броди «Starting FORTH»]] | ||
Параметры слова CMOVE> те же, что у [[CMOVE]], но копирование блока происходит, начиная с последнего байта. Это позволяет безопасно копировать те перекрывающиеся области памяти, на которых [[CMOVE]] сбоит. | |||
== Ввод слова CMOVE> == | == Ввод слова CMOVE> == | ||
Строка 8: | Строка 11: | ||
== CMOVE> в стандарте ANS Forth == | == CMOVE> в стандарте ANS Forth == | ||
<PRE> | |||
17.6.1.0920 CMOVE> "c-move-up" STRING | 17.6.1.0920 CMOVE> "c-move-up" STRING | ||
( c-addr1 c-addr2 u -- ) | ( c-addr1 c-addr2 u -- ) | ||
Строка 26: | Строка 30: | ||
100 DUP CHAR+ SWAP 3 CMOVE>, строка по адресу 100 - "DDDD". | 100 DUP CHAR+ SWAP 3 CMOVE>, строка по адресу 100 - "DDDD". | ||
</PRE> | |||
== История == | |||
В 1983 году слово <CMOVE было переименовано в CMOVE> — лучше отражающее направление и способ перемещения участка памяти. | |||
В таком виде слово и вошло в [[Каллисто]]. | |||
== CMOVE> в предыдущем стандарте Forth-83 (англ.) == | === CMOVE> в предыдущем стандарте Forth-83 (англ.) === | ||
CMOVE> addr1 addr2 u -- 83 "c-move-up" | CMOVE> addr1 addr2 u -- 83 "c-move-up" | ||
Move the u bytes at address addr1 to addr2. The move begins | Move the u bytes at address addr1 to addr2. The move begins | ||
Строка 35: | Строка 45: | ||
sliding a string towards higher addresses). | sliding a string towards higher addresses). | ||
== <CMOVE в стандарте Forth-79 (англ.) == | === <CMOVE в стандарте Forth-79 (англ.) === | ||
<CMOVE addr1 addr2 n -- "reverse-c-move" | <CMOVE addr1 addr2 n -- "reverse-c-move" | ||
Copy n bytes beginning at addr1 to addr2. The move proceeds | Copy n bytes beginning at addr1 to addr2. The move proceeds | ||
within the bytes from high memory toward low memory. | within the bytes from high memory toward low memory. | ||
== | == Реализация == | ||
<pre> | |||
1983 ;#CMOVEtop | |||
1984 ; CMOVE> ( a1 a2 U −− ) Копировать U байтов из a1 в a2, начиная с больших адресов. | |||
1985 LCMOVEG: .DB 6 | |||
1986 .TEXT "CMOVE>" ; ( откуда куда сколько −− ) | |||
1987 .DW LCMOVE | |||
1988 CMOVEG: .DW JCMOVEG | |||
1989 JCMOVEG: PKRM03 M0 ; Счётчик | |||
1990 RM3 1 + MB 1 + MA 1 + M3 M8 ; R8 := SP (R3) | |||
1991 KRMB 1 EE 4 − KX>=09 | |||
1992 RM0 +/− KX<09 − M1 ; R1 := Куда, конец блока | |||
1993 KRMA MA 1 EE 4 − FX<0 CMVGR0 | |||
1994 RMA RM0 + | |||
1995 CMVGP: MA KPRGM KM1 RMA 1 − FL0 CMVGP KGOTO9 | |||
1996 CMVGR0: RM0 + M3 | |||
1997 CMVGRL: Cx KRM3 KM1 FL0 CMVGRL | |||
1998 RM8 M3 KGOTO9 ; R3 (SP) := R8 | |||
</pre> | |||
Реализация из SP-Forth 4.20: | |||
<pre> | |||
CODE CMOVE> ( c-addr1 c-addr2 u -- ) \ 94 STRING | |||
\ Если u больше нуля, копировать u последовательных символов из пространства | |||
\ данных начиная с адреса c-addr1 в c-addr2, символ за символом, начиная со | |||
\ старших адресов к младшим. | |||
MOV EDX, EDI | |||
MOV ECX, EAX | |||
MOV EDI, [EBP] | |||
MOV ESI, 4 [EBP] | |||
STD | |||
ADD EDI, ECX | |||
DEC EDI | |||
ADD ESI, ECX | |||
DEC ESI | |||
REP MOVS BYTE | |||
CLD | |||
MOV EDI, EDX | |||
LEA EBP, 0C [EBP] | |||
MOV EAX, -4 [EBP] | |||
RET | |||
END-CODE | |||
</pre> | |||
=== Советская реализация === | |||
Слово CMOVE> в ФОРТ-ЕС было [[примитив]]ом. Вот его описание и определение: | |||
<PRE> | |||
CMOVE> A1,A2,U-> ПЕРЕСЛАТЬ U БАЙТОВ ОТ АДРЕСА А1 21 | |||
ПО АДРЕСУ А2 НАЧИНАЯ С БОЛЬШИХ АДРЕСОВ | |||
Экран номер 21 | |||
( 31.03.86 CMOVE CMOVE> ) | |||
CODE CMOVE> ( A1,A2,U->) 14 LHRW12 BAL, RW2 RMASK NR, 1 =F BZ, | |||
RW1 РМASК NR, RW1 RFORTH AR, RW1 0 BCTR, | |||
1 FIRST 4 +(, LH, 1 RMASK NR, 1 RFORTH AR, 1 0 BCTR, | |||
DO, 0 0 (, 1 RM2 1C, 0 0 (, RW1 RW2 STC, RW2 LOOPBCT, | |||
1 =H RSTACK 6 (, 0 RSTACK LA, RNEXT BR, END-CODE | |||
</PRE> | |||
== Ссылки == | == Ссылки == | ||
* {{Исходник|CMOVEtop|CMOVE>}} | |||
* См. также слова [[CMOVE]] [[FILL]] [[ERASE]] [[BLANK]] | * См. также слова [[CMOVE]] [[FILL]] [[ERASE]] [[BLANK]] | ||
* Слово [http://forth.sourceforge.net/standard/dpans/dpans17.htm#17.6.1.0920 CMOVE> (c-move-up)] и [http://forth.sourceforge.net/standard/dpans/dpansa17.htm#A.17.6.1.0920 комментарий к нему] в стандарте ANS Forth ''(англ.)'' | * Слово [http://forth.sourceforge.net/standard/dpans/dpans17.htm#17.6.1.0920 CMOVE> (c-move-up)] и [http://forth.sourceforge.net/standard/dpans/dpansa17.htm#A.17.6.1.0920 комментарий к нему] в стандарте ANS Forth ''(англ.)'' | ||
* Слово [http:// | * Слово [http://forth-standard.org/standard/string/CMOVEtop CMOVE> (c-move-up)] и [http://forth-standard.org/standard/rationale#rat:string:CMOVEtop комментарий к нему] в черновике Forth 200x ''(англ.)'' | ||
* [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH\10.WWOD-WYWOD ВВОД-ВЫВОД] в книге [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH Л.Броуди «Начальный курс программирования на языке Форт»] | * [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH\10.WWOD-WYWOD ВВОД-ВЫВОД] в книге [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH Л.Броуди «Начальный курс программирования на языке Форт»] | ||
* [http://www.forth.com/starting-forth/sf10/sf10.html I/O and You] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)'' | * [http://www.forth.com/starting-forth/sf10/sf10.html I/O and You] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)'' | ||
Строка 55: | Строка 122: | ||
[[Категория:Примитивы]] | [[Категория:Примитивы]] | ||
[[Категория:Работа с памятью Каллисто]] | [[Категория:Работа с памятью Каллисто]] | ||
[[Категория: | [[Категория:Стандартные слова]] | ||
[[Категория:1994 STRING]] | |||
[[Категория:2012 STRING]] |
Текущая версия от 17:10, 10 ноября 2017
CMOVE> — стандартное слово Каллисто.
CMOVE> ( a1 a2 u −− ) Копировать u байтов из a1 в a2, начиная с больших адресов.
Параметры слова CMOVE> те же, что у CMOVE, но копирование блока происходит, начиная с последнего байта. Это позволяет безопасно копировать те перекрывающиеся области памяти, на которых CMOVE сбоит.
Ввод слова CMOVE>[править]
В режиме ЛАТ последовательно нажмите клавиши С/П ÷ 5 ↔ ИП P F ИП
Эти нажатия оставляют клавиатуру в режиме NUM.
CMOVE> в стандарте ANS Forth[править]
17.6.1.0920 CMOVE> "c-move-up" STRING ( c-addr1 c-addr2 u -- ) Если u больше чем нуль, копирует u последовательных символов из области данных начинающейся с c-addr1 в область, начинающуюся с c- addr2, выполняя посимвольно с наибольших адресов к наименьшим. Отличие с: 17.6.1.0910 CMOVE. A.17.6.1.0920 CMOVE> Если c-addr1 находится в пределах области назначения, (то есть, когда c-addr1 больше чем или равно c-addr2 и c-addr2 - меньше чем количество c-addr1 u CHARS +), происходит размножение памяти. Типичное использование: Предположите символьную строку по адресу 100: "ABCD". Тогда после 100 DUP CHAR+ SWAP 3 CMOVE>, строка по адресу 100 - "DDDD".
История[править]
В 1983 году слово <CMOVE было переименовано в CMOVE> — лучше отражающее направление и способ перемещения участка памяти.
В таком виде слово и вошло в Каллисто.
CMOVE> в предыдущем стандарте Forth-83 (англ.)[править]
CMOVE> addr1 addr2 u -- 83 "c-move-up" Move the u bytes at address addr1 to addr2. The move begins by moving the byte at (addr1 plus u minus 1) to (addr2 plus u minus 1) and proceeds to successively lower addresses for u bytes. If u is zero nothing is moved. (Useful for sliding a string towards higher addresses).
<CMOVE в стандарте Forth-79 (англ.)[править]
<CMOVE addr1 addr2 n -- "reverse-c-move" Copy n bytes beginning at addr1 to addr2. The move proceeds within the bytes from high memory toward low memory.
Реализация[править]
1983 ;#CMOVEtop 1984 ; CMOVE> ( a1 a2 U −− ) Копировать U байтов из a1 в a2, начиная с больших адресов. 1985 LCMOVEG: .DB 6 1986 .TEXT "CMOVE>" ; ( откуда куда сколько −− ) 1987 .DW LCMOVE 1988 CMOVEG: .DW JCMOVEG 1989 JCMOVEG: PKRM03 M0 ; Счётчик 1990 RM3 1 + MB 1 + MA 1 + M3 M8 ; R8 := SP (R3) 1991 KRMB 1 EE 4 − KX>=09 1992 RM0 +/− KX<09 − M1 ; R1 := Куда, конец блока 1993 KRMA MA 1 EE 4 − FX<0 CMVGR0 1994 RMA RM0 + 1995 CMVGP: MA KPRGM KM1 RMA 1 − FL0 CMVGP KGOTO9 1996 CMVGR0: RM0 + M3 1997 CMVGRL: Cx KRM3 KM1 FL0 CMVGRL 1998 RM8 M3 KGOTO9 ; R3 (SP) := R8
Реализация из SP-Forth 4.20:
CODE CMOVE> ( c-addr1 c-addr2 u -- ) \ 94 STRING \ Если u больше нуля, копировать u последовательных символов из пространства \ данных начиная с адреса c-addr1 в c-addr2, символ за символом, начиная со \ старших адресов к младшим. MOV EDX, EDI MOV ECX, EAX MOV EDI, [EBP] MOV ESI, 4 [EBP] STD ADD EDI, ECX DEC EDI ADD ESI, ECX DEC ESI REP MOVS BYTE CLD MOV EDI, EDX LEA EBP, 0C [EBP] MOV EAX, -4 [EBP] RET END-CODE
Советская реализация[править]
Слово CMOVE> в ФОРТ-ЕС было примитивом. Вот его описание и определение:
CMOVE> A1,A2,U-> ПЕРЕСЛАТЬ U БАЙТОВ ОТ АДРЕСА А1 21 ПО АДРЕСУ А2 НАЧИНАЯ С БОЛЬШИХ АДРЕСОВ Экран номер 21 ( 31.03.86 CMOVE CMOVE> ) CODE CMOVE> ( A1,A2,U->) 14 LHRW12 BAL, RW2 RMASK NR, 1 =F BZ, RW1 РМASК NR, RW1 RFORTH AR, RW1 0 BCTR, 1 FIRST 4 +(, LH, 1 RMASK NR, 1 RFORTH AR, 1 0 BCTR, DO, 0 0 (, 1 RM2 1C, 0 0 (, RW1 RW2 STC, RW2 LOOPBCT, 1 =H RSTACK 6 (, 0 RSTACK LA, RNEXT BR, END-CODE
Ссылки[править]
- Исходный текст слова CMOVE> в Каллисто Классик 1.0
- См. также слова CMOVE FILL ERASE BLANK
- Слово CMOVE> (c-move-up) и комментарий к нему в стандарте ANS Forth (англ.)
- Слово CMOVE> (c-move-up) и комментарий к нему в черновике Forth 200x (англ.)
- ВВОД-ВЫВОД в книге Л.Броуди «Начальный курс программирования на языке Форт»
- I/O and You в книге Leo Brodie Starting Forth (англ.)
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |