Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
| '''CMOVE''' (переслать) — стандартное слово [[Каллисто]]. | | '''CMOVE''' — стандартное слово [[Каллисто]]. |
| CMOVE ( a1 a2 u −− ) Копировать u байтов из a1 в a2.
| | |
| [[Файл:cmove.gif|thumb|right|153px|Использование cmove ( addr1 addr2 u -- ).<br>Картинка из книги Лео Броди «Starting FORTH»]]
| |
| Копирует побайтно область памяти размером u байт начиная с a1 и записывает её начиная с a2. | | Копирует побайтно область памяти размером u байт начиная с a1 и записывает её начиная с a2. |
|
| |
|
| Сперва копируем содержимое байта с адресом a1, продолжаем в сторону больших адресов. Мы считаем, что блок не пересекает границ адресных пространств.
| |
|
| |
| == Ввод слова CMOVE ==
| |
| В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша С/П|{{Чёрная клавиша|С/П}}]] [[Клавиша ÷|{{Серая клавиша|÷}}]] [[Клавиша 5|{{Серая клавиша|5}}]] [[Клавиша ↔|{{Серая клавиша|↔}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]]
| |
|
| |
|
| == CMOVE в стандарте ANS Forth == | | == CMOVE в стандарте ANS Forth == |
| <PRE>
| |
| 17.6.1.0910 CMOVE "c-move" STRING | | 17.6.1.0910 CMOVE "c-move" STRING |
| ( c-addr1 c-addr2 u -- ) | | ( c-addr1 c-addr2 u -- ) |
Строка 31: |
Строка 25: |
|
| |
|
| Объяснение для CMOVE и CMOVE> вытекает из MOVE. | | Объяснение для CMOVE и CMOVE> вытекает из MOVE. |
| </PRE>
| |
|
| |
|
| == История ==
| | |
| === CMOVE в предыдущем стандарте Forth-83 (англ.) ===
| | == CMOVE в предыдущем стандарте Forth-83 (англ.) == |
| CMOVE addr1 addr2 u -- 83 "c-move" | | CMOVE addr1 addr2 u -- 83 "c-move" |
| Move u bytes beginning at address addr1 to addr2. The byte | | Move u bytes beginning at address addr1 to addr2. The byte |
Строка 40: |
Строка 33: |
| u is zero nothing is moved. | | u is zero nothing is moved. |
|
| |
|
| === CMOVE в стандарте Forth-79 (англ.) ===
| | |
| | == CMOVE в стандарте Forth-79 (англ.) == |
| CMOVE addr1 addr2 n -- 153 "c-move" | | CMOVE addr1 addr2 n -- 153 "c-move" |
| Move n bytes beginning at address addr1 to addr2. The | | Move n bytes beginning at address addr1 to addr2. The |
Строка 46: |
Строка 40: |
| memory. If n is zero nothing is moved. | | memory. If n is zero nothing is moved. |
|
| |
|
| === CMOVE в fig-FORTH Release 1 glossary, май 1979 (англ.) ===
| |
| CMOVE from to count --
| |
| Move the specified quantity of bytes beginning at address from to
| |
| address to. The contents of address from is moved first proceeding
| |
| toward high memory. Further specification is necessary on word
| |
| addressing computers.
| |
|
| |
| == Реализация ==
| |
| <pre>
| |
| 1961 ; ∗∗ Работа с памятью ∗∗
| |
| 1962 ;
| |
| 1963 ;#CMOVE
| |
| 1964 ; CMOVE ( a1 a2 U −− ) Копировать U байтов из a1 в a2.
| |
| 1965 ; Копирует побайтно область памяти размером U байт, начиная с a1, и записывает её начиная с a2.
| |
| 1966 ; Сперва копируем содержимое байта с адресом a1, продолжаем в сторону больших адресов.
| |
| 1967 ; Подразумевается, что блок не пересекает границ адресных пространств.
| |
| 1968 LCMOVE: .DB 5
| |
| 1969 .TEXT "CMOVE" ; ( откуда куда сколько −− )
| |
| 1970 .DW LDROP
| |
| 1971 CMOVE: .DW JCMOVE
| |
| 1972 JCMOVE: PKRM03 M0 ; Счётчик
| |
| 1973 RM3 1 + M8 1 + MA 1 + M3
| |
| 1974 RM0 +/− KX<09
| |
| 1975 KRM8 1 EE 4 − KX>=09 1 − M5 ; Куда (только в память данных)
| |
| 1976 KRMA MA 1 EE 4 − PX<0 CMOVER0 ; Откуда
| |
| 1977 RMA
| |
| 1978 CMOVEP: KPRGM KM5 RMA 1 + MA
| |
| 1979 PFL0 CMOVEP KGOTO9
| |
| 1980 CMOVER0: 1 − M4 ; Прединкримент
| |
| 1981 CMOVERL: Cx KRM4 KM5 FL0 CMOVERL KGOTO9
| |
| </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]
| |
| CLD
| |
| \ перекрываются ли области данных?
| |
| \ если нет, то можно копировать DWORD
| |
| MOV EBX, EDI
| |
| SUB EBX, ESI
| |
| JG SHORT @@2
| |
| NEG EBX
| |
| @@2: CMP EBX, EAX
| |
| JL SHORT @@1
| |
|
| |
| \ если выровняем на 4, то копируется в 3 раза быстрее
| |
| MOV EBX, EDI
| |
| AND EBX, # 3
| |
| JZ SHORT @@3
| |
| MOV ECX, # 4
| |
| SUB ECX, EBX
| |
|
| |
| CMP ECX, EAX
| |
| JL SHORT @@4
| |
| MOV ECX, EAX
| |
| JMP @@1 \ нечего выравнивать
| |
| @@4:
| |
| SUB EAX, ECX
| |
| REP MOVS BYTE
| |
| MOV ECX, EAX
| |
| @@3:
| |
| SAR ECX, # 2
| |
| \ вот здесь хорошо бы в MMX копировать
| |
| REP MOVS DWORD
| |
| MOV ECX, EAX
| |
| AND ECX, # 3
| |
| @@1:
| |
| REP MOVS BYTE
| |
| LEA EBP, 0C [EBP]
| |
| MOV EAX, -4 [EBP]
| |
| MOV EDI, EDX
| |
| RET
| |
| END-CODE
| |
| </pre>
| |
|
| |
| === Советская реализация ===
| |
| Слово CMOVE в ФОРТ-ЕС было [[примитив]]ом. Вот его описание и определение:
| |
| <PRE>
| |
| CMOVE A1,A2,U-> ПЕРЕСЛАТЬ U БАЙТОВ ОТ А1 В А2 21
| |
|
| |
| Экран номер 21
| |
| ( 31.03.86 CMOVE CMOVE> )
| |
|
| |
| CODE CMOVE ( A1,A2,U ->) 14 LHRW12 BAL, RW2 RMASK NR, 2 =F BZ,
| |
| RW1 RMASK NR, RW1 RFORTH AR, 1 FIRST 4 +(, LH, 1 RMASK NR,
| |
| 1 RFORTH AR, 0 256 LA, 1 =F В, BEGIN, 0 (, 256 RW1 ), 0 (, 1
| |
| MVC, RW1 0 AR, 1 0 AR,
| |
| 1 =Н RW2 0 SR, ?M UNTIL, RW2 0 BCTR,
| |
| RW2 0 AR, ?NM IF, RW2 3 =F EX, THEN,
| |
| 2 =H RSTACK 6 (, 0 RSTACK LA, RNEXT BR,
| |
| 3 =H 0 (, 1 RW1 ), 0 (, 1 MVC, END-CODE
| |
| </PRE>
| |
| В FORTH ИТЭФ слово CMOVE также было [[примитив]]ом, вот его определение:
| |
| <PRE>
| |
| ; ** Работа с памятью **
| |
|
| |
| HEAD 205Q,'CMOV',305Q,CMOVE ; CMOVE
| |
| POP CX ; Счетчик
| |
| CMP CX, 0
| |
| JLE PRO
| |
| MOV AX, DI ; Сохранение содержимого DI,SI
| |
| MOV BX, SI
| |
| POP DI ; Куда
| |
| POP SI ; Откуда
| |
| REP MOV ES: BYTE PTR [DI], DS:[SI]
| |
| MOV DI, AX ; Восстановление DI,SI
| |
| MOV SI, BX
| |
| NEXT
| |
| </PRE>
| |
|
| |
|
| == Ссылки == | | == Ссылки == |
| * {{Исходник|CMOVE|CMOVE}} | | * [http://forth.sourceforge.net/standard/dpans/dpans17.htm#17.6.1.0910 Слово CMOVE (c-move) в стандарте ANS Forth] ''(англ.)'' и [http://forth.sourceforge.net/standard/dpans/dpansa17.htm#A.17.6.1.0910 комментарии к нему] ''(англ.)'' |
| * См. также слова [[CMOVE〉|CMOVE>]] [[FILL]] [[ERASE]] [[BLANK]]
| | * [http://www.forth200x.org/documents/html/string.html#string:CMOVE Слово CMOVE (c-move) в черновике Forth 200x] ''(англ.)'' и [http://www.forth200x.org/documents/html/rationale.html#rat:string:CMOVE комментарий к нему] ''(англ.)'' |
| * Слово [http://forth.sourceforge.net/standard/dpans/dpans17.htm#17.6.1.0910 CMOVE (c-move)] и [http://forth.sourceforge.net/standard/dpans/dpansa17.htm#A.17.6.1.0910 комментарии к нему] в стандарте ANS Forth ''(англ.)''
| |
| * Слово [http://forth-standard.org/standard/string/CMOVE CMOVE (c-move)] и [http://forth-standard.org/standard/rationale#rat:string:CMOVE комментарий к нему] в черновике 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]]
| |