Команды управления состоянием микропроцессора.



Управление состоянием процессора

Глава посвящена тому, как наиболее извратно поиздеваться над флагами и словом состоянием процессора.

Строго говоря, изменяя любой бит регистра, программа изменяет состояние процессора, и регистра в частности.

СЛОВО СОСТОЯНИЯ процессора обозначается как CR0. Подсказка в названии "слово" указывает на 16 бит.

Биты:

PE - включение защищённого режима

MP - управление сопроцессором

EM - эмуляция сопроцессора

TS - бит переключения задач

Для процессора 80386 и выше:

PG - включение управления страницами

Отдельная песня, по поводу МАТЕМАТИЧЕСКОГО СОПРОЦЕССОРА. Эта специализированная микросхема предназначена для быстрого выполнения операций с дробными числами (с плавающей запятой). В старших моделях процессоров, кроме того, математический сопроцессор позволяет заметно ускорить обработку мультимедиа-данных.

В моделях, вплоть до 80486, математический сопроцессор был выполнен в виде отдельной микросхемы. 80486SX тоже его не имел (на самом деле он был аппаратно отключен вследствие ошибки Intel, имевшееся рядом гнездо для сопроцессора фактически являлось гнездом самого процессора, разумеется с исправным сопроцессором. :)))))

Кроме того, присутствуют дополнительные регистры: CR2 - линейный адрес ошибки страницы, CR3 - базовый адрес каталога страниц. Что такое страницы, защищённый режим - ещё поговорим.

Регистр флагов FLAGS, как упоминалось ранее, содержит биты, называемые флагами. Флаги указывают на результаты выполнения команд. Но это не значит, что флаги реагируют НА ЛЮБОЙ результат и любую команду. Собственно, сами флаги:

CF) - флаг переноса при вычислениях или операциях сдвига

2(PF) - флаг приоритета (что выполняется первым\последним)

AF) - флаг дополнительного переноса (последний бит младшей тетрады - биты 0...3)

ZF) - флаг нулевого результата

SF) - флаг знака числа. Дублирует старший бит результата.

TF) - флаг трассировки. Полезен при отладке программ.

IF) - флаг разрешения прерываний

DF) - флаг направления (в циклических операциях)

OF) - флаг переполнения при вычислениях.

Все эти флаги частенько используются в программах, и как показывает анализ кода программ, команды проверки условий занимают до 15...20% вычислительной мощности процессора. ;)

Флаги используются, как правило, в командах проверки условий.

 

Моделирование структурных типов данных в Ассемблере (строки, векторы, матрицы, записи, структуры). Организация обработки структурных данных.

Массивы

Дадим формальное определение:
массив - структурированный тип данных, состоящий из некоторого числа элементов одного типа.

Описание и инициализация массива в программе

Специальных средств описания массивов в программах ассемблера, конечно, нет. При необходимости использовать массив в программе его нужно моделировать одним из следующих способов:

1. Перечислением элементов массива в поле операндов одной из директив описания данных. При перечислении элементы разделяются запятыми. К примеру:

;массив из 5 элементов.Размер каждогоэлемента 4 байта:mas dd 1,2,3,4,5

2. Используя оператор повторения dup. К примеру:

;массив из 5 нулевых элементов.;Размер каждого элемента 2 байта:mas    dw      5 dup (0)


Такой способ определения используется для резервирования памяти с целью размещения и инициализации элементов массива.

3. Используя директивы label и rept. Пара этих директив может облегчить описание больших массивов в памяти и повысить наглядность такого описания. Директива rept относится к макросредствам языка ассемблера и вызывает повторение указанное число раз строк, заключенных между директивой и строкой endm. К примеру, определим массив байт в области памяти, обозначенной идентификатором mas_b. В данном случае директива label определяет символическое имя mas_b, аналогично тому, как это делают директивы резервирования и инициализации памяти. Достоинство директивы label в том, что она не резервирует память, а лишь определяет характеристики объекта. В данном случае объект — это ячейка памяти. Используя несколько директив label, записанных одна за другой, можно присвоить одной и той же области памяти разные имена и разный тип, что и сделано в следующем фрагменте:

...n=0...mas_b label   bytemas_w label   wordrept    4dw      0f1f0hendm

В результате в памяти будет создана последовательность из четырех слов f1f0. Эту последовательность можно трактовать как массив байт или слов в зависимости от того, какое имя области мы будем использовать в программе — mas_b или mas_w.

Двухмерные массивы

С представлением одномерных массивов в программе на ассемблере и организацией их обработки все достаточно просто. А как быть если программа должна обрабатывать двухмерный массив? Все проблемы возникают по-прежнему из-за того, что специальных средств для описания такого типа данных в ассемблере нет. Двухмерный массив нужно моделировать. На описании самих данных это почти никак не отражается — память под массив выделяется с помощью директив резервирования и инициализации памяти.

Непосредственно моделирование обработки массива производится в сегменте кода, где программист, описывая алгоритм обработки ассемблеру, определяет, что некоторую область памяти необходимо трактовать как двухмерный массив.
При этом вы вольны в выборе того, как понимать расположение элементов двухмерного массива в памяти: по строкам или по столбцам.

Если последовательность однотипных элементов в памяти трактуется как двухмерный массив, расположенный по строкам, то адрес элемента (i, j) вычисляется по формуле

(база + количество_элементов_в_строке * размер_элемента * i+j)

Здесь i = 0...n–1 указывает номер строки, а j = 0...m–1 указывает номер столбца.

Например, пусть имеется массив чисел (размером в 1 байт) mas(i, j) с размерностью 4 на 4
(i= 0...3, j = 0...3):

23      04      05      6705      06      07      9967      08      09      2387      09      00      08

В памяти элементы этого массива будут расположены в следующей последовательности:

23 04 05 67 05 06 07 99 67 08 09 23 87 09 00 08

Если мы хотим трактовать эту последовательность как двухмерный массив, приведенный выше, и извлечь, например, элемент
mas (2, 3) = 23, то проведя нехитрый подсчет, убедимся в правильности наших рассуждений:

Эффективный адрес mas(2, 3) = mas + 4 * 1 * 2 + 3 = mas + 11

Посмотрите на представление массива в памяти и убедитесь, что по этому смещению действительно находится нужный элемент массива.

Организовать адресацию двухмерного массива логично, используя рассмотренную нами ранее базово-индексную адресацию. При этом возможны два основных варианта выбора компонентов для формирования эффективного адреса:

· сочетание прямого адреса, как базового компонента адреса, и двух индексных регистров для хранения индексов:

mov ax,mas[ebx][esi]

· сочетание двух индексных регистров, один из которых является и базовым и индексным одновременно, а другой — только индексным:

mov ax,[ebx][esi]

В программе это будет выглядеть примерно так:

;Фрагмент программы выборки элемента;массива mas(2,3) и его обнуления.datamas    db23,4,5,67,5,6,7,99,67,8,9,23,87,9,0,8i=2j=3.code...mov   si,4*1*imov   di,jmov   al,mas[si][di]     ;в al элемент mas(2,3)...

 

Структуры

По определению структура — это тип данных, состоящий из фиксированного числа элементов разного типа.

Очень важно, чтобы вы с самого начала уяснили, в чем разница между описанием структуры в программе и ее определением.
Описать структуру в программе означает лишь указать ее схему или шаблон; память при этом не выделяется.
Этот шаблон можно рассматривать лишь как информацию для транслятора о расположении полей и их значении по умолчанию.
Определить структуру — значит, дать указание транслятору выделить память и присвоить этой области памяти символическое имя.

Описать структуру в программе можно только один раз, а определить — любое количество раз.

Описание шаблона структуры

Описание шаблона структуры имеет следующий синтаксис:

имя_структуры STRUC<описание полей>имя_структуры ENDS

Здесь <описание полей> представляет собой последовательность директив описания данных db , dw, dd, dq и dt.
Их операнды определяют размер полей и, при необходимости, начальные значения. Этими значениями будут, возможно, инициализироваться соответствующие поля при определении структуры.

Как мы уже отметили при описании шаблона, память не выделяется, так как это всего лишь информация для транслятора.

Местоположение шаблона в программе может быть поизвольным, но, следуя логике работы однопроходного транслятора, он должен быть расположен до того места, где определяется переменная с типом данной структуры. То есть при описании в сегменте данных переменной с типом некоторой структуры ее шаблон необходимо поместить в начале сегмента данных либо перед ним.

Рассмотрим работу со структурами на примере моделирования базы данных о сотрудниках некоторого отдела.
Для простоты, чтобы уйти от проблем преобразования информации при вводе, условимся, что все поля символьные.
Определим структуру записи этой базы данных следующим шаблоном:


Дата добавления: 2020-01-07; просмотров: 370; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!