CMOVE〉

Материал из ПМК вики
Перейти к навигации Перейти к поиску

CMOVE> — стандартное слово Каллисто.

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

Параметры слова CMOVE> те же, что у CMOVE, но копирование блока происходит, начиная с последнего байта. Это позволяет безопасно копировать те перекрывающиеся области памяти, на которых CMOVE сбоит.

Ввод слова CMOVE>[править]

В режиме ЛАТ последовательно нажмите клавиши  С/П   ÷   5      ИП     P   F   ИП 

Эти нажатия оставляют клавиатуру в режиме NUM.

CMOVE> в стандарте ANS Forth[править]

 17.6.1.0920   CMOVE>                  "c-move-up"                        STRING
            ( c-addr1 c-addr2 u -- )
            Если u больше чем нуль, копирует u последовательных символов из 
            области данных начинающейся с c-addr1 в область, начинающуюся с c-
            addr2, выполняя посимвольно с наибольших адресов к наименьшим.

        Отличие с: 17.6.1.0910 CMOVE.

 A.17.6.1.0920   CMOVE>
 Если c-addr1 находится в пределах области назначения, (то есть, когда c-addr1 
 больше чем или равно c-addr2 и c-addr2 - меньше чем количество c-addr1 u CHARS 
 +), происходит размножение памяти.

 Типичное использование:
 Предположите символьную строку по адресу 100: "ABCD".
 Тогда после

        100 DUP CHAR+ SWAP 3 CMOVE>, строка по адресу 100 - "DDDD".

История[править]

В 1983 году слово <CMOVE было переименовано в CMOVE> — лучше отражающее направление и способ перемещения участка памяти.

В таком виде слово и вошло в Каллисто.

CMOVE> в предыдущем стандарте Forth-83 (англ.)[править]

     CMOVE>       addr1 addr2 u --              83         "c-move-up"
          Move the u bytes at address addr1 to addr2.  The move begins
          by moving the byte at (addr1 plus u minus 1) to (addr2 plus
          u minus 1) and proceeds to successively lower addresses for
          u bytes.  If u is zero nothing is moved.  (Useful for
          sliding a string towards higher addresses).

<CMOVE в стандарте Forth-79 (англ.)[править]

<CMOVE         addr1 addr2 n --                    "reverse-c-move"
    Copy  n bytes beginning at addr1 to addr2.   The move proceeds
    within the bytes from high memory toward low memory.

Реализация[править]

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

Реализация из 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]
       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

Советская реализация[править]

Слово CMOVE> в ФОРТ-ЕС было примитивом. Вот его описание и определение:

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

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


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