Редактирование: CMOVE

Перейти к навигации Перейти к поиску
Внимание: Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы войдёте или создадите учётную запись, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий ниже, чтобы убедиться, что это нужная вам правка, и запишите страницу ниже, чтобы отменить правку.

Текущая версия Ваш текст
Строка 1: Строка 1:
[[Файл:cmove.gif|thumb|right|153px|Использование cmove ( addr1 addr2 u -- ).<br>Картинка из книги Лео Броди «Starting FORTH»]]
'''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 ==
== Ввод слова CMOVE ==
Строка 10: Строка 8:


== 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: Строка 28:


  Объяснение для 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: Строка 35:
           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: Строка 41:
     memory.  If n is zero nothing is moved.
     memory.  If n is zero nothing is moved.


=== CMOVE в fig-FORTH Release 1 glossary, май 1979 (англ.) ===
== CMOVE в fig-FORTH Release 1 glossary, май 1979 (англ.) ==
  CMOVE from to count --
  CMOVE from to count --
         Move the specified quantity of bytes beginning at address from to
         Move the specified quantity of bytes beginning at address from to
Строка 52: Строка 47:
         toward high memory. Further specification is necessary on word
         toward high memory. Further specification is necessary on word
         addressing computers.
         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}}
* См. также слова [[CMOVE〉|CMOVE&gt;]] [[FILL]] [[ERASE]] [[BLANK]]
* См. также слова [[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.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://www.forth200x.org/documents/html3/string/CMOVE.html CMOVE (c-move)] и [http://www.forth200x.org/documents/html3/rationale.html#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://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] ''(англ.)''




Строка 175: Строка 59:
[[Категория:Примитивы]]
[[Категория:Примитивы]]
[[Категория:Работа с памятью Каллисто]]
[[Категория:Работа с памятью Каллисто]]
[[Категория:Стандартные слова]]
[[Категория:Слова Каллисто без стековых диаграмм]]
[[Категория:1994 STRING]]
[[Категория:2012 STRING]]
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Pmkwiki:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

В целях защиты вики от автоматического спама в правках просим вас решить следующую каптчу:

Отменить Справка по редактированию (в новом окне)
Источник — https://pmk.the-hacker.ru/CMOVE