20. Обработка длинных полей (цепочек).

Речь идет о так называемых цепочечных командах, которые иногда называют командами обработки строк символов. Дело в том, что строка символов — это последовательность байтов, а цепочка — это более общее название последовательностей элементов другого размера (слов или двойных слов).
Процессору абсолютно все равно, что храниться в такой последовательности – буквы, цифры или все вперемешку, главное – «что бы костюмчик сидел» , то есть что бы элементы имели подходящий размер, а еще составляли последовательный блок памяти. Так что описанные далее команды подойдут и для массива и для строки..
Для обработки цепочек имеются семь групп команд:

  • пересылки
  • сравнения
  • сканирования (поиска символа в строке)
  • загрузки элемента из цепочки
  • загрузки элемента в цепочку
  • получения элемента цепочки из порта ввода-вывода
  • вывода элемента цепочки в порт

Все они кроме обработки текущего элемента цепочки также модифицируют значения регистров si и/или di для перехода к следующему элементу последовательности. По требованию процессора строка источник располагается в основном сегменте данных (ее адрес определяется парой регистров DS:SI), а строка приемник – в дополнительном сегменте данных(ES:DI)!!!!!!!

Вот как это делается:
Dseg1 segment para public ‘data’ ;объявляем основной сегмент данных
Sent_source db ‘Это строка источник’ ;а в нем - строка источник
….
Dseq1 ENDS

Dseg2 segment para public ‘data’; а это – дополнительный сегмент кода
Sent_destination db ‘Это строка приемник’; и строка приемник
….
Dseq2 ENDS

Sseg segment para public ‘stack’; сегмент стека – это из другой оперы
Db 256 dup (?)

Cseg segment para public ‘code’; сегмент кода
Assume ds: Dseg1, es: Dseg2,  ss: Sseg, cs:Cseg; привязываем наши сегменты к соответствующим регистрам
Main proc FAR; это главная процедура
Mov ax, dseg1
Mov ds, ax; пересылаем главный сегмент данных в ds
Mov ax, dseg2
Mov es, ax; а дополнительный – в es
Lea si, Sent_source ;помещаем в si адрес строки-источника
Lea di, Sent_destination; а в di - приемника
END (Main)

По правде говоря, второй сегмент данных описывать совершенно не обязательно, более того, одна и та же строка в этой части кода может быть нужна как источник, а уже через две строчки она становиться приемником. Для того что бы не пересылать сотни раз данные с одного сегмента данных в другой или придумывать еще там какие костыли, мы могkи бы просто описать обе наши строчки в одном сегменте и привязать его обоим регистрам ds и es.

17.07.2015