А. Цветкова - Информатика и информационные технологии
1) глобальное – общее для всех задач;
2) локальное – отдельное для каждой задачи. Этим разделением и объясняется присутствие в архитектуре микропроцессора следующих системных регистров:
1) регистра таблицы глобальных дескрипторов gdtr (Global Descriptor Table Register), имеющего размер 48 бит и содержащего 32-битовый (биты 16–47) базовый адрес глобальной дескрипторной таблицы GDT и 16-битовое (биты 0—15) значение предела, представляющее собой размер в байтах таблицы GDT;
2) регистра таблицы локальных дескрипторов ldtr (Local Descriptor Table Register), имеющего размер 16 бит и содержащего так называемый селектор дескриптора локальной дескрипторной таблицы LDT. Этот селектор является указателем в таблице GDT, который и описывает сегмент, содержащий локальную дескрипторную таблицу LDT;
3) регистра таблицы дескрипторов прерываний idtr (Interrupt Descriptor Table Register), имеющего размер 48 бит и содержащего 32-битовый (биты 16–47) базовый адрес дескрипторной таблицы прерываний IDT и 16-битовое (биты 0—15) значение предела, представляющее собой размер в байтах таблицы IDT;
4) 16-битового регистра задачи tr (Task Register), который подобно регистру ldtr, содержит селектор, т. е. указатель на дескриптор в таблице GDT. Этот дескриптор описывает текущий сегмент состояния задачи (TSS – Task Segment Status). Этот сегмент создается для каждой задачи в системе, имеет жестко регламентированную структуру и содержит контекст (текущее состояние) задачи. Основное назначение сегментов TSS – сохранять текущее состояние задачи в момент переключения на другую задачу.
46. Регистры отладки
Это очень интересная группа регистров, предназначенных для аппаратной отладки. Средства аппаратной отладки впервые появились в микропроцессоре i486. Аппаратно микропроцессор содержит восемь регистров отладки, но реально из них используются только шесть.
Регистры dr0, dr1, dr2, dr3 имеют разрядность 32 бита и предназначены для задания линейных адресов четырех точек прерывания. Используемый при этом механизм следующий: любой формируемый текущей программой адрес сравнивается с адресами в регистрах dr0 … dr3, и при совпадении генерируется исключение отладки с номером 1.
Регистр dr6 называется регистром состояния отладки. Биты этого регистра устанавливаются в соответствии с причинами, которые вызвали возникновение последнего исключения с номером 1.
Перечислим эти биты и их назначение:
1) b0 – если этот бит установлен в 1, то последнее исключение (прерывание) возникло в результате достижения контрольной точки, определенной в регистре dr0;
2) b1 – аналогично b0, но для контрольной точки в регистре dr1;
3) b2 – аналогично b0, но для контрольной точки в регистре dr2;
4) b3 – аналогично b0, но для контрольной точки в регистре dr3;
5) bd (бит 13) – служит для защиты регистров отладки;
6) bs (бит 14) – устанавливается в 1, если исключение 1 было вызвано состоянием флага tf = 1 в регистре eflags;
7) bt (бит 15) устанавливается в 1, если исключение 1 было вызвано переключением на задачу с установленным битом ловушки в TSS t = 1. Все остальные биты в этом регистре заполняются нулями. Об-работчик исключения 1 по содержимому dr6 должен определить причину, по которой произошло исключение, и выполнить необходимые действия.
Регистр dr7 называется регистром управления отладкой. В нем для каждого из четырех регистров контрольных точек отладки имеются поля, позволяющие уточнить следующие условия, при которых следует сгенерировать прерывание:
1) место регистрации контрольной точки – только в текущей задаче или в любой задаче. Эти биты занимают младшие 8 бит регистра dr7 (по 2 бита на каждую контрольную точку (фактически точку прерывания), задаваемую регистрами dr0, drl, dr2, dr3 соответственно).
Первый бит из каждой пары – это так называемое локальное разрешение; его установка говорит о том, что точка прерывания действует, если она находится в пределах адресного пространства текущей задачи.
Второй бит в каждой паре определяет глобальное разрешение, которое говорит о том, что данная контрольная точка действует в пределах адресных пространств всех задач, находящихся в системе;
2) тип доступа, по которому инициируется прерывание: только при выборке команды, при записи или при записи / чтении данных. Биты, определяющие подобную природу возникновения прерывания, локализуются в старшей части данного регистра. Большинство из системных регистров программно доступно.
47. Структура программы на ассемблере
Программа на ассемблере представляет собой совокупность блоков памяти, называемых сегментами памяти. Программа может состоять из одного или нескольких таких блоков-сегментов. Каждый сегмент содержит совокупность предложений языка, каждое из которых занимает отдельную строку кода программы.
Предложения ассемблера бывают четырех типов.
Команды или инструкции, представляющие собой символические аналоги машинных команд.
В процессе трансляции инструкции ассемблера преобразуются в соответствующие команды системы команд микропроцессора. Одна команда Ассемблера, как правило, соответствует одной команде микропроцессора, что, вообще говоря, является характерным для низкоуровневых языков.
Приведем пример инструкции, которая осуществляет увеличение двоичного числа, хранящегося в регисре eax, на единицу:
inc eax
– макрокоманды – оформляемые определенным образом предложения текста программы, замещаемые во время трансляции другими предложениями.
Примером макрокоманды может служить следующий макрос конца программы:
exit macro
mov ax,4c00h
int 21h
endm
– директивы, являющиеся указанием транслятору ассемблера на выполнение некоторых действий.
У директив нет аналогов в машинном представлении; В качестве примера приведем директиву TITLE, которая задает заголовок файла листинга: %TITLE «Листинг 1»
– строки комментариев, содержащие любые символы, в том числе и буквы русского алфавита. Комментарии игнорируются транслятором. Пример:
; эта строчка является комментарием
48. Синтаксис ассемблера
Предложения, составляющие программу, могут представлять собой синтаксическую конструкцию, соответствующую команде, макрокоманде, директиве или комментарию. Для того чтобы транслятор ассемблера мог распознать их, они должны формироваться по определенным синтаксическим правилам. Для этого лучше всего использовать формальное описание синтаксиса языка наподобие правил грамматики. Наиболее распространенные способы подобного описания языка программирования – синтаксические диаграммы и расширенные формы Бэкуса-Наура. При работе с синтаксическими диаграммами обращайте внимание на направление обхода, указываемое стрелками. Синтаксические диаграммы отражают логику работы транслятора при разборе входных предложений программы.
Допустимые символы:
1) все латинские буквы: A – Z, a – z;
2) цифры от 0 до 9;
3) знаки? @, $, &;
4) разделители.
Лексемами являются следующие.
1. Идентификаторы – последовательности допустимых символов, использующиеся для обозначения кодов операций, имен переменных и названий меток. Идентификатор не может начинаться цифрой.
2. Цепочки символов – последовательности символов, заключенные в одинарные или двойные кавычки.
3. Целые числа.
Возможные типы операторов ассемблера.
1. Арифметические операторы. К ним относятся:
1) унарные «+» и «—»;
2) бинарные «+» и «—»;
3) умножения «*»;
4) целочисленного деления «/»; 5) получения остатка от деления «mod».
2. Операторы сдвига выполняют сдвиг выражения на указанное количество разрядов.
3. Операторы сравнения (возвращают значение «истина» или «ложь») предназначены для формирования логических выражений.
4. Логические операторы выполняют над выражениями побитовые операции.
5. Индексный оператор [].
6. Оператор переопределения типа ptr применяется для переопределения или уточнения типа метки или переменной, определяемых выражением.
7. Оператор переопределения сегмента «:» (двоеточие) заставляет вычислять физический адрес относительно конкретно задаваемой сегментной составляющей.
8. Оператор именования типа структуры «.» (точка) также заставляет транслятор производить определенные вычисления, если он встречается в выражении.
9. Оператор получения сегментной составляющей адреса выражения seg возвращает физический адрес сегмента для выражения, в качестве которого могут выступать метка, переменная, имя сегмента, имя группы или некоторое символическое имя.
10. Оператор получения смещения выражения offset позволяет получить значение смещения выражения в байтах относительно начала того сегмента, в котором выражение определено.
49. Директивы сегментации
Сегментация является частью более общего механизма, связанного с концепцией модульного программирования. Она предполагает унификацию оформления объектных модулей, создаваемых компилятором, в том числе с разных языков программирования. Это позволяет объединять программы, написанные на разных языках. Именно для реализации различных вариантов такого объединения и предназначены операнды в директиве SEGMENT.