Что такое эквивалент memcpy в Forth?

Если мне нужно скопировать часть памяти заданного размера, есть ли для этого типичное слово Форта? Что-то вроде C's memcpy или memmove?


person Veltas    schedule 23.11.2020    source источник


Ответы (1)


Копирование памяти

Стандарт Forth определяет MOVE в наборе слов Core для копирования произвольной памяти:

MOVE ( addr1 addr2 u -- )
Если u больше нуля, скопируйте содержимое u последовательных единиц адреса по адресу addr1 в u последовательных единиц адреса по адресу addr2. После завершения MOVE последовательные единицы адреса u по адресу addr2 содержат точно такое же количество последовательных единиц адреса u по адресу < em>addr1, который содержался перед перемещением.

Как и memmove, MOVE позволяет источнику и получателю перекрываться, как если бы копирование произошло с использованием промежуточного буфера.

Распространение строк

Стандарт Forth также определяет CMOVE и CMOVE> в наборе строковых слов:

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

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

CMOVE и CMOVE> копируют символы один за другим, по порядку, начиная с начала и конца строки соответственно.

MOVE уже способен безопасно копировать строки (используя CHARS для полного соответствия стандарту). Но CMOVE и CMOVE> можно использовать для простого повторения частей строки или реализации алгоритмов, аналогичных распаковке LZ77. . Это называется распространением. Например:

\ Allocate space for a string, starting with AB
CREATE str  'A' C, 'B' C, 18 CHARS ALLOT

str 2 TYPE  \ prints AB

\ Use CMOVE to propagate AB over rest of string
str  str 2 CHARS +  18  CMOVE

str 20 TYPE  \ prints ABABABABABABABABABAB

CMOVE> также известен как <CMOVE в старых версиях Forth.


В некоторых фортах есть слово COPY для простой записи содержимого блока поверх другого блока.

person Veltas    schedule 23.11.2020