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

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

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

Текущая версия Ваш текст
Строка 1: Строка 1:
[[Файл:cmoveup.gif|thumb|right|150px|Использование cmove&gt; ( addr1 addr2 u -- ).<br>Картинка из книги Лео Броди «Starting FORTH»]]
'''CMOVE&gt;''' — стандартное слово [[Каллисто]].
'''CMOVE&gt;''' — стандартное слово [[Каллисто]].
CMOVE>        ( a1 a2 u −− )                      Копировать u байтов из a1 в a2, начиная с больших адресов.
[[Файл:cmoveup.gif|thumb|right|150px|Использование cmove&gt; ( addr1 addr2 u -- ).<br>Картинка из книги Лео Броди «Starting FORTH»]]
Параметры слова CMOVE&gt; те же, что у [[CMOVE]], но копирование блока происходит, начиная с последнего байта. Это позволяет безопасно копировать те перекрывающиеся области памяти, на которых [[CMOVE]] сбоит.


== Ввод слова CMOVE&gt; ==
== Ввод слова CMOVE&gt; ==
Строка 11: Строка 8:


== CMOVE&gt; в стандарте ANS Forth ==
== CMOVE&gt; в стандарте ANS Forth ==
<PRE>
  17.6.1.0920  CMOVE>                  "c-move-up"                        STRING
  17.6.1.0920  CMOVE>                  "c-move-up"                        STRING
             ( c-addr1 c-addr2 u -- )
             ( c-addr1 c-addr2 u -- )
Строка 30: Строка 26:


         100 DUP CHAR+ SWAP 3 CMOVE>, строка по адресу 100 - "DDDD".
         100 DUP CHAR+ SWAP 3 CMOVE>, строка по адресу 100 - "DDDD".
</PRE>
== История ==
В 1983 году слово &lt;CMOVE было переименовано в CMOVE&gt; — лучше отражающее направление и способ перемещения участка памяти.
В таком виде слово и вошло в [[Каллисто]].


=== CMOVE&gt; в предыдущем стандарте Forth-83 (англ.) ===
== CMOVE&gt; в предыдущем стандарте Forth-83 (англ.) ==
       CMOVE>      addr1 addr2 u --              83        "c-move-up"
       CMOVE>      addr1 addr2 u --              83        "c-move-up"
           Move the u bytes at address addr1 to addr2.  The move begins
           Move the u bytes at address addr1 to addr2.  The move begins
Строка 45: Строка 35:
           sliding a string towards higher addresses).
           sliding a string towards higher addresses).


=== &lt;CMOVE в стандарте Forth-79 (англ.) ===
== &lt;CMOVE в стандарте Forth-79 (англ.) ==
  <CMOVE        addr1 addr2 n --                    "reverse-c-move"
  <CMOVE        addr1 addr2 n --                    "reverse-c-move"
     Copy  n bytes beginning at addr1 to addr2.  The move proceeds
     Copy  n bytes beginning at addr1 to addr2.  The move proceeds
     within the bytes from high memory toward low memory.
     within the bytes from high memory toward low memory.


== Реализация ==
== История ==
<pre>
В 1983 году слово &lt;CMOVE было переименовано в CMOVE&gt; — лучше отражающее направление и способ перемещения участка памяти.
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>
Реализация из 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]
      STD
      ADD EDI, ECX
      DEC EDI
      ADD ESI, ECX
      DEC ESI
      REP MOVS BYTE
      CLD
      MOV EDI, EDX
      LEA EBP, 0C [EBP]
      MOV EAX, -4 [EBP]
      RET
END-CODE
</pre>
 
=== Советская реализация ===
Слово CMOVE&gt; в ФОРТ-ЕС было [[примитив]]ом. Вот его описание и определение:
<PRE>
CMOVE>    A1,A2,U-> ПЕРЕСЛАТЬ U БАЙТОВ ОТ АДРЕСА А1            21
          ПО АДРЕСУ А2 НАЧИНАЯ С БОЛЬШИХ АДРЕСОВ
 
                    Экран номер 21
( 31.03.86      CMOVE  CMOVE> )
 
CODE CMOVE> ( A1,A2,U->) 14 LHRW12 BAL, RW2 RMASK NR, 1 =F  BZ,
RW1 РМASК NR, RW1 RFORTH AR, RW1 0 BCTR,
1 FIRST 4 +(,  LH,  1 RMASK NR, 1 RFORTH AR,  1 0 BCTR,
DO, 0 0 (, 1 RM2 1C, 0 0 (, RW1 RW2 STC, RW2  LOOPBCT,
1 =H  RSTACK 6 (, 0 RSTACK LA,  RNEXT BR, END-CODE
</PRE>


== Ссылки ==
== Ссылки ==
* {{Исходник|CMOVEtop|CMOVE&gt;}}
* См. также слова [[CMOVE]] [[FILL]] [[ERASE]] [[BLANK]]
* См. также слова [[CMOVE]] [[FILL]] [[ERASE]] [[BLANK]]
* Слово [http://forth.sourceforge.net/standard/dpans/dpans17.htm#17.6.1.0920 CMOVE&gt; (c-move-up)] и [http://forth.sourceforge.net/standard/dpans/dpansa17.htm#A.17.6.1.0920 комментарий к нему] в стандарте ANS Forth ''(англ.)''
* Слово [http://forth.sourceforge.net/standard/dpans/dpans17.htm#17.6.1.0920 CMOVE&gt; (c-move-up)] и [http://forth.sourceforge.net/standard/dpans/dpansa17.htm#A.17.6.1.0920 комментарий к нему] в стандарте ANS Forth ''(англ.)''
* Слово [http://forth-standard.org/standard/string/CMOVEtop CMOVE&gt; (c-move-up)] и [http://forth-standard.org/standard/rationale#rat:string:CMOVEtop комментарий к нему] в черновике Forth 200x ''(англ.)''
* Слово [http://www.forth200x.org/documents/html3/string/CMOVEtop.html CMOVE&gt; (c-move-up)] и [http://www.forth200x.org/documents/html3/rationale.html#rat:string:CMOVEtop комментарий к нему] в черновике 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] ''(англ.)''
* [http://www.forth.com/starting-forth/sf10/sf10.html I/O and You] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)''
Строка 122: Строка 55:
[[Категория:Примитивы]]
[[Категория:Примитивы]]
[[Категория:Работа с памятью Каллисто]]
[[Категория:Работа с памятью Каллисто]]
[[Категория:Стандартные слова]]
[[Категория:Слова Каллисто без стековых диаграмм]]
[[Категория:1994 STRING]]
[[Категория:2012 STRING]]
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Pmkwiki:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

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

Отменить Справка по редактированию (в новом окне)