Лекция 1 Определение ассемблера; программа на ассемблере; основные функции ассемблера; структура объектного модуля.

Презентация:



Advertisements
Похожие презентации
М.Ю. Харламов, ВНУ им. В.Даля, Алфавит (словарь) V Алфавит (словарь) V– это непустое конечное множество элементов (символов) Цепочка в алфавите.
Advertisements

Лекция 4 Программирование на Паскале. Элементы языка Турбо Паскаль 7.0. Типы данных. Управляющие конструкции.
Троицкий Д.И. Лингвистическое и программное обеспечение САПР 1 Классификация грамматик и языков Лекция 9 Кафедра «Автоматизированные станочные системы»
Директивы сегментации. Упрощенные директивы сегментации. Лекция доцента кафедры ИВТ ГрГУ кандидата технических наук Ливак Е.Н.
КЛАССИФИКАЦИЯ ГРАММАТИК И ЯЗЫКОВ ( КЛАССИФИКАЦИЯ ХОМСКОГО ) Рейн Т. С.
Лекция 7 Управление памятью Сегментная, страничная и сегментно- страничная организация памяти.
Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
ПРЕЗЕНТАЦИЯ НА ТЕМУ: ПРЕЗЕНТАЦИЯ НА ТЕМУ: ВИДЫ ТРАНСЛЯЦИИ Составил: Ревнивцев М.В Преподаватель: Кленина В.И.
Введение в теорию компиляции Основные принципы построения трансляторов.
Определение констант для размещения их компилятором в составе инструкций языка Определение числовых констант: имя = значение PI= V_size = 5 M_size.
Лекция 6. Способы адресации в микропроцессорных системах.
М.Ю. Харламов, ВНУ им. В.Даля, Семантический анализатор Семантический анализатор выполняет следующие основные действия: проверку соблюдения во входной.
М.Ю. Харламов, ВНУ им. В.Даля, Генерация объектного кода это перевод компилятором внутреннего представ­ления исходной программы в цепочку символов.
Глава 6. УПРАВЛЯЮЩИЕ СТРУКТУРЫ Оператор присваивания Простой и составной операторы Условный оператор Оператор множественного выбора Оператор цикла с предусловием.
Физические модели баз данных Файловые структуры, используемые для хранения информации в базах данных.
М.Ю. Харламов, ВНУ им. В.Даля, Транслятор Транслятор - это программа, которая переводит программу на исходном (входном) языке в эквивалентную ей.
Лекция 8 Область видимости Время жизни. Область видимости Область видимости – характеристика именованного объекта Область видимости - часть текста программы,
Язык программирования Pascal. Программа это упорядоченный список команд, необходимых для решения некоторой задачи. Языком программирования называют систему.
Программирование на Ассемблер к.т.н., доц. Красов А.В. Лекция 6 ФакультетМТС Курс3 Семестр6 Форма контролязачет Лекции14 часов Лабораторные работы12 часов.
1 Диаграммы реализации (implementation diagrams).
Транксрипт:

Лекция 1 Определение ассемблера; программа на ассемблере; основные функции ассемблера; структура объектного модуля.

Литература 1. Л. Бек. Введение в системное программирование – М:Мир, 1988; 2. В. Юров. Assembler, практикум – СПб:Питер, 2001; 3. А.Молчанов. Системное программное обеспечение. Учебник для вузов – СПб:Питер, 2003; 4. А.Молчанов. Системное программное обеспечение. Лабораторный практикум – СПб:Питер, 2005.

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

ОСНОВНЫЕ ФУНКЦИИ АССЕМБЛЕРА: 1. Преобразование мнемонических кодов в их эквиваленты на машинном языке; 2. Преобразование символических операндов в эквивалентные им машинные адреса; 3. Построение машинных команд; 4. Преобразование констант во внутреннее представление; 5. Формирование и запись объектного модуля; 6. Выдача листинга.

Листинг программы Turbo Assembler Version /03/09 22:37:15 Page 1 first.ASM model small stack 80h data a1 dw 2h a2 dw 10h code B8 0000s start: mov E D8 mov ds,ax A1 0000r mov ax,a r add ax,a C B8 4C00 mov ax,4c00h 12000F CD 21 int 21h 13 end start

заголовок - содержит имя программы, начальный адрес, длину и определяет структуру программы; тело - содержит машинные команды и данные ; запись конца – отмечает конец программы, определяет точку входа. Структура объектного модуля

Функции двухпроходного ассемблера: 1 просмотр – определение имен Назначение адресов для всех предложений исходной программы; запоминание адресов всех меток в таблице символов; выполнение некоторых директив, связанных с распределение памяти (db, dw, dd, equ, org, assume).

Функции двухпроходного ассемблера: 2 просмотр – трансляция команд и генерация объектного кода Трансляция команд; генерация данных в соответствии с их форматами; выполнение остальных директив транслятора (public, extrn); формирование объектного модуля и листинга.

Реализация 1-го просмотра Определяется начальное значение счетчика адреса Loc; используется таблица кодов операций Optab (код, машинный эквивалент, длина и формат команды) для распределения памяти; создаются таблица символов Symtab (символ, тип, значение) и таблица перекрестных ссылок Cref (ссылка, номера операторов создания и использования).

Реализация 2-го просмотра Используются форматы машинных команд из Optab и адреса ссылок из Symtab для генерации машинных команд; при формировании листинга информация выбирается из Loc, Optab, Symtab и промежуточного файла из 1-го просмотра.

Лекция 2 - Машинно-независимые характеристики ассемблера; - пример ассемблирования программы.

Машинно-независимые функции ассемблера 1. Средства определения имен; 2. Выражения в ассемблере; 3. Сегментирование и связывание программ.

1.Средства определения имен: директивы EQU и ORG Формат: имя EQU выражение где «выражение» - поименованная строковая константа, псевдоним или числовая константа. Пример: blksize equ 512 bufsize equ blksize*4 buflen equ bufsize

Директива ORG Назначение: задание начального значения счетчика адреса или привязки символического имени к адресу Формат: ORG выражение где «Выражение» -константа или символический адрес Пример1: ORG 100h Пример2: start db 100h dup (0) ORG start

2. Составление выражений в ассемблере Используются около 50 операций и директив: скобки (); арифметические операции: +, -, *, /; - «выражение»; двоеточие : - указание префикса замены сегмента, например, mov cx,es:[si+4]; dup – повторение размещения данных; логические операции: and, or, xor; byte, word – определение размера результата выражения, например, 1 байт или 2 байта; Far, near – приписывает атрибут дальности;

Операции в выражениях условные операции: gt, ge, lt,le, eq, nq, eq; Length –возвращение числа байт, выделенных под данные. Пример: msg db hello array db 10 dup(0) L_msg= length msg ; =1 L_array=length array ; =10 seg, offset – выбор сегментной части адреса или смещения; this тип, где тип определяет размер операнда, - создание операнда, адрес которого равен текущему. Пример: p1 equ this word

Операции в выражениях Label – определение символического имени и задание его тип. Пример: p1 Label word тип ptr выражение приписывание выражению указанного типа. Пример, mov byte ptr [si],10

3. Сегментирование и связывание модулей Модули должны быть связаны: -по управлению; -по данным. Средства связи: адрес или аргумент. Аргумент - это ссылка на некоторые данные, которые требуются для выполнения функции данного модуля, но размещены вне этого модуля. Аргументы делятся на формальные и фактические. Замещение формального параметра в модуле происходит за счет передачи в него соответствующего фактического аргумента.

Способы передачи аргумента в модуль через регистр; через общую память ; через стек; с помощью директив extrn и public.

3. Сегментирование программ Используются директивы: segment; ends; assume; public; extrn; model,.data,.code,.stack и т.д.

Пример связывания двух модулей. Start–процедура, определенная в A1.asm и вызываемая в главном модуле A2.asm A1.asm.code Public start Start proc near ………. Ret Start endp end start A2.asm.code extrn start:near entry proc far Mov Mov ds,ax Call start Ret entry endp end entry

Замечания к примеру Т.к. имена сегментов в модулях одинаковы, то: можно в А1 не загружать ds; процедура Start может быть near.

Листинг программы Turbo Assembler Version /03/09 22:37:15 Page 1 first.ASM model small stack 80h data a1 dw a a2 dw code B8 0000s start: mov E D8mov ds,ax A1 0000rmov ax,a r add ax,a C B8 4C00mov ax,4c00h 12000F CD 21int 21h 13 end start

Листинг программы (таблица символов) Turbo Assembler Version /03/09 22:37:15 Page 2 Symbol Table Symbol NameType Value Cref(defined at #) ??DATEText "03/03/09" ??FILENAMEText "first" ??TIMEText "22:37:15" ??VERSIONNumber 0 _TEXT #1 #1 0 _TEXT #3 DGROUP # H 2 DGROUP 2 #3 #6 A1Word DGROUP:0000 #4 9 A2Word DGROUP:0002 #5 10 STARTNear _TEXT:0000 #7 13

Описание сегментов и групп Groups & Segments Bit Size Align Combine Class DGROUPGroup STACK ParaStackSTACK _DATA WordPublicDATA _TEXT WordPublicCODE

MAP-файл Start Stop Length Name Class 00000H 00010H 00011H _TEXT CODE 00020H 00023H 00004H _DATA DATA 00030H 000AFH 00080H STACK STACK Program entry point at 0000:0000

Лекция 3 Машинно-зависимые функции ассемблера; Встроенные имена TASM.

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

форматы машинных команд и данных Ассемблер генерирует машинные команды и данные в форматах, определенных для конкретного типа ЭВМ. Адреса могут быть 16- или 32-разрядные.

2. Способы адресации Физический адрес памяти представляется в виде: сегмент + смещение. В зависимости от типа операнда возможны варианты : - вычисление смещения прямого адреса, - косвенная адресация, - непосредственный операнд, -указание сегментного регистра по умолчанию или явно. (формирование байта mod r/m, префиксов)

Формирование адреса перехода Зависит от: типа операнда в команде перехода; указания перед адресом модификатора. При этом адрес перехода находится: в команде (прямой переход); в регистре или ячейке памяти (косвенный).

Модификаторы near ptr и far ptr для прямого перехода ; word ptr и dword ptr для косвенного перехода. Пример для команды безусловного перехода jmp: формат команды: jmp [модификатор] адрес_перехода

Внутрисегментный переход: прямой короткий m1: Jmp short ptr m2; m1, m2 - 1байт ….….. (m2-m1)127 б m2: Или m1: ; (m1-m2) -128 б ….….. m2: Jmp short ptr m1;

Внутрисегментный переход: прямой ((m2-m1) >128) m1: ….. m2: jmp m1; адрес-2 байта

Косвенный внутрисегментный переход (адрес-2байта) Lea bx,m1; или.data Jmp [bx]Addr_m1 dw m1 ………….. m1:.code ….. Jmp addr_m1

Прямой межсегментный переход S1 segmentS2 segment ……….…….. Jmp far ptr m2m2: ……..…… S1 endsS2 ends

3. Информация о перемещении Объектная программа, содержащая информацию о модификации адресов, называется перемещаемой. При трансляции определяются относительные адреса операндов; Транслятор не знает фактический адрес загрузки, следовательно не может настроить адреса; Изменяемые адреса должны быть помечены при трансляции; Транслятор в заголовке объектного модуля формирует информацию для загрузчика о структуре модуля и модификации адресов.

Встроенные имена tasm Turbo Assembler Version /03/09 22:37:15 Page 2 Symbol Table Symbol NameType Value Cref(defined at #) ??DATEText "03/03/09" ??FILENAMEText "first" ??TIMEText "22:37:15" ??VERSIONNumber 0 _TEXT #1 #1 0 _TEXT #3 DGROUP # H 2 DGROUP 2 #3 #6 A1Word DGROUP:0000 #4 9 A2Word DGROUP:0002 #5 10 STARTNear _TEXT:0000 #7 13

Типы встроенных имен Текстовое значение пример: nnn db ??time; Числовое значение Пример: if ??version gt 100h переменная-псевдоним, т.е. синоним имени Пример: assume

Примеры встроенных имен tasm $ - счетчик адреса, служит для ссылки на его текущее - альтернативное имя - определяет модель памяти для кодового сегмента: 0 - small,compact (ближний указатель на процедуру) 1 - для всех остальных (дальний указатель - псевдоним текущего - определяет модель памяти для данных: 0 - tiny, small. Встроенные переменные начинаются с «??», псевдонимы - с

Лекция 4 Структура заголовка obj-файла; Опции TASM; Макропроцессор.

Структура записи заголовка obj-файла для macro assembler and Microsoft C Compiler Заголовок состоит из записей переменной длины |ДлинаСодержимое | | BYTEТип записи | | WORD Число байт в записи, включая | | контрольную сумму, но не включая | | тип записи | |.... Данные записи.... | | (смотреть подробно описание типов) | | BYTEконтрольная сумма |

Байт типа записи |80Module name| |8AEnd of module| |8CExternal symbols | |8E| |90Public symbols| |92| |94Line number info | |96Segment/Group symbols| |98Info for specific seg| |9AInfo for specific group| |9CRelocation list| |9E| |A0Segment data| |A2Duplicated Segment Data|

Пример: запись описания Public- ссылок (90) Для каждой ссылки - своя запись. Формат полей данных : | BYTEZero| | BYTESegment number in which symbol| | is defined| | BYTELength of symbol | |(Length) | I BYTES Public Symbol Name | | WORDOffset where symbol defined| | BYTEZero|

Запись спецификации сегмента (98) Запись определяет атрибуты комбинирования, границу выравнивания для сегмента | BYTEКомбинирование/выравнивание |определяется побитно как 0AAXPS00| |где AA тип выравнивания:| |00=AT специфическое | | выравнивание | |01=BYTE граница| |10=WORD граница| |11=PARAGRAPH граница| | X неизвестен, | | P public- сегмент, | | S stack- сегментt, | | WORD Размер сегмента в байах| | BYTE Номер сегмента | | BYTE | | BYTEОбычно 1 |

Опции tasm Формат команды: TASM [опции] имя_asm [,имя_obj] [,имя_lst] [,имя_crf] или TASM имя_asm [,имя_obj] [,имя_lst] [,имя_crf] [опции] или TASM имя_asm,,, [опции]

Опции tasm При распределении памяти ассемблер размещает сегменты : - в алфавитном порядке имен сегментов; - в порядке их описания в программе. /а – установить алфавитный порядок следования сегментов; /s – установить порядок следования сегментов как в исходном коде ( по умолчанию); /с – вставить таблицы перекрестных ссылок (cref) в листинг;

Опции tasm (продолжение) /dsym[=val] - определить символ sym=0 или sym= значение val; пример: tasm abc.asm /dmax=10 /dmin=0 /jдиректива - определить начальную директиву ассеблера; пример: tasm abc.asm /jjumps /iпуть – установить путь включаемых файлов; пример: tasm abc /id:\include

Опции tasm (продолжение) /l – сформировать файла листинга (.lst); /h или /? – вывод подсказки; /ml – отличать прописные и строчные символы в именах при анализе операторов программы; /mx – отличать прописные и строчные символы в общих и внешних именах; /mu – преобразовать все символы в именах в прописные; /m[число_проходов] - max число проходов, обычно tasm– однопроходный, по умолчанию - 5; пример: tasm /m2 abc

Опции tasm (продолжение) /n - не включать таблицу символов в листинг; /t - не показывать сообщения об успешной трансляции; /zi - помещать отладочную информацию в объектный файл для турбо-отладчика.

Макропроцессоры Процесс замены макрокоманды в исходном модуле на соответствующую группу операторов называется макрорасширением. Выполняется макропроцессором. Используются в разных языках, например, в СИ++: #define width 80 Основная функция макропроцессора – замена одной группы символов на другую. Механизм его работы не связан с архитектурой ЭВМ.

Однопросмотровый макропроцессор Для выполнения макрорасширения макропроцессор строит три таблицы: макроопределений DEFTAB (прототипы и тела макроопределения); имен макроопределений (для каждого имени – указатели на начало и конец в DEFTAB); аргументов для каждого макроопределения (заполняется при распознавании макрокоманд);

Особенности макропроцессора: генерация уникальных меток (LOCAL); объединение параметров (&); условные макрорасширения (if, ifb, ifnb и др.) ; ключевые параметры (REQ); макрооперации; вложенные макросы (ведется счетчик уровня вложенности).

Лекция 5 Оверлеи в ассемблере

Оверлейные структуры программ Оверлейная программа имеет древовидную структуру: Для оверлейной программы не создается PSP. main A DE B FK C

Вызов оверлея в ассемблере Вызов из одной программы другой выполняется через int 21h с функцией 4Вh. Данная функция загружает в память программу без передачи управления на ее точку входа. Способ вызова задается в регистре al: 0 - программа; 3 – оверлей. Исходные данные в момент вызова: ds:dx - указывает на строку, содержащую путь к файлу оверлея, в коде asciiz; es:bx - указывает на блок параметров ebp размером в 4 байта.

Блок параметров (ebp) состоит из двух полей по 2 байта: адрес загрузки оверлея (номер параграфа); Фактор привязки адресов.

Выделение памяти под оверлей Существует два способа: системный запрос через int 21h с функцией 48h; в bx записывается требуемое число параграфов, в ax выдается начальный адрес выделенного блока; выделение памяти в программе.

Фактор привязки Определяет константу (сегментную часть адреса) для модификации адресов оверлея после его загрузки в память

Лекция 6 Загрузчики; функции абсолютного загрузчика; машинно-зависимые функции загрузчика.

Основные понятия Загрузчик - системная программа, выполняющая загрузку программы пользователя. Загрузка - процесс, обеспечивающий размещение программы в оперативной памяти для использования.

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

Функции загрузчиков и редакторов связи Загрузчики выполняют функции: перемещения; загрузки. Редакторы связи выполняют функции: перемещения; связывания; загрузки.

Загрузчики Общая схема обработки программы: Загрузочный модуль Исполнительный модуль

Функции абсолютного загрузчика 1. запись объектной программы в ОП; 2. передача управления на адрес начала ее исполнения. Последовательность действий: -определить размер программы ( из заголовка); -разместить объектный код по заданному адресу; -определить точку входа (из записи-конца) и передать на нее управление.

Машинно-зависимые функции загрузчика Загрузчики, обеспечивающие перемещение программ называются относительными или перемещающими. Основные функции: перемещение; связывание.

Функция перемещения (1) Модификация адреса заключается в добавлении к нему начального адреса загрузки программы. Способы передачи информации о перемещении: 1. создание специальной записи - модификатора, которая задает начальный адрес и длину изменяемого поля; например, в MS DOS создается таблица настройки адресов

Функция перемещения (2) 2. создание маски перемещения; с каждым словом программы связан разряд перемещения, все разряды образуют маску. Пример: маска F F C из 12 разрядов Маска хранится вместе с объектным модулем.

Функция перемещения (3) 3. Аппаратные средства перемещения. Все ссылки по памяти рассматриваются как относительные с базовым адресом, Например, в процессорах фирмы intel, в машинах IBM 370

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

Функция связывания I просмотр - разрешение внешних ссылок, распределение памяти; II просмотр – перемещение и связывание программ, загрузка в память. Рассмотрим на примере объединения трех модулей A,B,C.

I просмотр – распределение памяти А extrn B1 адрес_A=адрес_загр public A1 call B1 A1 proc ………… B public B1 адрес_B=адрес_A+длина_А B1 proc ………….. extrn A1 адрес_C= адрес_B+ длина_B C call A1

Таблица внешних символов ИмяАдресНач. адрес сегмента Длина сегмента А0000: L_a A10000:хххх0000 B1----:---- Btextb:0000bbbbL_b B1textb:yyyybbbb CccccL_c

Таблица внешних символов ИмяАдресНач. адрес сегмента Длина сегмента А0000: L_a A10000:хххх0000 B1textb:yyyybbbb Btextb:0000bbbbL_b B1textb:yyyybbbb CccccL_c

Лекция 7 атрибуты директивы segment; машинно-независимые функции загрузчика: автопоиск; управление процессом загрузки; оверлейные структуры.

Директива segment Формат: имя segment атрибуты Пример: АВС segment para public code Атрибуты: выравнивание, комбинирования, класс сегмента, размер сегмента 1) выравнивание: границы - byte (1б), word (2б), para (16б), page (256б), mempage (4кб);

Атрибут директивы segment - комбинирование 2) Комбинирование – показывает как комбинировать одноименные сегменты. Принимает значения: PRIVATE - не объединять; PUBLIC – объединять; COMMON - располагать по одному адресу; AT ХХХ - располагать по абсолютному адресу параграфа ХХХ; STACK – соединять все сегменты и вычислять адрес относительно SS.

Атрибуты директивы segment - класс сегмента и размер сегмента 3) класс сегмента – определяет порядок следования сегментов при собирании ; 4) размер сегмента – влияет на порядок формирования физического адреса: use16, use32. Замечание. Все сегменты в группе используют один и тот же начальный адрес (группа определяются через директиву GROUP).

Машинно-независимые функции загрузчика 1. Автопоиск в библиотеках; 2. Управление процессом загрузки; 3. Оверлейные структуры.

1. Автопоиск в библиотеках Библиотека состоит из оглавления и разделов. Библиотеки подключаются с помощью специальных директив или параметров. Пример : # include - поиск в стандартной библиотеке; #include ABC.h - поиск в текущей директории

Пример: автопоиск в СИ Стандартные библиотеки используются автоматически. Директории obj-файлов задаются в меню Options/Directories/Output directory. Последовательность поиска файлов в директориях - в порядке перечисления, текущая просматривается в последнюю очередь. Для подключения других библиотек их имена задаются в меню Options/Directories/Library directories

Возможны варианты: а) дополнительные входные файлы загрузчика; б) опции редактора связей; в) управление выходной информацией. 2. Управление процессом загрузки

2а). Дополнительные входные файлы загрузчика Задание дополнительных параметров, позволяющих изменить стандартный процесс загрузки. Для этого используются: специальный командный язык, например, include имя_модуля delete имя_модуля отдельный файл.

Файл проекта в СИ В СИ для придания свойств зависимой трансляции используется специальный технологический прием: для каждого модуля составляется файл - заголовок (header) с описанием экспортируемых объектов. header вставляется в текст каждого модуля - импортера при помощи препроцессора.

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

Файл-проект (.PRJ) содержит: перечень всех исходных модулей и используемых на этапе сборки библиотек и OBJ- файлов; зависимости между файлами (т.е. необходимость перетрансляции одного при изменении другого. Используется: при собирании программы командой Link, для поддержки автоматической согласованности модулей при помощи команд Make и Build.

Команды, используемые в среде ВСС при компоновке модулей: make - перекомпилирует все файлы проекта, для которых нет obj- файлов или дата устарела; build - компилирует все файлы, которые указаны в файле-проекте; Обе команды по завершении запускают link. link – из obj – файлов и стандартных библиотек создает exe –файл. Все команды работают с текущим именем проекта из меню Project/project name.

2б). Опции загрузчика В турбо Pascal: Опции команды tlink рассмотрим позже. Options LinkerMap fileOff Segments Publics details Link bufferDisk memory

2в). Управление выходной информацией В среде TurboPascal в меню compile/ destination есть переключатели: disk - загрузочный модуль сохранять на диске; mem - загрузочный модуль оставить в оперативной памяти.

3. Оверлейная структура программ Древовидная структура программ. Узлы дерева называются сегментами. Корневой сегмент загружается в ОП сразу и остается до окончания выполнения программы, остальные – при обращении к ним. Процесс – это программа, которая выполняется под управлением OS. Он состоит из кодов программы, данных и информации о состоянии процесса.

Управление процессами в Си Можно управлять процессом из программы, используя функции управления процессом. Прототипы объявлены в process.h Функции SPAWN и EXEC создают новый процесс. SPAWN возвращает управление из порожденного процесса к родителю, а EXEC – нет. Ключи компилятора для оверлея: BCC –Y имя_глав_прог -Yo список_вспом_модулей

Лекция 8 Опции TLINK; структура exe - файла; загрузка DOS-приложений; COM-программы.

Формат команды TLINK TLINK obj-файлы[,exe-файл][,map- файл][,lib-файл] Местоположение опций в команде: tlink /опции... или tlink obj-файл……. /опции

Опции команды TLINK /x - отменяет формирование map-файла; /m - в map включить имена с атрибутом public; /s - подробная карта сегментов; /i – инициализировать все сегменты; /l – включить номера строк исходного кода;

Опции TLINK /n - не использовать стандартные библиотеки; /d - предупреждение о дубликатах имен библиотеках; /с - регистр букв в символьных именах имеет значение; /3 – обработка 32-разрядных сегментов кода; /v {+/-} - включить/отключить отладочную информацию для всех символических имен (/v+ или /v-) ; /t - создать загрузочный модуль в виде com- файла; /оn - создать оверлей n-го уровня.

Response-файл Response-файл – это текстовый файл, который содержит параметры для компоновщика tlink. При вызове его имя указывается Например, создан файл fr: Main wd+ tx,fin fmap Lib1 lib2 Вызов:

Структура exe-файла EXE-файл строится компоновщиком и состоит из двух частей: заголовок загрузочного модуля; тело загрузочного модуля (или образ задачи). Заголовок - управляющая информация для загрузки. Он состоит из двух частей: -стандартной; -переменной.

Стандартная часть заголовка

Смещение от начала загрузочного модуля Содержание 00-01Подпись компоновщика (4D5А) 02-03Длина образа задачи по модулю 512 (число байт в последнем блоке) 04-05Длина файла в блоках по 512 байт 06-07Число элементов таблицы настройки адресов 08-09Длина заголовка в параграфах

0А-0ВМинимальный объем памяти, который нужно выделить после конца образа задачи 0С-0DМаксимум объем памяти, который нужно выделить после конца образа задачи 0E-0FЗначение сегментного регистра SS 10-11Значение SP 12-13Контрольная сумма 14-15Значение регистра IP при входе в задачу 16-17Регистр CS 18-19Адрес первого элемента таблицы настройки адресов (THA) относительно начала файла 1A-1BНомер сегмента перекрытий 20Таблица настройки адресов

Таблица настройки адресов (THA) Имеет переменную длину. Количество элементов ТНА задано в заголовке файла по смещению Каждый элемент занимает 4 байта: 2 байта – смещение адреса настройки; 2 байта – сегментная часть адреса.

Настройка адресов 1. В области памяти, выделенной для загрузки программы, строится PSP. 2. Стандартная часть заголовка файла считывается в рабочую область памяти. 3. Определяется длина тела загрузочного модуля по данным из заголовка. 4. Определяется сегментный адрес загрузки программы ( адрес начального сегмента). 5. Загрузочный модуль считывается в начальный сегмент.

Настройка адресов (продолжение) 5. THA порциями считываются в рабочую область. 6. Для каждого элемента к полю сегмента прибавляется базовый сегментный адрес. По этому адресу в памяти прибавляют тот же базовый адрес. 7. Устанавливаются значения сегментных регистров (ip и sp, cs и ss, es и ds ). 8. Управление передается по адресу CS:IP

Загрузка DOS-программ. При запуске программы ОС выполняет следующие действия: выделяет память (операцию 48h); размещает в начальном сегменте PSP; загружает программу функцией Exec (4Вh для 21h прерывания); устанавливает значения системных регистров; освобождает неиспользуемую память функцией 49h.

Особенности COM - файлов Занимают один физический сегмент памяти; не требуют привязки адресов, т.к. хранятся том виде, в котором загружаются в память; не имеют заголовка; все адреса вычисляются относительно начала кодового сегмента.

Правила написания COM - программ первый оператор программы ORG 100h; в директиве assume все сегментные регистры указывают на один и тот же сегмент; данные программы размещают в конце кодового сегмента после команд возврата управления системе; стековый сегмент не определяют; редактируют программу с ключем: tlink /t имя

Лекция 9 Обнаружение ошибок при передачи информации; терминология Windows; настраивающий и динамический загрузчики; форматы Win-файлов; отличительные особенности программирования под Win32.

Обнаружение ошибок при передачи информации Существуют методы обнаружения ошибок целостности информации, основанные на избыточности информации: посимвольный контроль четности (поперечный); поблочный контроль четности (продольный); вычисление контрольных сумм; контроль цикличности избыточным кодом (CRC).

Терминoлогия Windows Модулем называют программу, данные и ресурсы, которые собираются в определенный файл. Модуль является представлением в памяти информации, находящейся в файле на диске. Эта информация считывается в память и из нее создается модуль. Выполняемый модуль – один из источников модуля.Он имеет сегменты кода, данных и ресурсы. Другой источник – dll-файл.

DLL Динамически подключаемые библиотеки (dynamic link libraries, DLL) являются хранилищем общедоступных процедур в среде Windows. Структурно dll представляет собой обычную программу, включающую специфические элементы, например код инициализации.

Код инициализации Выполняет необходимые действия по инициализации dll-библиотек при наступлении определенных событий. Наличие необязательно. Если есть, то разрабатывается с учетом определенных требований.

DLL-файл DLL-файл необязательно имеет расширение dll. Примеры DLL : файлы шрифтов.fon и.fot, хотя содержат только ресурсы; драйверы устройств (.drv); файлы ядра Windows (user.exe, krnlx86.exe, gdi.exe). Важно, чтобы exe и dll были в формате выполняемого файла (NE, PE). Такой формат определяет отдельные сегменты. Каждый сегмент может быть размещен и загружен отдельно от других.

Типы загрузчиков: настраивающий и динамический. Настраивающий загрузчик Статическое связывание происходит тогда, когда редактор связей может найти адрес вызова в указанных obj или lib – файлах. В адресную часть команды помещается корректный адрес. Далее запись настройки не нужна.

Динамический загрузчик Динамическое связывание происходит тогда, когда редактор связей не может знать адрес вызова в настраиваемой команде. Настройки адресов не выполняются до тех пор, пока нужная программа или dll не загрузится в память. Динамическое связывание выполняет внутренняя функция SegReloc() модуля KERNEL, вызываемая функцией loadModule(). Редактор связей помещает информацию в exe- или dll-файлы, указывая загрузчику Win настройки, которые необходимо выполнить. Загрузчик Win выполнит все настройки в сегменте во время загрузки этого модуля в память.

Форматы выполняемых файлов для Win-приложений. Старый заголовок oldheader СмещениеПояснения 00Ms dos-заголовок (32 б). 20Резерв 28 б 3сАдрес информационного заголовка WININFO 3ерезерв 40Программа-заглушка

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

WINHEADER 00WININFO infoheader (64б) –указатели на таблицы файла: 1. Таблица сегментов 2. Таблица ресурсов 3. Таблица резидентных имен 4. Таблица ссылок на модули 5. Таблица импортированных имен 6. Таблица входов 7. Таблица нерезидентных имен 8. Сегменты кода и данных

Пояснения к таблицам 1,2 1. Таблица сегментов содержит характеристики сегментов кода и данных (смещение, длину, минимальный размер выделяемый сегменту). 2. Таблица ресурсов. Ресурсы создаются редактором ресурсов. Компилируются во внутреннее представление в файл.RES, затем копируются компоновщиков в exe-файл.

Пояснения к таблицам Таблица резидентных имен. Перечислены все экспортируемые функции файла. 4. Таблица ссылок на модули - просто список смещений, адресующий в файле имена импортируемых модулей. 5. Таблица импортированных имен - имена модулей, используемых exe- файлом. 6. Таблица входов. Все элементы таблицы точек входов пронумерованы, начиная с 1. Эти целочисленные номера используются для ссылки на точки входа другими модулями.

Пояснения к таблицам 7,8 7. Таблица нерезидентных имен экспортируемых функций исполняемого модуля. 8. Сегменты кода и данных. В конце – таблица настройки адресов.

Типы исполняемых файлов 1. NE ( New Executable) – 16-битное приложение. Размер сегмента 64 кб. Из программ можно вызывать функции DOS через вызов спец. функции Dos3Call. Их называют «сегментированными выполняемыми файлами. Не поддерживается в Win XP. 2. PE (Portable Executable) – 32-битное приложение Win32 и dll. Модель памяти flat, размер сегмента кода и данных до 4 гб.

Отличительные особенности DOS- программ от Windows-приложений. Характеристика Win32 DOS 1. Обращение к сервису ОСВызов функции API Механизм прерывания 2. Передача параметров через регистры при обращении к сервису ОС нет есть 3. Возврат результирующих Значений через регистры общего назначения и регистр флагов нет есть 4. Работа непосредственно с аппаратным уровнем нет есть 5. Модели памяти Flat Tiny, small… 6. Режим работы процессораЗащитный режимРеальный режим 7.РесурсыЧерез б-ки импорта нет

Особенности программирования на ассемблере под Win32 1. Отсутствует startup кода. 2. Гибкая система адресация памяти. 3. Доступность больших объемов виртуальной памяти. 4. Развитый сервис ОС, разнообразие API- функций. 5. Многообразие и доступность средств созданий интерфейса с пользователем. 6. Развитие средств ассемблера, аналогичных ЯВУ: а)макроопределения вызова процедур; б)возможность введения шаблонов процедур.

Лекция 10 Формальные языки и грамматики; форма Бэкуса – Наура; распознаватели.

Цепочка символов и ее длина Цепочка символов – произвольная упорядоченная конечная последовательность символов, записанных один за другим. Обозначается:α, β, γ. Упорядоченная последовательность символов, следовательно, цепочка определяется составом символов, их количеством и порядком символов. Пример: abc,cba,acb. Количество символов в цепочке α называется длиной цепочки и обозначается |α|.

Операции над цепочками 1. Конкатенация двух цепочек α и β это дописывание второй в конец первой. Обозначается αβ. Пример: если α = аб и β = вг, то αβ=абвг. Обладает свойством ассоциативности: (αβ)γ= α(βγ). Цепочка – конкатенация подцепочек. Не обладает свойством коммутативности: αβ βα. 2. Подстановка (замена) – это замена подцепочки на любую произвольную цепочку. Пример: пусть α = аб и β = вг и γ=αβ. Заменим β на δ = дд. Получим γ = абдд.

Операции над цепочками 3. Обращение цепочки –это запись цепочки в обратном порядке (α R ). Для операции обращения справедливо равенство αβ: (αβ) R = β R α R 4. Итерация цепочки n раз (n >0) – это конкатенация цепочки самой с собой n раз. Пример: α: α 1 =α, α 2 =αα, α 3= ααα. 5. Пустая цепочка λ– это цепочка, не содержащая ни одного символа.

Понятие языка Язык – это заданный набор символов и правил, устанавливающих способы комбинации этих символов для записи осмысленных текстов. Алфавит – это счетное множество допустимых символов языка. Обозначим V. Цепочка α над алфавитом V: α(V), если в нее входят только символы, принадлежащие множеству символов V.

Формальное определение языка Если V - алфавит, то V + - множество всех цепочек над алфавитом V без λ. V* - множество всех цепочек над алфавитом V, включая λ. Справедливо равенство V* =V + {λ}. Языком L над алфавитом V: L(V) называется некоторое счетное подмножество цепочек конечной длины из множества всех цепочек над алфавитом V. Цепочку символов языка называют предложением языка. Из определения: 1) множество цепочек языка не обязательно конечно, 2) длина цепочки ничем неограничена.

Способы задания языков В общем случае для задания языка можно : 1. Перечислить все допустимые цепочки языка. 2. Указать способ порождения цепочек языка (задать грамматику языка). 3. Определить метод распознавания цепочек языка.

Основные определения Синтаксис языка – это набор правил, определяющих допустимые конструкции языка. Он задает набор цепочек символов, которые принадлежат языку. Семантика языка задает смысловое значение предложений языка, т.е. всех допустимых цепочек языка. Лексика – это совокупность слов языка. Лексема – это конструкция, состоящая из элементов алфавита и не содержащая в себе других конструкций. Грамматика – это способ построения предложений языка, т.е. математическая система, определяющая язык.

Формальное определение грамматики Грамматика определяется как совокупность четырех объектов: G={Vt, Vn, P, Z}, Vt - множество терминальных символов грамматики; Vn - множество нетерминальных символов грамматики; P - множество правил грамматики вида αβ; Z - начальный символ языка (входит в множество Vn). Правило (или продукция) – это упорядоченная пара цепочек символов (α,β). Записывается в виде αβ или α::=β. Пример: ::=READ( ) ::=ID|, ID

Примеры грамматик для целых десятичных чисел со знаком G={Vt, Vn, P, Z} G1({0,1,2,3,4,5,6,7,8,9,+,-},{,, }, P1, ), где правила P1: l + l - l 0 l 1 l 2 l 3 l 4 l 5 l 6 l 7 l 8 l 9 G2 ({0,1,2,3,4,5,6,7,8,9,+,-},{S,T,F},P,S), где правила P: S T l +T l -T T F l TF F 0 l 1 l 2 l 3 l 4 l 5 l 6 l 7 l 8 l 9

Форма Бэкуса - Наура Во множестве правил грамматики могут быть несколько правил, определяющих одинаковые левые части: αβ 1, αβ 2, αβ 3, … αβ n. Тогда эти правила объединяются: αβ 1 lβ 2 l β 3 … l β n. Такую форму записи называют ФБН. В ней все нетерминальные символы берутся в угловые скобки, например, ::=READ( )

Другие способы задания правил грамматики 1. Использование метасимволов: ( ) – означает, что в данном месте может стоять только одна цепочка; [ ] – цепочка необязательна; { } – цепочка может не встречаться, быть 1 раз или много раз. 2. Запись в графической форме виде диаграмм.

Распознаватели Распознаватель - это специальный автомат для определения принадлежности цепочки символов некоторому языку. Задача распознавателя – по исходной цепочке определить ее принадлежность заданному языку. Распознаватели – это один из способов определения языка. Они являются частью компилятора.

Компоненты распознавателя 1. Лента для входной цепочки и считывающая головка; 2. Устройство управления (УУ), которое имеет набор состояний и конечную память; 3. Внешняя (рабочая) память.

Операции распознавателя Чтение очередного символа; сдвиг входной цепочки на заданное число символов (вправо или влево); доступ к рабочей памяти для чтения или записи информации; преобразование информации в памяти, изменение состояния УУ.

Начальное и конечное состояние распознавателя Начальная конфигурация - головка на первом символе, внешняя память пуста или содержит определенную информацию); конечные конфигурации - головка за концом цепочки. Распознаватель допускает входную цепочку символов, если из начальной конфигурации может перейти в одну из конечных за определенное число тактов (шагов).

Лекция 11 Виды распознавателей; Классификация грамматик по Хомскому; Классификация языков; Классификация распознавателей; Цепочки вывода.

Виды распознавателей в зависимости от типа считывающего устройства: Односторонние и двусторонние. Односторонние (левосторонние) – считывают цепочку слева направо без возврата назад. Двусторонние – допускают перемещение по ленте от начала к концу и возврат назад к уже прочитанным символам.

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

Виды распознавателей в зависимости от типа внешней памяти (ВП): без внешней памяти - используется только конечная память УУ; с ограниченной внешней памятью - размер ВП зависит от длины входной цепочки. Зависимость - линейная, полиномиальная, экспоненциальная. Организация ВП - стек, очередь, список. с неограниченной внешней памятью - ВП с произвольным методом доступа.

Задача разбора текста программ На основании имеющейся грамматики некоторого языка построить распознаватель этого языка. Заданная грамматики и распознаватель должны быть эквиваленты, т.е. определять один и тот же язык. Распознаватель должен установить тип ошибки в программе и место ее возникновения.

Классификация грамматик по Хомскому (по структуре их правил): тип 0 – с фразовой зависимостью G={Vt, Vn, P, Z}, V= Vt Vn, правила вида: αβ, где α V +,β V*. Самый общий тип. Практического применения не имеет. Т

Классификация грамматик по Хомскому - тип 1 контекстно-зависимые (КЗ), правила вида: α1Аα2 α1βα2, где α1,α2 V*, А Vn, β V +, нетерминальный символ может заменяться цепочкой символов в зависимости от контекста: неукорачивающие грамматики, правила вида: α β, где α,β V +, lβllαl.

Классификация грамматик по Хомскому тип 2 - контекстно-свободные (КС), правила вида: А β, где А Vn, β V +. Их иногда называют неукорачивающими (НКС). Почти эквивалентный им класс – укорачивающие КС - грамматики (УКС). Разница – в правой части правил УКС может быть пустая цепочка. Используются при описании синтаксических конструкций языков программирования.

Классификация грамматик по Хомскому - тип 3 - регулярные грамматики. Для левосторонних правила: АВγ или Аγ, где А,В Vn, γ Vt*, Для правосторонних правила: АγВ или Аγ, где А,В Vn, γ Vt*. Используются для описания простейших конструкций (идентификаторов, констант).

Классификация языков Тип языка выбирается по максимально возможному типу грамматики. Тип 0 – с фразовой зависимостью. Для распознавания цепочек требуются очень мощные вычислительные ресурсы, аналогичные машине Тьюринга. Тип 1 – контекстно-зависимые (КЗ). Время распознавания зависит экспоненциально от длины цепочки символов. В компиляторах не используются.

Классификация языков Тип 2 -контекстно-свободные (КС). Лежат в основе синтаксических конструкций ЯП. Время распознавания зависит от длины цепочки символов полиномиально (2, 3 степень). Тип 3 - регулярные языки. Самых используемый тип в ВС. На их основе строятся языки ассемблеров, командные процессоры. Время распознавания линейно зависит от длины цепочки символов.

Классификация распознавателей (по сложности алгоритма работы в зависимости от типа языка) Недетерминированный двусторонний автомат с неограниченной ВП для языков с фразовой зависимостью (тип 0). Недетерминированный двусторонний автомат с линейно ограниченной ВП для контекстно-зависимых языков (тип 1).

Классификация распознавателей Недетерминированный односторонний автомат с магазинной (стековой) ВП (МП - автомат) и детерминированный односторонний автомат с магазинной (стековой) ВП (ДМП–автомат) для контекстно-свободных языков (тип 2). Недетерминированный односторонний автомат без ВП (конечный автомат КА) для регулярных языков (тип 3).

Примеры грамматик для целых десятичных чисел со знаком G={Vt, Vn, P, Z} G1({0,1,2,3,4,5,6,7,8,9,+,-},{S,T,F},P1,S), где правила P1: S T l +T l -T T F l TF F 0 l 1 l 2 l 3 l 4 l 5 l 6 l 7 l 8 l 9 G2({0,1,2,3,4,5,6,7,8,9,+,-},{S,T},P2,S), где правила P2: S T l +T l -T T 0 l 1 l 2 l 3 l 4 l 5 l 6 l 7 l 8 l 9 l 0Т l 1Т l 2Т l 3Т l 4Т l 5Т l 6Т l 7Т l 8Т l 9Т Грамматика G1 относится к типу 2, G2 - к типу 3. Язык L, заданный G1, G2 относится к типу 3.

Вывод Выводом называется процесс порождения предложений языка на основе правил грамматики, определяющей язык. Цепочка β=δ 1 γδ 2 называется непосредственно выводимой из цепочки α=δ 1 ωδ 2 в грамматике G={Vt, Vn, P,S}, V= Vt Vn, δ 1,γ,δ 2 V*,ω V +, если в грамматике G правило : ωγ Р. Обозначается: α β.

Цепочка вывода Цепочка β называется выводимой из цепочки α (α * β), если выполняется одно из условий: β непосредственно выводима из α (α β); такая γ, что γ выводима из α и β непосредственно выводима из γ (α *γ и γ β). Последовательность непосредственно выводимых цепочек называется цепочкой вывода. Если вывод выполняется за несколько шагов, то β называется нетривиально выводимой (α +β).

Сентенциальная форма грамматики Вывод называется законченным, если на основе цепочки β, полученной в результате вывода, нельзя больше сделать ни одного шага вывода. Цепочка β называется конечной. Цепочка α называется сентенциальной формой грамматики, если она выводима из целевого символа грамматики S: S * α. Язык L, заданный грамматикой G, - это множество всех конечных сентенциальных форм грамматики.

Эквивалентность грамматик Две грамматики G1,G2 называются эквивалентными, если эквивалентны заданные ими языки L(G1)=L(G2). Они имеют пересекающиеся Vt 1, Vt 2 (Vt 1 Vt 2 ), а Vn 1, Vn 2, P 1, P 2, S 1, S 2 могут сильно отличаться. Пример: G1({0,1,2,3,4,5,6,7,8,9,+,-},{S,T,F},P1,S) G2({0,1,2,3,4,5,6,7,8,9,+,-},{S,T},P2,S)

Лекция 12 Трансляторы, компиляторы, интерпретаторы; Основные функции компилятора; Лексический анализ; Синтаксический разбор; Семантический контроль.

Определения Транслятор – программа, которая переводит программу с исходного языка в эквивалентную ей программу на результирующем языке. Компилятор – транслятор, который переводит исходную программу в эквивалентную ей программу на машинном языке. Интерпретатор - программа, которая воспринимает исходную программу на входном языка и выполняет ее.

Задача компилятора Задача компилятора состоит в поиске соответствия предложений исходного текста грамматическим структурам языка и генерации соответствующего кода для каждого предложения.

Основные функции компилятора Лексический анализ – это распознавание и классификация лексем. Синтаксический разбор – это анализ входных предложений на соответствие конструкциям языка программирования. Семантический контроль смысловой контроль предложений. Генерация объектного кода.

Схема работы компилятора

Лексический анализ Определение программы на языке Pascal: ::=PROGRAM VAR BEGIN END.

Лексический анализ. Упрощенная грамматика Pascal

Синтаксическое дерево для оператора

Синтаксическое дерево

Таблица кодов лексем Лексема код PROGRAM 1 VAR 2 BEGIN 3 END. 4 ; 5 INTEGER 6 READ 7 …… … ID 22 Пример программы на языке Pascal: PROGRAM TEST; VAR SUM: INTEGER; BEGIN READ (SUM); END.

Таблица лексического разбора Строка исходной Тип лексемы Спецификатор программы лексемы ^TEST ^SUM

Таблица идентификаторов. Состав информации 1. Для переменных: Имя; тип данных; область памяти, связанная с переменной. 2. Для констант: значение; тип данных. 3. Для функций: имя; количество и типы формальных аргументов; тип возвращаемого аргумента; адрес кода функции.

Учет особенностей языка программирования В языке СИ: i+++j анализируется как (i++)+(j), а не (i)+(++j); В Фортране: do 10 i=1,10 – оператор цикла; do 10 i=1.10 – оператор присваивания; do 10 i – идентификатор; do 10 i=1 – неоднозначная конструкция.

2. Синтаксический анализ Используются: матрица предшествования; дерево грамматического разбора.

Матрица предшествования для грамматики языка Pascal

Методы грамматического разбора В соответствии с порядком построения дерева грамматического разбора: 1. Нисходящие (сверху вниз). Начинают с корня дерева, и наращивают узлы дерева в соответствии с синтаксисом. 2. Восходящие (снизу вверх). Начинают с конечных узлов дерева (листьев), и пытаются объединить их (в соответствии с синтаксисом) для построения узлов более высокого уровня, пока не достигнут корня дерева.

Метод операторного предшествования (восходящий) Анализ пар последовательно расположенных операторов. Устанавливаются отношения предшествования между любыми терминальными символами (лексемами):,, = Отношения предшествования должны были заданы однозначно. Пример: А+В*С-D 1). + * 2). * - Тогда для выражения отношения предшествования:, т.е. В*С выполняется ранее других.

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

Пример разбора предложения методом операторного предшествования READ ( ID ) = Выбирается фрагмент, заключенный в для распознавания в терминах грамматики. ID – нетерминальный символ, обозначим. Операции отношения устанавливаются между терм. символами, т.е. между ( и ). Получим READ ( ), эта конструкция соответствует правилу вывода, обозначим его.

Лекция 13 Машинно-зависимые особенности компилятора; машинно-независимые особенности – распределение памяти под переменные.

Машинно-зависимые особенности Машинно-зависимая оптимизация; Генерация кода.

Генерация кода Выполняется на основе дерева грамматического разбора. Для каждой грамматической конструкции определен алгоритм генерации кода. Подпрограммы находятся в стандартной библиотеке компилятора. После генерации каждого фрагмента, модифицируется указатель свободной памяти (счетчик адреса). Все фрагменты объектной программы связываются редактором связей.

Машинно-зависимая оптимизация Выполняется с использованием промежуточной формы программы, которая может реализована, например, в виде 3-х адресных команд: КОП Операнд1 Операнд2 Результат Операторы переставляются для исключения ненужных операций запоминания и загрузки регистров. Однако, не все зависит от компилятора. Pentium II до 70% времени тратит на анализ, декодирование и вычисление границ инструкций.

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

Подробнее о некоторых способах. Оптимизация исполнительных цепей. Оптимизацировали исполнительные цепи так, чтобы большее число команд исполнялось за один такт процессора. Вводилиь новые инструкции и векторные операции ( технологии MMX и 3DNew). К настоящему моменту CISC и RISC архитектуры процессоров исчерпали себя, достигнув сопоставимой производительности.

Сравнение архитектур процессоров CISC (complex instruction set) процессоры выполяют инструкцию за 3 такта. Особенности: малое количество регистров; сложные команды переменной длины; сложное поле адресации; правила оптимизации сложные, со многими исключениями. Лучшие компиляторы используют потенциал процессора наполовину.

Сравнение архитектур процессоров RISC (reduced instruction set) процессоры – за 1 такт до четырех команд. много регистров общего назначения; небольшой набор инструкций; однозначные методы оптимизации. Недостаток - отсутствие совместимости с предшествующими типами процессоров.

Суперскалярную архитектура У Pentium Pro два конвейера. Однако, распараллеливание потока команд не всегда эффективно. Например: movax,1234hmovax,1234h adddx,ax movcx,333h movcx,333hadddx,ax addbx,cxaddbx,cx

Параллелизм в микропроцессорах EPIC (explicitly parallel instruction) архитектура. Положена в основу 64- разрядных процессоров. Заимствовала лучшие идеи RISC и CISC архитектур: фиксированная длина инструкций; ограниченное число адресаций памяти; жесткое разбиение команд на группы. Это позволяет объединять инструкции в слова для параллельного исполнения и гарантирует непротиворечивость ситуации.

Многопроцессорные системы Присутствуют в любом компьютере, имеются сопроцессоры для управления: графикой на графической карте; на кэш-контроллере ЖД; заданиями для вывода на печать. Роль OS. Существует два направления: Симметричная (с сервером) – OS выполняет блокировку и активизацию списка задач; ассимметричная за каждым процессором закреплена определенная функция.

Машинно-независимые особенности Распределение памяти; Структурированные переменные; Машинно-независимая оптимизация кода; Использование блочных конструкций языка программирования.

Распределение памяти Статический метод; Динамический. Сначала о статическом методе, при котором выделение памяти происходит на стадии компиляции программы.

Для переменных и констант транслятору необходимо знать: описание и определение; область видимости (диапазон доступа): время жизни (связывание); Рассмотрим на примере языка С++. Описание задает тип переменной. Определение указывает сущность, к которой переменная относится ( объем памяти, значение, функция).

Описание переменных Пример: ОписаниеСущность Char ch;Объем памяти int count=1;Объем памяти Const double = ;значение float real (complex*p) {return p re;}; функция

Диапазон доступа Определяет как далеко конкретное имявидно в единице трансляции. Локальный – переменная известна в пределах блока ее определения (автоматические переменные); Глобальный – известна во всем файле, начиная с места определения (статические); Диапазон доступа прототипа функции – в пределах круглых скобок, содержащих аргументы;

Диапазон доступа (продолжение) Диапазон доступа класса – для переменных, объявленных в классе; Диапазон доступа пространства имен. Эти два – только для С++.

Связывание Определяет способ использования имени в единицах трансляции: внешнее – в разных файлах; внутреннее – в пределах одного файла; без связывания - имена автоматических переменных.

Лекция 14 Структурированные переменные; машинно-независимая оптимизации; обработка блочных конструкций языка программирования.

Классы памяти переменных. Автоматические переменные Это переменные, объявленные внутри блока или функции. Они создаются в момент передачи управления функции или блоку. Память освобождается при выходе из функции или блока. Пример: int main ( ) { int a=5; { int b=10; ……. } } Переменные размещаются в стеке или регистре. Ключевые слова: auto, register

Классы памяти переменных. Статические переменные. Это переменные, объявленные вне определения функции или с ключевым словом static. Существуют в течение всего времени выполнения программы. Переменные могут иметь 3 типа связывания: внутреннее, внешнее и без связывания.

Примеры переменных статического класса с разным типом связывания Внешнее связывание: int global=100; int main ( ) { ….. }

Примеры статических переменных Внутреннее связывание: Static int abc=100; int main ( ) { ….. } Без связывания: void funct (int n) {Static int c=100; ….. }

Константы Пример: Const float pi=3.14; константа, определенная таким образом, часто не занимает память, т.е. может использоваться как непосредственный операнд. Константа инициируется при ее описании.

Способы хранения переменных Описание способа хранения Класс памяти Диапазон доступа Связы- вание Место объявления Автоматич. блокНетВ блоке Регистро- вый Автоматич.блокНетВ блоке с register Статич. без связывания Статическ.блокНетВ блоке с static Статич. с внеш. связ. Статическ.файлВнеш.Вне функции Статич. с внутр. связ. Статическ.файлВнутр.Вне функции с static

Динамическое распределение памяти Для выделения и освобождения памяти используются операторы: new ( в С – malloc() ) и delete. К таким переменным неприменимы правила диапазона доступа и связывания. Заключение. При работе с переменными компилятор выделяет три фрагмента памяти: для автоматических, статических и динамических переменных.

Структурированные переменные Структурированные переменные –это массивы, строки, записи, множества, например, char abc[2][3], float array [10]. Для многомерных массивов в языках программирования существуют разные методы их хранения в памяти – по строкам (в Си) или по столбцам (в Фортране). Для переменных границ массивов компилятор образует описатель массива.

Машинно-независимая оптимизация кода реализована в виде опций компилятора удаление общих подвыражений; удаление инвариантов циклов; например, for (int m=1; m

Обработка блочных конструкций языка программирования Пример: PROCEDURE A; VAR I,J,K: INTEGER; …….. PROCEDURE B; VAR X,Y: REAL; ……. END {B}; ……. END {A}; ……….

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

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

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

Отладчики Отладчик – это программный модуль, позволяющий проводить мониторинг процесса выполнения результирующей прикладной программы. Основные возможности: пошаговое выполнение; выполнение до достижения одной из заданных точек останова (адреса останова); выполнение до наступления заданных условий, связанных с данными и адресами4 просмотр содержимого областей памяти.

Развитие отладчиков определялось: появлением интегрированных сред программирования; появлением возможностей аппаратной поддержки средств отладки во многих системах программирования.