Цепочечные команды или команды обработки строк символов
Лекция №9. Структуры. Записи. Объединения. Работа с файлами.
Адресное_выражение.имя_поля_структуры
Методы работы со структурой
Для того чтобы сослаться в команде на поле некоторой структуры, используется специальный оператор — символ «.» Он используется в следующей синтаксической конструкции:
Здесь:
адресное_выражение — идентификатор переменной некоторого структурного типа или некое выражение (рис. 1);
имя_поля_структуры — имя поля из шаблона структуры. Это смещение поля от начала структуры.
Таким образом оператор. вычисляет выражение:
(адресное_выражение) + (имя_поля_структуры)
Рис. 1. Синтаксис адресного выражения в операторе обращения к полю структуры.
К примеру, требуется извлечь в ax значения поля с возрастом. Из-за принципа хранения данных «старший байт по младшему адресу» старшая цифра возраста будет помещена в аl, а младшая — в ah. Для корректировки достаточно использовать команду xchg al,ah:
mov ax,word ptr sotr1.age ;в ах возраст sotr1
xchg ah,al
;a можно и так:
lea bx,sotrl
mov ax,word ptr [bx].age
xchg ah,al
Определим массив из 10 структур типа worker:
mas_sotr worker 10 dup (<>)
Размер в байтах, занимаемый полями структуры можно получить с помощью оператора type. После того, как стал известен размер экземпляра структуры, организовать индексацию в массиве структур можно следующим образом. К примеру:
worker struc
...
worker ends
...
mas_sotr worker 10 dup (<>)
...
mov bx,type worker ;bx=77
lea di,mas_sotr
;извлечь и вывести на экран возраст всех сотрудников:
mov сх,10
cycl:
mov dl,[di].age
add di,bx ;к следующей структуре в массиве mas_sort
loop cycl
Пример: Выполним копирование поля nam третьего сотрудника в поле nam пятого сотрудника:
worker struc
...
worker ends
mas_sotr worker 10 dup (<>)
...
mov ebx,offset mas_sotr
mov esi,(type worker)*2 ;si=77*2
add esi,ebx
mov edi,(type worker)*4 ;di=77*4
add edi,ebx
mov cx,30
rep movsb [edi].nam,[esi].nam
Цепочечные команды позволяют проводить действия над блоками памяти, представляющими собой последовательности элементов следующего размера:
Особенность всех цепочечных команд в том, что они, кроме обработки текущего элемента цепочки, осуществляют ещё и автоматическое продвижение к следующему элементу данной цепочки.
В системе команд микропроцессора имеются семь операций примитивов обработки цепочек:
1) пересылка цепочки:
– movs адрес приёмника, адрес_источника
– movsb
– movsw
– movsd
2) сравнение цепочек:
– cmps адрес_приёмника, адрес_источника
– cmpsb
– cmpsw
– cmpsd
3) сканирование цепочки:
– scas адрес_приёмника
– scasb
– scasw
– scasd
4) загрузка элемента из цепочки:
– lods адрес_источника
– lodsb
– lodsw
– lodsd
5) сохранение элемента в цепочке:
– stos адрес_приёмника
– stosb
– stows
– stosd
6) получение єлементов цепочки из порта ввода-вывода:
– ins адрес_приёмника, номер_порта
– insb
– insw
– insd
7) вывод элементов цепочки в порт ввода-вывода:
– outs номер_порта, адрес_источника
– outsbs
– outws
– outds
Направление продвижения в цепочке определяется значением флага направления df в регистре eflags/flags.
– если df=0, то значения индексных регистров esi/si и edi/di будут автоматически увеличиваться (операция инкремента) цепочечными командами, то есть обработка будет осуществляться в направлении возрастания адресов;
– если df=1, то значения индексных регистров esi/si и edi/di будут автоматически уменьшаться (операция декремента) цепочечными командами, то есть обработка будет идти в направлении убывания адресов.
Состоянием флага df можно управлять с помощью двух команд, не имеющих операндов:
– cld – очистить флаг направления. Команда сбрасывает флаг направления df в 0.
– std – установить флаг направления. Команда устанавливает флаг направления df в 1.
Цепочечные команды часто используются совместно с префиксами повторения:
– rep;
– repe или repz;
– repne или repnz.
Данные префиксы могут анализировать состояние регистра ecx/cx или флаг нуля zf.
1) Префикс rep заставляет цепочечные команды выполняться, пока содержимое в есх/сх не станет равным 0. При этом цепочечная команда, перед которой стоит префикс, автоматически уменьшает содержимое есх/сх на единицу.
2) Префиксы repe или repz заставляют цепочечную команду выполняться до тех пор, пока содержимое есх/сх равно 0 или флаг zf равен 1. Как только одно из этих условий нарушается, управление передаётся следующей команде программы.
3) Префиксы repne или repnz заставляют цепочечную команду циклически выполняться пока содержимое есх/сх не равно 0 или флаг zf равен 0. При невыполнении одного из этих условий работа команды прекращается.
Создать массив структур mas_sotr2 worker 7 dup (<>). Инициализировать массив структур в программе. На экран выдать сообщение в окне MessageBoxA. Сообщение должно содержать все данные структуры для самого старшего сотрудника.