Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Адресное_выражение.имя_поля_структуры




 

Здесь:

адресное_выражение — идентификатор переменной некоторого структурного типа или некое выражение (рис. 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...