Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
| '''CMOVE>''' — стандартное слово [[Каллисто]]. | | '''CMOVE>''' — стандартное слово [[Каллисто]]. |
| CMOVE> ( a1 a2 u −− ) Копировать u байтов из a1 в a2, начиная с больших адресов.
| |
| [[Файл:cmoveup.gif|thumb|right|150px|Использование cmove> ( addr1 addr2 u -- ).<br>Картинка из книги Лео Броди «Starting FORTH»]]
| |
|
| |
|
| Параметры слова CMOVE> те же, что у [[CMOVE]], но копирование блока происходит, начиная с последнего байта. Это позволяет безопасно копировать те перекрывающиеся области памяти, на которых [[CMOVE]] сбоит.
| |
|
| |
| == Ввод слова CMOVE> ==
| |
| В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша С/П|{{Чёрная клавиша|С/П}}]] [[Клавиша ÷|{{Серая клавиша|÷}}]] [[Клавиша 5|{{Серая клавиша|5}}]] [[Клавиша ↔|{{Серая клавиша|↔}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] [[Клавиша P|{{Синяя клавиша|P}}]] [[Клавиша F|{{Оранжевая клавиша|F}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]]
| |
|
| |
| Эти нажатия оставляют клавиатуру в [[Режим NUM|режиме NUM]].
| |
|
| |
|
| == 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 -- ) |
Строка 30: |
Строка 21: |
|
| |
|
| 100 DUP CHAR+ SWAP 3 CMOVE>, строка по адресу 100 - "DDDD". | | 100 DUP CHAR+ SWAP 3 CMOVE>, строка по адресу 100 - "DDDD". |
| </PRE>
| |
|
| |
| == История ==
| |
| В 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.
| |
|
| |
| == Реализация ==
| |
| <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>}} | | * [http://forth.sourceforge.net/standard/dpans/dpans17.htm#17.6.1.0920 Слово CMOVE> (c-move-up) в стандарте ANS Forth] ''(англ.)'' и [http://forth.sourceforge.net/standard/dpans/dpansa17.htm#A.17.6.1.0920 комментарии к нему] ''(англ.)'' |
| * См. также слова [[CMOVE]] [[FILL]] [[ERASE]] [[BLANK]]
| | * [http://www.forth200x.org/documents/html/string.html#string:CMOVEtop Слово CMOVE> (c-move-up) в черновике Forth 200x] ''(англ.)'' и [http://www.forth200x.org/documents/html/rationale.html#rat:string:CMOVEtop комментарий к нему] ''(англ.)'' |
| * Слово [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-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://www.forth.com/starting-forth/sf10/sf10.html I/O and You] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)''
| |
|
| |
|
|
| |
|
| | {{нет иллюстраций}} |
| {{заготовка}} | | {{заготовка}} |
| [[Категория:Слова Каллисто]] | | [[Категория:Слова Каллисто]] |
| [[Категория:Примитивы]]
| |
| [[Категория:Работа с памятью Каллисто]] | | [[Категория:Работа с памятью Каллисто]] |
| [[Категория:Стандартные слова]]
| |
| [[Категория:1994 STRING]]
| |
| [[Категория:2012 STRING]]
| |