ОПЕРАЦИИ НАД СТРОКАМИ В ОПЕРАТИВНОЙ ПАМЯТИ
Команды для пересылки строк литер или массивов данных весьма просты. Каждой команде требуются три аргумента: исходный адрес, конечный адрес и значение счетчика.
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 \ инициализация выделенной памяти \ адресом МОП