FILL

Материал из ПМК вики
Перейти к навигации Перейти к поиску
Версия для печати больше не поддерживается и может содержать ошибки обработки. Обновите закладки браузера и используйте вместо этого функцию печати браузера по умолчанию.

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

FILL           ( a u c −− )                         Заполнить. Записать u байтов c, начиная с адреса a.

Слово FILL записывает u байт c в память, начиная с адреса a. Универсальный оператор для заполнения массивов памяти идентичными символами. На основе слова FILL реализованы специализированные слова ERASE и BLANK, заполняющие области памяти нулями и пробелами.

Ввод слова FILL

В режиме ЛАТ последовательно нажмите четыре клавиши  П   7       

FILL в стандарте ANS Forth

6.1.1540   FILL                                                            CORE
           ( c-addr u char -- )
           Если u больше чем нуль, сохраняет char в каждом из u 
           последовательных символов в памяти, начинающейся с c-addr.

История

Слово FILL пришло в Каллисто из Форта, где оно является древним и стабильным. В существующем ныне виде слово FILL известно с 1979 года и входит во все стандарты.

FILL в предыдущем стандарте Forth-83 (англ.)

     FILL         addr u 8b --                  83
          u bytes of memory beginning at addr are set to 8b.  No
          action is taken if u is zero.

FILL в стандарте Forth-79 (англ.)

FILL           addr n byte --                234
    Fill  memory beginning at address with a sequence of n  copies
    of  byte.   If the quantity n is less than or equal  to  zero,
    take no action.

FILL в fig-FORTH Release 1 glossary, май 1979 (англ.)

FILL addr quan b --
       Fill memory at the address with the specified quantity of bytes b.

Реализация

2000 ;#FILL
2001 ; FILL             ( a U c −− )                         Заполнить. Записать U байтов c, начиная с адреса a.
2002 ; Записать U байт c в память начиная с адреса a
2003 ; Заполнить массив памяти идентичными литерами.
2004 ; а − адрес первого байта памяти, куда будет засылаться байт c
2005 ; U − число заполняемых байтов
2006 ; Подразумевается, что граница памяти программ и данных не пересекается.
2007 LFILL:          .DB     4
2008                 .TEXT   "FILL"                  ; ( куда сколько что −− )
2009                 .DW     LCMOVEG
2010 FILL:           .DW     JFILL
2011 JFILL:          PKRM03 MB                       ; Литера
2012                 RM3 1 + 
2013 JFILL2:         M8 1 + MA  1 + M3
2014                 KRM8 M0 +/−  KX<09              ; Счётчик литер
2015                 KRMA 1 EE 4 −  KX>=09  1 − M5 RMB
2016 FILL1:          KM5  FL0 FILL1
2017                 KGOTO9

Реализация из SP-Forth 4.20:

CODE FILL ( c-addr u char -- ) \ 94
\ Если u больше нуля, заслать char в u байтов по адресу c-addr.
       MOV EDX, EDI
       MOV ECX, [EBP]
       MOV EDI, 4 [EBP]
       CLD
       \ можем ли заполнять DWORD?
       MOV EBX, ECX
       AND EBX, # 3
       JNZ @@1 \ низя
       \ сформируем DWORD
       MOV EBX, EAX
       SHL EAX, # 8
       OR  EAX, EBX
       SHL EAX, # 8
       OR  EAX, EBX
       SHL EAX, # 8
       OR  EAX, EBX
       MOV EBX, ECX
       
       SAR ECX, # 2
       REP STOS DWORD
       MOV ECX, EBX
       AND ECX, # 3
@@1:       
       REP STOS BYTE
       MOV EDI, EDX
       LEA EBP, 0C [EBP]
       MOV EAX, -4 [EBP]
       RET
END-CODE

Советская реализация

Описание и определение слова FILL в ядре ФОРТ-ЕС:

FILL      A,U,C-> ЗАСЛАТЬ С В U БАЙТОВ ПО АДРЕСУ А              22

                     Экран номер 22
( 31.03.86   FILL ERASE BLANK COMPILE [ ] MIN MAX HEX DECIMAL)

: FILL   ( A,U,C->) SWAP ?DUP IF >R OVER C!
     DUP 1+ R> 1- CMOVE EXIT THEN 2DROP ;

В FORTH ИТЭФ слово FILL было примитивом, который частично опирался на код примитива DROP, вот их определения:

            HEAD     204Q,'DRO',320Q,DROP                 ; DROP
   DRP:     ADD  SP, 2
            NEXT
            ...
            HEAD     204Q,'FIL',314Q,FILL                 ; FILL
            POP  AX      ; Символ
   FLL:     POP  CX      ; Счетчик символов
            CMP  CX, 0
            JLE  DRP     ;
            POP  BX
   $REPE:   MOV  BYTE PTR [BX],  AL
            INC  BX

            LOOP $REPE
            NEXT

Ссылки


  У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их.


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