Начальный курс программирования на языке Форт

         

ОПЕРАЦИИ НАД СТРОКАМИ В ОПЕРАТИВНОЙ ПАМЯТИ


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



MOVE

( a1 a2 u -- )

По ячеечное копирование участка памяти длиной u байтов, начинающегося с адреса a1, в участок памяти, начинающийся с а2. Пересылка идет с al В сторону увеличения адресов.

CMOVE

( al a2 u -- )

Побайтное копирование участка памяти длиной u байтов, начинающегося с a1, в участок памяти, начинающийся с а2. Пересылка идет с а1 в сторону увеличения адресов.

СМОVE>

( a1 a2 u -- )

Копирование участка памяти длиной u байтов, начинающегося с адреса a1, в участок памяти, начинающийся с адреса а2. Копирование начинается с КОНЦА строки и продвигается в сторону уменьшения адресов.

Заметим, что для этих команд существуют определенные соглашения (рассмотренные ранее):

  • если среди аргументов находятся источник и адресат, как это имело место в случае с COPY, то источник предшествует адресату;
  • если среди аргументов находятся адрес и счетчик, как это имело место в случае с TYPE, то адрес предшествует счетчику.

    Поэтому для перечисленных трех слов аргументы следуют в таком порядке: (источник адресат счетчик --). Для того чтобы переслать содержимое всего буфера в рабочую область, вы могли бы, к примеру, написать:210 BLOCK PAD 1024 CMOVE

    хотя на машинах с поячеечной адресацией памяти намного быстрее выполнялась бы последовательная пересылка ячеек (ячейка за ячейкой):210 BLOCK PAD 1024 MOVE

    Слово CMOVE> позволяет пересылать некоторую строку в область, которая расположена в памяти с большими адресами, но пересекается с исходной областью1.

    Для заполнения некоторого массива пробелами вы можете воспользоваться уже знакомым вам словом BLANK2. Например, внесите пробелы в 1024 байта рабочей области:PAD 1024 BLANK

    Это равносильно выражению: PAD 1024 BL FILL

    В большинстве систем слово BL определено как константа со значением 32.

    1 для начинающих Предположим, вы хотите передвинуть некоторую строку в памяти на один байт вправо (например, когда текстовый редактор включает в текст некоторый символ) Применив команду CMOVE, вы скопировали бы первую букву строки во второй байт, но при этом вторая литера строки оказалась бы «испорченной» В результате получилась бы строка, составленная из одного и того же символа Чтобы сохранить исходную строку, в данной ситуации нужно воспользовался словом CMOVE>

    2 для пользователей систем фиг-Форта. В вашей системе это слово BLANKS (ПРОБЕЛЫ)

    BLANK

    ( a u -- )

    Заполнение участка памяти длиной u байт символам пробела в коде ASCII.

    Остроумный, но не согласующийся со стандартом прием: для заполнения участка памяти многобайтным шаблоном примените слово CMOVE. При выполнении следующего выражения 20-байт-ный массив будет заполнен 10-ю копиями 16-разрядного адреса слова НОП:CREATE ТАБЛИЦА ' НОП , 18 ALLOT \ 10 ячеек ТАБЛИЦА DUP 2+ 18 CMOVE \ инициализация выделенной памяти \ адресом МОП



    Содержание раздела