CMOVE: различия между версиями
Перейти к навигации
Перейти к поиску
AtH (обсуждение | вклад) (→Ссылки) |
AtH (обсуждение | вклад) |
||
Строка 54: | Строка 54: | ||
== Реализация == | == Реализация == | ||
<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 | |||
1982 | |||
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> | |||
=== Советская реализация === | |||
Слово CMOVE в ФОРТ-ЕС было [[примитив]]ом. Вот его описание и определение: | Слово CMOVE в ФОРТ-ЕС было [[примитив]]ом. Вот его описание и определение: | ||
<PRE> | <PRE> |
Версия от 15:30, 9 ноября 2017
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 1982 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
Советская реализация
Слово 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 (англ.)
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |