CMOVE
CMOVE (переслать) — стандартное слово Каллисто.
CMOVE ( a1 a2 u −− ) Копировать u байтов из a1 в a2.
Копирует побайтно область памяти размером u байт начиная с a1 и записывает её начиная с a2.
Сперва копируем содержимое байта с адресом a1, продолжаем в сторону больших адресов. Мы считаем, что блок не пересекает границ адресных пространств.
Ввод слова CMOVE
В режиме ЛАТ последовательно нажмите клавиши С/П ÷ 5 ↔ ИП
CMOVE в стандарте ANS Forth
17.6.1.0910 CMOVE "c-move" STRING ( c-addr1 c-addr2 u -- ) Если u больше чем нуль, копирует u последовательных символов из области данных начинающейся с c-addr1 в область, начинающуюся с c- addr2, выполняя посимвольно с наименьших адресов к наибольшим. Отличие с: 17.6.1.0920 CMOVE>. A.17.6.1.0910 CMOVE Если c-addr2 находится в пределах исходной области, (то есть, когда c-addr2 - не меньше чем c-addr1 и c-addr2 - меньше чем количество c-addr1 u CHARS +), происходит размножение памяти. Типичное использование: Предположите символьную строку по адресу 100: "ABCD". Тогда после 100 DUP CHAR+ 3 CMOVE строка по адресу 100 - "AAAA". Объяснение для CMOVE и CMOVE> вытекает из MOVE.
История
CMOVE в предыдущем стандарте Forth-83 (англ.)
CMOVE addr1 addr2 u -- 83 "c-move" Move u bytes beginning at address addr1 to addr2. The byte at addr1 is moved first, proceeding toward high memory. If u is zero nothing is moved.
CMOVE в стандарте Forth-79 (англ.)
CMOVE addr1 addr2 n -- 153 "c-move" Move n bytes beginning at address addr1 to addr2. The contents of addr1 is moved first proceeding toward high 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.
Реализация
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
Реализация из 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] 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
Советская реализация
Слово CMOVE в ФОРТ-ЕС было примитивом. Вот его описание и определение:
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
В FORTH ИТЭФ слово CMOVE также было примитивом, вот его определение:
; ** Работа с памятью ** 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
Ссылки
- Исходный текст слова CMOVE в Каллисто Классик 1.0
- См. также слова CMOVE> FILL ERASE BLANK
- Слово CMOVE (c-move) и комментарии к нему в стандарте ANS Forth (англ.)
- Слово CMOVE (c-move) и комментарий к нему в черновике Forth 200x (англ.)
- ВВОД-ВЫВОД в книге Л.Броуди «Начальный курс программирования на языке Форт»
- I/O and You в книге Leo Brodie Starting Forth (англ.)
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |