CMOVE: различия между версиями

Материал из ПМК вики
Перейти к навигации Перейти к поиску
Нет описания правки
 
(не показано 25 промежуточных версий этого же участника)
Строка 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 -- )
Строка 21: Строка 27:
  Предположите символьную строку по адресу 100: "ABCD".
  Предположите символьную строку по адресу 100: "ABCD".
  Тогда после
  Тогда после


         100 DUP  CHAR+  3 CMOVE строка по адресу 100 - "AAAA".
         100 DUP  CHAR+  3 CMOVE строка по адресу 100 - "AAAA".


  Объяснение для CMOVE и CMOVE> вытекает из MOVE.
  Объяснение для CMOVE и CMOVE> вытекает из MOVE.
</PRE>
== История ==
=== 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.
== Реализация ==
<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>


== Ссылки ==
== Ссылки ==
* [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}}
* [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 комментарий к нему] ''(англ.)''
* См. также слова [[CMOVE〉|CMOVE&gt;]] [[FILL]] [[ERASE]] [[BLANK]]
* Слово [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]]

Текущая версия от 17:09, 10 ноября 2017

CMOVE (переслать) — стандартное слово Каллисто.

CMOVE          ( a1 a2 u −− )                       Копировать u байтов из a1 в a2.
Использование cmove ( addr1 addr2 u -- ).
Картинка из книги Лео Броди «Starting FORTH»

Копирует побайтно область памяти размером 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

Ссылки[править]


  Это заготовка статьи. Вы можете помочь проекту, дополнив её.