Адресное_выражение.имя_поля_структуры
Здесь: адресное_выражение — идентификатор переменной некоторого структурного типа или некое выражение (рис. 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
Лекция №9. Структуры. Записи. Объединения. Работа с файлами. Пример: Выполним копирование поля 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. 8 бит, то есть байт; 2. 16 бит, то есть слово; Бита, то есть двойное слово. Особенность всех цепочечных команд в том, что они, кроме обработки текущего элемента цепочки, осуществляют ещё и автоматическое продвижение к следующему элементу данной цепочки. В системе команд микропроцессора имеются семь операций примитивов обработки цепочек: 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.
Префикс rep заставляет цепочечные команды выполняться, пока содержимое в есх/сх не станет равным 0. При этом цепочечная команда, перед которой стоит префикс, автоматически уменьшает содержимое есх/сх на единицу.
2) Префиксы repe или repz заставляют цепочечную команду выполняться до тех пор, пока содержимое есх/сх равно 0 или флаг zf равен 1. Как только одно из этих условий нарушается, управление передаётся следующей команде программы.
3) Префиксы repne или repnz заставляют цепочечную команду циклически выполняться пока содержимое есх/сх не равно 0 или флаг zf равен 0. При невыполнении одного из этих условий работа команды прекращается. ______________________________________________________ Самостоятельно на практике: Создать массив структур mas_sotr2 worker 7 dup (<>). Инициализировать массив структур в программе. На экран выдать сообщение в окне MessageBoxA. Сообщение должно содержать все данные структуры для самого старшего сотрудника.
Записи
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|